基于Struts+Spring+Hibernate的Web应用框架的搭建(一)

来源:互联网 发布:c语言中return是返回哪 编辑:程序博客网 时间:2024/05/16 12:02
   
这个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
 
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html>
 
<head>
 <title><bean:message key="register.title"/></title>
</head>
 
<body>
<html:errors />
 <html:form action="register.do">
    <table >
      <tr>
        <td><bean:message key="register.username"/>:</td>
        <td><html:text property="register.username" /></td>
      </tr>
      <tr>
        <td><bean:message key="register.password"/>:</td>
        <td><html:password property="register.password" /></td>
      </tr>
       <tr>
        <td><bean:message key="register.email"/>:</td>
        <td><html:text property="register.email" /></td>
      </tr>
      <tr>
        <td colspan="2" align="center">
        <html:submit><bean:message key="register.submit"/></html:submit>
        </td>
      </tr>
    </table>
 </html:form>
</body>
 
</html>
4.创建注册成功后显示的页面registerSuccess.jsp
<%@ taglib uri=" http://struts.apache.org/tags-bean " prefix="bean" %>
<html>
 
<head>
 <title><bean:message key="register.title"/></title>
</head>
 
<body>
 <bean:message key="register.success"/>
</body>
 
</html>
 
5.         创建消息资源文件registermessages.properties
 
register.title = Register
register.username = UserName
register.password = Password
register.email = Email
register.submit = Submit
register.success = RegisterSuccess!
 
6.      由于我们使用动态ActionForm,只需在Struts-config.xml中配置与register.jsp页面中form对应的ActionForm
7.         创建配置文件Struts-config.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE struts-config PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
        "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<!--
 Default configuration file for examples application.
 Each module also has its own struts-config under: /WEB-INF/$MODULE/
 @version $Revision: 1.9 $ $Date: 2006-02-13 18:39:49 -0700 (Mon, 13 Feb 2006) $
-->
<struts-config>
 <form-beans >
   <!—配置register.jspform对应的ActionFrom-->
    <form-bean name="registerForm" type="org.apache.struts.action.DynaActionForm" >
        <form-property name="register" type="test.register.entity.Register"/>                    
    </form-bean>
 </form-beans>
 <!—配置对Struts Action请求的代理-->
 <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
 <!—配置register.jspform对应的Action-->
 <action-mappings >
    <action     
      name="registerForm"
      path="/register"
      scope="request"
      type="test.register.action.RegisterAction"
      validate="false"
      input="register.jsp">
      <forward name="success" path="/registerSuccess.jsp" />
    </action>
   </action-mappings>
 
 <message-resources parameter="test.register.registermessages" />
 <!—配置插件,让action能访问sping容器-->
 <plug-in
       className="org.springframework.web.struts.ContextLoaderPlugIn">
       <set-property property="contextConfigLocation"
           value="/WEB-INF/action-servlets.xml" />
</plug-in>
 
</struts-config>
8.      创建实体类Register.java
package test.register.entity;
 
import java.io.Serializable;
 
publicclass Register implements Serializable{  
    privatestaticfinallongserialVersionUID = 1521645755684977819L;
    private Long id;
    private String username;
    private String password;
    private String email;
   
    public Register(){
      
    }
 
    public String getEmail() {
       returnemail;
    }
 
    publicvoid setEmail(String email) {
       this.email = email;
    }
 
    public Long getId() {
       returnid;
    }
 
    publicvoid setId(Long id) {
       this.id = id;
    }
 
    public String getPassword() {
       returnpassword;
    }
 
    publicvoid setPassword(String password) {
       this.password = password;
    }
 
    public String getUsername() {
       returnusername;
    }
 
    publicvoid setUsername(String username) {
       this.username = username;
    }
   
   
 
}
9.创建Hibernate映射文件,Register.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">
<hibernate-mapping
    package="test.register.entity">
 
    <class name="Register" table="REGISTER">
      
       <id name="id">
           <generator class="native"/>
       </id>
             
    <property name="username"
            not-null="true"
            length="15"
            column="USERNAME"/>
      
    <property name="password"
            not-null="true"
            length="15"
            column="PASSWORD"/>
      
    <property name="email"
            not-null="true"
            length="15"
            column="EMAIL"/>      
      
    </class>
   
</hibernate-mapping>
 
9.         创建Spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
 
<beans>   
 
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
       <property name="url" value="jdbc:mysql://localhost/register"/>
       <property name="username" value="root"/>
       <property name="password" value="root"/>
    </bean>   
 
    <!-- Hibernate SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
       <property name="dataSource" ref="dataSource"/>
       <property name="mappingDirectoryLocations">
           <value>classpath:test/register/entity/</value>
       </property>
       <property name="hibernateProperties">
           <props>
              <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
              <prop key="hibernate.show_sql">true</prop>
              <prop key="hibernate.generate_statistics">true</prop>
           </props>
       </property>      
    </bean>   
   
   <bean id="registerDAO" class="test.register.dao.RegisterDAO">
        <property name="sessionFactory">
             <ref local="sessionFactory"/>
        </property>
 </bean>
 
   <bean id="registerService" class="test.register.service.RegisterService">
        <property name="registerDAO">
             <ref local="registerDAO"/>
        </property>
 </bean>
 
</beans>
10. 创建数据访问对象RegisterDAO.java
package test.register.dao;
 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
 
import test.register.entity.Register;
 
publicclass RegisterDAO extends HibernateDaoSupport{
   
    public Register saveRegister(Register r){
       try{
           this.getHibernateTemplate().saveOrUpdate(r);
           return r;
       }catch (Exception e) {
           e.printStackTrace();
           returnnull;
       }     
    }
}
12.创建服务对象RegisterService.java
package test.register.service;
 
import test.register.dao.RegisterDAO;
import test.register.entity.Register;
 
publicclass RegisterService {
    private RegisterDAO registerDAO;  
   
    publicRegisterDAO getRegisterDAO() {
       returnregisterDAO;
    }
 
    publicvoid setRegisterDAO(RegisterDAO registerDAO) {
       this.registerDAO = registerDAO;
    }
 
    public Register saveRegister(Register r){
       this.getRegisterDAO().saveRegister(r);
       return r;
    }
}
 
11. 创建web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
 </servlet>
 
 <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
 </servlet-mapping>
 
 <welcome-file-list>
  <welcome-file>register.jsp</welcome-file>
 </welcome-file-list>
 
</web-app>
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文件的具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
 
<beans>   
    <bean name="/register" class="test.register.action.RegisterAction">
       <property name="registerService" ref="registerService"/>      
    </bean>     
</beans>
注意:这里bean是name属性,而不是id。
至此,一个完整的SSH(Struts,Spring,Hibernate)框架搭建好了。