现在的位置: 首页 > 综合 > 正文

实例:SSH整合Maven实现图片的添加与查询显示

2017年10月11日 ⁄ 综合 ⁄ 共 16337字 ⁄ 字号 评论关闭

      使用SSH框架,并且结合Maven来实现图片的添加与查询显示功能。

      1、整个功能的结构如图所示:在Java类中包含了action(控制层)、model(模型层)、service(接口)、serviceImpl(接口的实现类),还包括Spring的配置文件applicationContext.xml,Spring依赖注入配置文件applicationContext_bean.xml,Spring对数据库链接的配置文件applicationContext_db.xml,Struts2的配置文件struts.xml,初始化工程配置信息的web.xml,Maven的配置文件pom.xml。还包括添加图片页码inputphoto.jsp,添加图片成功页面add_success.jsp,查询图片outputphoto.jsp,显示查询出的页面out.jsp。

      

     

2、配置pom.xml文件,导入SSH的jar包。如果你没有用到Maven技术,这一步可以跳过不用看。但是你要用合适的方法导入SSh的jar包。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion><!-- 版本号,自己定义 -->
	<groupId>price</groupId>  <!-- 组的ID -->
	<artifactId>photo</artifactId><!-- 此工程对应的ID,一个 groupId下面可以有多个不同名的artifactId-->
	<packaging>war</packaging>  <!-- 有jar和war。war定义工程,定义为jar可以被其他的工程引用 -->
	<version>0.0.1-SNAPSHOT</version>
	<name>photo Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<build>
		<finalName>photo</finalName>  <!-- 工程名 -->
	</build>
	<dependencies>
		<!-- struts包 -->
		<!-- struts2核心包 -->
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.3.4</version>
		</dependency>
        <!-- struts2与spring整合的包 -->
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-spring-plugin</artifactId>
			<version>2.3.4</version>
		</dependency>
        <!-- 在 Struts2中要使用 Ajax获得Json数据。要使用Ajax必须引用此Jar -->
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-json-plugin</artifactId>
			<version>2.3.4</version>
		</dependency>

		<!-- Hibernate包 -->
		<!-- Hibernate核心包 -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>3.5.6-Final</version>
		</dependency>
		<!-- spring3可选的依赖注入,不可缺少 -->
		<dependency>
			<groupId>aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.5.3</version>
		</dependency>
		<!-- 扩展Java类与实现Java接口 -->
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib</artifactId>
			<version>2.1_3</version>
		</dependency>
        <!-- 运用Log4j必须用到这个包 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.6.1</version>
			<scope>compile</scope>
		</dependency>

		<!-- Spring包 -->
		<!-- Spring核心包 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring</artifactId>
			<version>2.5.6</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<!-- Spring在WEB上的MVC框架上加上这个包 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>2.5.6</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>


		<!-- 数据源、驱动、日志、工具类包 -->
		<!-- log4j日志包 -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.16</version>
			<scope>compile</scope>
		</dependency>
		
		<!-- jsp接口 -->
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<!-- JDBC连接池 -->
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.2</version>
		</dependency>

        <!-- Oracle数据库JDBC连接包 -->
		<dependency>
			<groupId>private.oracle</groupId>
			<artifactId>ojdbc</artifactId>
			<version>10.2.0.2.0</version>
			<scope>compile</scope>
		</dependency>
        <!-- servlet接口 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.4</version>
			<scope>provided</scope>
		</dependency>

	</dependencies>

</project>

    

3、配置web.xml文件初始化工程配置信息,主要包括配置Struts2过滤器和Spring监听和定位applicationContext.xml的物理位置。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- Sttuts2过滤器 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- 监听器Spring -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener> 

	<!-- 定位applicationContext.xml的物理位置 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>

</web-app>

4、配置applicationContext.xml的文件,指向依赖注入的Spring文件和数据库配置的Spring文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd


http://www.springframework.org/schema/context


http://www.springframework.org/schema/context/spring-context-2.5.xsd

           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">



<import resource="applicationContext_bean.xml"/>
<import resource="applicationContext_db.xml"/>
</beans>

5、在Oracle中表创建表Photo,包含2个字段:主键ID类型为VARCHAR2(20),存储照片的字段ZP类型为BLOB。



6、在Model中创建类Photo.java

package model;

public class Photo {
	private String  id;//ID主键
	private byte[] zp;//照片
	
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public byte[] getZp() {
		return zp;
	}

	public void setZp(byte[] zp) {
		this.zp = zp;
	}
	
}

