这个Web应用很简单,就是实现一个用户注册页面,当用户在register.jsp页面输入注册信息,点保存,如果成功,进入registerSuccess.jsp页面。这个应用虽然很小,但它也有三层组成,表示层由Struts框架负责,业务层由Spring框架负责,持久层由Hibernate框架负责。
开发环境:MyEclipse 5+ MySQL4 + Struts1.3.5 + Spring2.0.1 + Hibernate3.2.1 + Tomcat5.0.19 + jdk1.4.2_06.
1. 首先,我们在MyEclipse中新建一个Web Project ,login;
2.然后把Struts,Spring,Hibernate框架所需要的jar包以及MySQL的驱动拷贝到WEB-INF\lib下;
3.创建用户注册页面register.jsp
1
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
2
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
3
<html>
4
5
<head>
6
<title><bean:message key="register.title"/></title>
7
</head>
8
9
<body>
10
<html:errors />
11
<html:form action="register.do">
12
<table >
13
<tr>
14
<td><bean:message key="register.username"/>:</td>
15
<td><html:text property="register.username" /></td>
16
</tr>
17
<tr>
18
<td><bean:message key="register.password"/>:</td>
19
<td><html:password property="register.password" /></td>
20
</tr>
21
<tr>
22
<td><bean:message key="register.email"/>:</td>
23
<td><html:text property="register.email" /></td>
24
</tr>
25
<tr>
26
<td colspan="2" align="center">
27
<html:submit><bean:message key="register.submit"/></html:submit>
28
</td>
29
</tr>
30
</table>
31
</html:form>
32
</body>
33
34
</html>
4.创建注册成功后显示的页面registerSuccess.jsp
1
<%@ taglib uri=" http://struts.apache.org/tags-bean " prefix="bean" %>
2
<html>
3
4
<head>
5
<title><bean:message key="register.title"/></title>
6
</head>
7
8
<body>
9
<bean:message key="register.success"/>
10
</body>
11
12
</html>
13
5. 创建消息资源文件registermessages.properties
1
register.title = Register
2
register.username = UserName
3
register.password = Password
4
register.email = Email
5
register.submit = Submit
6
register.success = RegisterSuccess!
7
6. 由于我们使用动态ActionForm,只需在Struts-config.xml中配置与register.jsp页面中form对应的ActionForm。
7. 创建配置文件Struts-config.xml
1
<?xml version="1.0" encoding="iso-8859-1"?>
2
<!DOCTYPE struts-config PUBLIC
3
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
4
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
5
<!--
6
Default configuration file for examples application.
7
Each module also has its own struts-config under: /WEB-INF/$MODULE/
8
@version $Revision: 1.9 $ $Date: 2006-02-13 18:39:49 -0700 (Mon, 13 Feb 2006) $
9
-->
10
<struts-config>
11
<form-beans >
12
<!—配置register.jsp中form对应的ActionFrom-->
13
<form-bean name="registerForm" type="org.apache.struts.action.DynaActionForm" >
14
<form-property name="register" type="test.register.entity.Register"/>
15
</form-bean>
16
</form-beans>
17
<!—配置对Struts Action请求的代理-->
18
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
19
<!—配置register.jsp中form对应的Action-->
20
<action-mappings >
21
<action
22
name="registerForm"
23
path="/register"
24
scope="request"
25
type="test.register.action.RegisterAction"
26
validate="false"
27
input="register.jsp">
28
<forward name="success" path="/registerSuccess.jsp" />
29
</action>
30
</action-mappings>
31
32
<message-resources parameter="test.register.registermessages" />
33
<!—配置插件,让action能访问sping容器-->
34
<plug-in
35
className="org.springframework.web.struts.ContextLoaderPlugIn">
36
<set-property property="contextConfigLocation"
37
value="/WEB-INF/action-servlets.xml" />
38
</plug-in>
39
40
</struts-config>
41
8. 创建实体类Register.java
1
package test.register.entity;
2
3
import java.io.Serializable;
4
5
publicclass Register implements Serializable
{
6
privatestaticfinallongserialVersionUID = 1521645755684977819L;
7
private Long id;
8
private String username;
9
private String password;
10
private String email;
11
12
public Register()
{
13
14
}
15
16
public String getEmail()
{
17
returnemail;
18
}
19
20
publicvoid setEmail(String email)
{
21
this.email = email;
22
}
23
24
public Long getId()
{
25
returnid;
26
}
27
28
publicvoid setId(Long id)
{
29
this.id = id;
30
}
31
32
public String getPassword()
{
33
returnpassword;
34
}
35
36
publicvoid setPassword(String password)
{
37
this.password = password;
38
}
39
40
public String getUsername()
{
41
returnusername;
42
}
43
44
publicvoid setUsername(String username)
{
45
this.username = username;
46
}
47
48
49
50
}
51
9.创建Hibernate映射文件,Register.hbm.xml
1
<?xml version="1.0"?>
2
<!DOCTYPE hibernate-mapping PUBLIC
3
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
5
<hibernate-mapping
6
package="test.register.entity">
7
8
<class name="Register" table="REGISTER">
9
10
<id name="id">
11
<generator class="native"/>
12
</id>
13
14
<property name="username"
15
not-null="true"
16
length="15"
17
column="USERNAME"/>
18
19
<property name="password"
20
not-null="true"
21
length="15"
22
column="PASSWORD"/>
23
24
<property name="email"
25
not-null="true"
26
length="15"
27
column="EMAIL"/>
28
29
</class>
30
31
</hibernate-mapping>
32
9. 创建Spring配置文件applicationContext.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
3
4
<beans>
5
6
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
7
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
8
<property name="url" value="jdbc:mysql://localhost/register"/>
9
<property name="username" value="root"/>
10
<property name="password" value="root"/>
11
</bean>
12
13
<!-- Hibernate SessionFactory -->
14
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
15
<property name="dataSource" ref="dataSource"/>
16
<property name="mappingDirectoryLocations">
17
<value>classpath:test\register\entity\</value>
18
</property>
19
<property name="hibernateProperties">
20
<props>
21
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
22
<prop key="hibernate.show_sql">true</prop>
23
<prop key="hibernate.generate_statistics">true</prop>
24
</props>
25
</property>
26
</bean>
27
28
<bean id="registerDAO" class="test.register.dao.RegisterDAO">
29
<property name="sessionFactory">
30
<ref local="sessionFactory"/>
31
</property>
32
</bean>
33
34
<bean id="registerService" class="test.register.service.RegisterService">
35
<property name="registerDAO">
36
<ref local="registerDAO"/>
37
</property>
38
</bean>
39
40
</beans>
41
10. 创建数据访问对象RegisterDAO.java
1
package test.register.dao;
2
3
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
4
5
import test.register.entity.Register;
6
7
publicclass RegisterDAO extends HibernateDaoSupport
{
8
9
public Register saveRegister(Register r)
{
10
try
{
11
this.getHibernateTemplate().saveOrUpdate(r);
12
return r;
13
}catch (Exception e)
{
14
e.printStackTrace();
15
returnnull;
16
}
17
}
18
}
19
12.创建服务对象RegisterService.java
1
package test.register.service;
2
3
import test.register.dao.RegisterDAO;
4
import test.register.entity.Register;
5
6
publicclass RegisterService
{
7
private RegisterDAO registerDAO;
8
9
publicRegisterDAO getRegisterDAO()
{
10
returnregisterDAO;
11
}
12
13
publicvoid setRegisterDAO(RegisterDAO registerDAO)
{
14
this.registerDAO = registerDAO;
15
}
16
17
public Register saveRegister(Register r)
{
18
this.getRegisterDAO().saveRegister(r);
19
return r;
20
}
21
}
22
11. 创建web.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<!DOCTYPE web-app PUBLIC
3
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
4
"http://java.sun.com/dtd/web-app_2_3.dtd">
5
<web-app>
6
<context-param>
7
<param-name>contextConfigLocation</param-name>
8
<param-value>/WEB-INF/applicationContext.xml</param-value>
9
</context-param>
10
<listener>
11
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
12
</listener>
13
<servlet>
14
<servlet-name>action</servlet-name>
15
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
16
<init-param>
17
<param-name>config</param-name>
18
<param-value>/WEB-INF/struts-config.xml</param-value>
19
</init-param>
20
<init-param>
21
<param-name>debug</param-name>
22
<param-value>3</param-value>
23
</init-param>
24
<init-param>
25
<param-name>detail</param-name>
26
<param-value>3</param-value>
27
</init-param>
28
<load-on-startup>0</load-on-startup>
29
</servlet>
30
31
<servlet-mapping>
32
<servlet-name>action</servlet-name>
33
<url-pattern>*.do</url-pattern>
34
</servlet-mapping>
35
36
<welcome-file-list>
37
<welcome-file>register.jsp</welcome-file>
38
</welcome-file-list>
39
40
</web-app>
41
14.创建RegisterAction.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import test.register.entity.Register;
import test.register.service.RegisterService;

publicclass RegisterAction extends Action
{
private RegisterService registerService;

public RegisterService getRegisterService()
{
returnregisterService;
}

publicvoid setRegisterService(RegisterService registerService)
{
this.registerService = registerService;
}
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)

throws Exception
{
Register r = (Register)((DynaActionForm)form).get("register");
getRegisterService().saveRegister(r);
return mapping.findForward("success");
}
}

在RegisterAction.java中,为了获取spring容器中的RegisterService对象,我们要对struts-config.xml作下修改,具体修改如下:
在struts-config.xml增加controller元素
<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
目的告诉Struts自动将对Action的请求委托给Spring上下文中的Struts Action来处理。
并且为了让Struts能访问Spring容器,还必须在struts-config.xml注册一个能访问Spring上下文的插件:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/action-servlets.xml" />
</plug-in>

action-servlets.xml文件的具体内容如下:
1
<?xml version="1.0" encoding="UTF-8"?>
2
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
3
4
<beans>
5
<bean name="/register" class="test.register.action.RegisterAction">
6
<property name="registerService" ref="registerService"/>
7
</bean>
8
</beans>
9
注意:这里bean是name属性,而不是id。
至此,一个完整的SSH(Struts,Spring,Hibernate)框架搭建好了。