7、根据Photo.java产生映射文件Photo.hbm.xml文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2013-5-3 20:42:59 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
	<class name="model.Photo" table="PHOTO">
		<id name="id" type="java.lang.String">
			<column name="ID" />
			<generator class="assigned" />
		</id>
		<property name="zp">
			<column name="ZP" />
		</property>
	</class>
</hibernate-mapping>

8、配置applicationContext_db.xml文件以连接Oracle数据库

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd


http://www.springframework.org/schema/context


http://www.springframework.org/schema/context/spring-context-2.5.xsd

           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

	<!-- 用Bean定义数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<!-- 定义数据库驱动 -->
		<property name="driverClass">
			<value>oracle.jdbc.driver.OracleDriver</value>
		</property>
		<!-- 定义数据库URL -->
		<property name="jdbcUrl">
			<value>jdbc:oracle:thin:@localhost:1521:orcl</value>
		</property>
		<!-- 定义数据库的用户名 -->
		<property name="user">
			<value>lhq</value>
		</property>
		<!-- 定义数据库的密码 -->
		<property name="password">
			<value>lhq</value>
		</property>
		<property name="minPoolSize">
			<value>1</value>
		</property>
		<property name="maxPoolSize">
			<value>40</value>
		</property>
		<property name="maxIdleTime">
			<value>1800</value>
		</property>
		<property name="acquireIncrement">
			<value>2</value>
		</property>
		<property name="maxStatements">
			<value>0</value>
		</property>
		<property name="initialPoolSize">
			<value>2</value>
		</property>
		<property name="idleConnectionTestPeriod">
			<value>1800</value>
		</property>
		<property name="acquireRetryAttempts">
			<value>30</value>
		</property>
		<property name="breakAfterAcquireFailure">
			<value>true</value>
		</property>
		<property name="testConnectionOnCheckout">
			<value>false</value>
		</property>

	</bean>

	<!--定义Hibernate的SessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!-- 定义SessionFactory必须注入dataSource -->
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<!-- 定义Hibernate的SessionFactory属性 -->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.Oracle10gDialect
				</prop>
			</props>
		</property>
		<!-- 定义POJO的映射文件 -->
		<property name="mappingResources">
			<list>
				<value>model/Photo.hbm.xml</value>  <!-- Hibernate的映射文件 -->
			</list>
		</property>
	</bean>


	<!-- 配置事务拦截器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED" /><!-- 接口实现类的方法,命名必须以这些开头才有效 -->
			<tx:method name="find*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="*" propagation="SUPPORTS" read-only="true" />
		</tx:attributes>
	</tx:advice>

	<aop:config>
		<aop:pointcut id="interceptorPointCuts"
			expression="execution(* PhotoServiceImpl..*.*(..))" /><!-- 接口实现类的路径 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />
	</aop:config>

</beans>

9、编写接口PhotoService.java

package service;
import model.Photo;

public interface PhotoService {
	// 插入照片
	public void save(Photo photo);
	//根据ID查询照片
	public Photo find(String xh);
}


10、编写接口的实现类PhotoServiceImpl.java

package serviceimpl;

import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import service.PhotoService;

import model.Photo;

public class PhotoServiceImpl extends HibernateDaoSupport implements  PhotoService{

	public void save(Photo photo) {
		this.getHibernateTemplate().save(photo);//保存照片
		
	}

	public Photo find(String xh) {//根据ID 获取照片信息
		List list=this.getHibernateTemplate().find("from Photo where id=?",xh);
		if(list.size()>0)
			return (Photo) list.get(0);
		else
		return null;
	}

}


11、用applicationContext_bean.xml配置实现依赖注入

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd


http://www.springframework.org/schema/context


http://www.springframework.org/schema/context/spring-context-2.5.xsd

           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

    <!-- 业务层Service -->
	<bean id="photoService" class="serviceimpl.PhotoServiceImpl">
		<property name="sessionFactory">
			<ref bean="sessionFactory"></ref>
		</property>
	</bean>
   <!-- 控制层Action -->
	<bean id="PhotoAction" class="action.PhotoAction">
		<property name="photoServices">
			 <ref bean="photoService" />
		</property>
	</bean>
	
</beans>

12、编写控制层PhotoAction.java

package action;

import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import java.util.Map;
import javax.imageio.stream.FileImageInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import model.Photo;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import service.PhotoService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;


public class PhotoAction extends ActionSupport {
	private Photo photo;
	private PhotoService photoServices;//接口photoServices依赖注入  photoServices的名称必须和application_bean中名称一致
	private File zpfile;//文档,存放照片
	
	//插入id和照片
    public String addPhoto() throws Exception{
    	Photo stu=new Photo();
    	stu.setId(photo.getId());//ID主键
    	
    	System.out.println("照片");
    	if(this.getZpfile()!=null){//照片处理
    		FileInputStream fis=new FileInputStream((File) this.getZpfile());
    		byte[] buffer=new byte[fis.available()];
    		fis.read(buffer);
    		stu.setZp(buffer);
    	}

    	photoServices.save(stu);//保存信息
    	return SUCCESS;
    }
    
    //根据ID获取照片
	public String findPhoto() throws Exception {
		String zp = photo.getId();
		Photo zhaopian = photoServices.find(zp);
		Map request = (Map) ActionContext.getContext().get("request");
		request.put("photo", zhaopian);
		return SUCCESS;
	}
    
	//获取图片
	public String getImage() throws Exception {
		HttpServletResponse response = ServletActionContext.getResponse();
		String zp = photo.getId();//获取照片Id
		Photo photos = photoServices.find(zp);//根据Id获取照片
		byte[] img = photos.getZp();//获照片
		response.setContentType("image/jpeg");
		ServletOutputStream os = response.getOutputStream();
		if (img != null && img.length != 0) {//输出照片
			for (int i = 0; i < img.length; i++) {
				os.write(img[i]);
			}
			os.flush();
		}
		return NONE;

	}


	public Object getZpfile() {
		return zpfile;
	}

	public void setZpfile(File zpfile) {
		this.zpfile = zpfile;
	}

   

	public Photo getPhoto() {
		return photo;
	}

	public void setPhoto(Photo photo) {
		this.photo = photo;
	}

	public PhotoService getPhotoServices() {
		return photoServices;
	}

	public void setPhotoServices(PhotoService photoServices) {
		this.photoServices = photoServices;
	}

   


}

13、编写图片添加页码inputphoto.jsp

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body bgcolor="#d9dfaa">
    <hr width="700" align="left">
	<h3>插入照片</h3>
	
	<s:form action="addPhoto" method="post" enctype="multipart/form-data">
		<table border="0" cellpadding="1" cellspacing="0">
			<tr>
				<td><s:textfield name="photo.id" label="照片ID" value=""></s:textfield>
				</td>
			</tr>
			<tr>
				<td><s:file name="zpfile" label="照片" value=""></s:file></td>
			</tr>
		</table>
		<p>
			<input type="submit" value="添加"> 
			<input type="reset"  value="重置">
	</s:form>

    <hr width="700" align="left">
</body>
</html>

14、编程图片添加成功页码add_success.jsp

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body bgcolor="#d9dfaa">
添加成功
</body>
</html>

15、编写图片查询页码

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body bgcolor="#d9dfaa">
    <hr width="700" align="left">
	<h3>查询图片</h3>
	
	<s:form action="findPhoto" method="post">
		<table border="0" cellpadding="1" cellspacing="0">
			<tr>
				<td><s:textfield name="photo.id" label="照片ID" value=""></s:textfield>
				</td>
			</tr>
		</table>
		<p>
			<input type="submit" value="确定"> 
			<input type="reset"	 value="重置">
	</s:form>
    <hr width="700" align="left">
</body>
</html>

16、编写图片现实页码out.jsp

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body bgcolor="#d9dfaa">
	<h3>输出照片:</h3>
	<s:set name="photo" value="#request.photo"></s:set>
	<s:form action="photoInfo.action" method="post">
		<table border="0" cellpadding="5">
			<tr>
				<td>照片ID:</td>
				<td width="100"><s:property value="#photo.id" /></td>
			</tr>
			<tr>
			    <td>照片:</td>
				<td rowspan="6"><img
					src="getImage.action?photo.id=<s:property value="#photo.id"/>" with="300" height="400"><!-- 根据情况调整照片大小 -->
					</td>
			</tr>
		</table>
	</s:form>
</body>
</html>

17、开启工程进行测试,输入网址:http://localhost:8080/photo/inputphoto.jsp可见到如图所示:



18、输入一个没有重复的ID主键,并且选择一张图片

19、打开对应的Oracle数据库表,找到Photo这张表,点击ZP字段



20、打开页面http://localhost:8080/photo/outputphoto.jsp 输入刚才插入的照片ID:123




21、实现功能,到此结束。

抱歉!评论已关闭.