SS_整合_1

11 篇文章 0 订阅
7 篇文章 0 订阅

Struts2.1.6 +Spring2.5.6 + Hibernate3.3.2

1.       需要的jar包列表

jar包名称

所在位置

说明

antlr-2.7.6.jar

hibernate/lib/required

解析HQL

aspectjrt

spring/lib/aspectj

AOP

aspectjweaver

..

AOP

cglib-nodep-2.1_3.jar

spring/lib/cglib

代理,二进制增强

common-annotations.jar

spring/lib/j2ee

@Resource

commons-collections-3.1.jar

hibernate/lib/required

集合框架

commons-fileupload-1.2.1.jar

struts/lib

struts

commons-io-1.3.2

struts/lib

struts

commons-logging-1.1.1

单独下载,删除1.0.4(struts/lib)

struts

spring

dom4j-1.6.1.jar

hibernate/required

解析xml

ejb3-persistence

hibernate-annotation/lib

@Entity

freemarker-2.3.13

struts/lib

struts

hibernate3.jar

hibernate

 

hibernate-annotations

hibernate-annotation/

 

hibernate-common-annotations

hibernate-annotation/lib

 

javassist-3.9.0.GA.jar

hiberante/lib/required

hibernate

jta-1.1.jar

..

hibernate transaction

junit4.5

 

 

mysql-

 

 

ognl-2.6.11.jar

struts/lib

 

slf4j-api-1.5.8.jar

hibernate/lib/required

hibernate-log

slf4j-nop-1.5.8.jar

hibernate/lib/required

 

spring.jar

spring/dist

 

struts2-core-2.1.6.jar

struts/lib

 

xwork-2.1.2.jar

struts/lib

struts2

commons-dbcp

spring/lib/jarkata-commons

 

commons-pool.jar

..

 

struts2-spring-plugin-2.1.6.jar

struts/lib

 

 

 

 

 

2.       BestPractice:

a)       将这些所有的jar包保存到一个位置,使用的时候直接copy

3.       步骤

a)       加入jar包

b)       首先整合Spring + Hibernate

                       i.             建立对应的package

1.       dao / dao.impl / model / service / service.impl/ test

                     ii.             建立对应的接口与类框架

1.       S2SH_01

                   iii.             建立spring的配置文件(建议自己保留一份经常使用的配置文件,以后用到的时候直接copy改)

                   iv.             建立数据库

                     v.             加入Hibernate注解

1.       在实体类上加相应注解@Entity @Id等

2.       在beans配置文件配置对应的实体类,使之受管

                   vi.             写dao service的实现

                 vii.             加入Spring注解

1.       在对应Service及DAO实现中加入@Component,让spring对其初始化

2.       在Service上加入@Transactional或者使用xml方式(此处建议后者,因为更简单)

3.       在DAO中注入sessionFactory

4.       在Service中注入DAO

5.       写DAO与Service的实现

               viii.             写测试

c)       整合Struts2

                       i.             结合点:Struts2的Action由Spring产生

                     ii.             步骤:

1.       修改web.xml加入 struts的filter

2.       再加入spring的listener,这样的话,webapp一旦启动,spring容器就初始化了

3.       规划struts的action和jsp展现

4.       加入struts.xml

a)      修改配置,由spring替代struts产生Action对象

5.       修改action配置

a)      把类名改为bean对象的名称,这个时候就可以使用首字母小写了

b)      @Scope(“prototype”)不要忘记

                   iii.             struts的读常量:

1.       struts-default.xml

2.       struts-plugin.xml

3.       struts.xml

4.       struts.properties

5.       web.xml

                   iv.             中文问题:

1.       Struts2.1.8已经修正,只需要改i18n.encoding = gbk

2.       使用spring的characterencoding

3.       需要严格注意filter的顺序

4.       需要加到Struts2的filter前面

                     v.             LazyInitializationException

1.       OpenSessionInViewFilter

2.       需要严格顺序问题

需要加到struts2的filter


_____________________________________________________________________________________________


pageEncoding 改成可以显示中文的GB18030



Spring_2300_Registration_1   

以下程序是jsp和数据打交道的一个登陆页面

register.jsp
registerDeal.jsp
registerFail.jsp
registerSuccess.jsp

[html]  view plain copy print ?
  1. <!-- register.jsp 登陆页面-->  
  2. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  6. %>  
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.     <title>用户注册</title>  
  12.   </head>  
  13.   <body>  
  14.   <form action="registerDeal.jsp" method="post">  
  15.     用户名:<input type="text" name="username"><br/>  
  16.     密  码:<input type="password" name="password"><br/>  
  17.     确认密码:<input type="password" name="password2"><br/>  
  18.     <input type="submit" value="提交">  
  19.     <input type="reset" value="重置">  
  20.   </form>  
  21.   </body>  
  22. </html>  





[html]  view plain copy print ?
  1. <!-- registerDeal.jsp -->  
  2. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  
  3. <%@ page import="java.sql.*" %>  
  4. <%  
  5. String path = request.getContextPath();  
  6. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  7. String username = request.getParameter("username");  
  8. String password = request.getParameter("password");  
  9. String password2 = request.getParameter("password2");  
  10. Class.forName("com.mysql.jdbc.Driver");  
  11. Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring","root","root");  
  12.   
  13. //判断用户名是否存在  
  14. String sqlQuery = "select count(*) from user where username = ?";  
  15. PreparedStatement pstmQuery = conn.prepareStatement(sqlQuery);  
  16. pstmQuery.setString(1,username);  
  17. ResultSet rs = pstmQuery.executeQuery();  
  18. rs.next();  
  19. int count = rs.getInt(1);  
  20. if(count > 0) {  
  21.     response.sendRedirect("registerFail.jsp");  
  22.     pstmQuery.close();  
  23.     conn.close();  
  24.     return;  
  25. }  
  26.   
  27.   
  28. //在插入之前要检查用户名是否存在,不存在就插入  
  29. String sql = "insert into user values(null,?,?)";  
  30. PreparedStatement pstm = conn.prepareStatement(sql);  
  31. pstm.setString(1,username);  
  32. pstm.setString(2,password);  
  33. pstm.executeUpdate();  
  34. pstm.close();  
  35. conn.close();  
  36.   
  37. response.sendRedirect("registerSuccess.jsp");  
  38. %>  



[html]  view plain copy print ?
  1. <p>用户注册得有个实体类吧 User</p><p><img src="http://hi.csdn.net/attachment/201112/3/0_1322900624wM5j.gif" alt="" /></p><p>把jsp的业务逻辑封装在一个业务逻辑层</p><p><img src="http://hi.csdn.net/attachment/201112/3/0_13229058808BxE.gif" alt="" /></p><pre name="code" class="java">package com.demo.registration.service;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8.   
  9. import com.demo.registration.model.User;  
  10.   
  11. public class UserManager {  
  12.     //判断用户名是否存在  
  13.     public boolean exists(User user) {  
  14.         Connection conn = null;  
  15.         PreparedStatement pstmQuery = null;  
  16.         String sqlQuery = "select count(*) from user where username = ?";  
  17.           
  18.         try {  
  19.             Class.forName("com.mysql.jdbc.Driver");  
  20.             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring","root","root");  
  21.             pstmQuery = conn.prepareStatement(sqlQuery);  
  22.             pstmQuery.setString(1,user.getUsername());  
  23.             ResultSet rs = pstmQuery.executeQuery();  
  24.             int count = 0;  
  25.             while(rs.next()){  
  26.                 count = rs.getInt(1);  
  27.                 if(count > 0) {  
  28.                     return true;  
  29.                 }  
  30.                 return false;  
  31.             }  
  32.               
  33.         } catch (ClassNotFoundException e) {  
  34.             e.printStackTrace();  
  35.         } catch (SQLException e) {  
  36.             e.printStackTrace();  
  37.         } finally {  
  38.             if(pstmQuery != null) {  
  39.                 try {  
  40.                     pstmQuery.close();  
  41.                     pstmQuery = null;  
  42.                 } catch (Exception e2) {  
  43.                     e2.printStackTrace();  
  44.                 }  
  45.               
  46.             }  
  47.             if(conn != null) {  
  48.                 try {  
  49.                     conn.close();  
  50.                     conn = null;  
  51.                 } catch (Exception e2) {  
  52.                     e2.printStackTrace();  
  53.                 }  
  54.             }  
  55.         }  
  56.         return false;  
  57.     }  
  58.     //在插入之前要检查用户名是否存在,不存在就插入  
  59.     public void add(User user) {  
  60.         Connection conn = null;  
  61.         PreparedStatement pstm = null;  
  62.         String sql = "insert into user values(null,?,?)";  
  63.         try {  
  64.             Class.forName("com.mysql.jdbc.Driver");  
  65.             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring","root","root");  
  66.             pstm = conn.prepareStatement(sql);  
  67.             pstm.setString(1,user.getUsername());  
  68.             pstm.setString(2, user.getPassword());  
  69.             pstm.executeUpdate();  
  70.               
  71.         } catch (ClassNotFoundException e) {  
  72.             e.printStackTrace();  
  73.         } catch (SQLException e) {  
  74.             e.printStackTrace();  
  75.         } finally {  
  76.             if(pstm != null) {  
  77.                 try {  
  78.                     pstm.close();  
  79.                     pstm = null;  
  80.                 } catch (Exception e2) {  
  81.                     e2.printStackTrace();  
  82.                 }  
  83.               
  84.             }  
  85.             if(conn != null) {  
  86.                 try {  
  87.                     conn.close();  
  88.                     conn = null;  
  89.                 } catch (Exception e2) {  
  90.                     e2.printStackTrace();  
  91.                 }  
  92.             }  
  93.         }  
  94.     }  
  95. }  
jsp直接调用UserManager类里面的业务逻辑即可
[html]  view plain copy print ?
  1. <!-- registerDeal.jsp -->  
  2. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  
  3. <%@ page import="java.sql.*" %>  
  4. <%@ page import="com.demo.registration.service.UserManager" %>  
  5. <%@page import="com.demo.registration.model.User"%>  
  6. <%  
  7. String path = request.getContextPath();  
  8. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  9. String username = request.getParameter("username");  
  10. String password = request.getParameter("password");  
  11. String password2 = request.getParameter("password2");  
  12.   
  13. User user = new User();  
  14. user.setUsername(username);  
  15. user.setPassword(password);  
  16.   
  17. UserManager userManager = new UserManager();  
  18. boolean exists = userManager.exists(user);  
  19. if(exists) {  
  20.     response.sendRedirect("registerFail.jsp");  
  21.     return ;  
  22. }  
  23. userManager.add(user);  
  24. response.sendRedirect("registerSuccess.jsp");  
  25. %>  

项目在tomcat中的加载

加入hibernate 和数据库打交道 引入的准备工作:

1、引入jar包

2、搭建hibernate.cfg.xml , log4j.properties 两个配置文件

3、引入junit 进行测试



[java]  view plain copy print ?
  1. package com.demo.registration.service;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.PreparedStatement;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8.   
  9. import org.hibernate.Session;  
  10. import org.hibernate.SessionFactory;  
  11.   
  12. import com.demo.registration.model.User;  
  13. import com.demo.registration.util.HibernateUtil;  
  14.   
  15. public class UserManager {  
  16.     //判断用户名是否存在  
  17.   
  18.       
  19.     public boolean exists(User user) {  
  20.         SessionFactory sessionFactory = HibernateUtil.getSessionFactory();  
  21.         Session session = sessionFactory.getCurrentSession();  
  22.         session.beginTransaction();  
  23.           
  24.         Long count = (Long)session.createQuery("select count(*) from User u where u.username = :username")  
  25.             .setString("username", user.getUsername())  
  26.             .uniqueResult();  
  27.         session.getTransaction().commit();  
  28.           
  29.         if(count > 0return true;  
  30.         return false;  
  31.     }  
  32.     //在插入之前要检查用户名是否存在,不存在就插入  
  33.     public void add(User user) {  
  34.         SessionFactory sessionFactory = HibernateUtil.getSessionFactory();  
  35.         Session session = sessionFactory.getCurrentSession();  
  36.         session.beginTransaction();  
  37.         session.save(user);  
  38.         session.getTransaction().commit();  
  39.     }  
  40. }  


[java]  view plain copy print ?
  1. //Junit测试类  
  2. package com.demo.registration.service;  
  3.   
  4. import org.junit.Assert;    //自动提示  
  5.   
  6. import org.junit.Test;  
  7.   
  8. import com.demo.registration.model.User;  
  9.   
  10. public class UserManagerTest {  
  11.   
  12.     @Test  
  13.     public void testExists() {  
  14.         UserManager userManager = new UserManager();  
  15.         User user = new User();  
  16.         user.setUsername("a");  
  17.         boolean exists = userManager.exists(user);  
  18.         Assert.assertEquals(true, exists);   
  19.     }  
  20.   
  21.     @Test  
  22.     public void testAdd() throws Exception {  
  23.         UserManager userManager = new UserManager();  
  24.         User user = new User();  
  25.         user.setUsername("o");  
  26.         user.setPassword("o");  
  27.         boolean exists = userManager.exists(user);  
  28.         if(!exists) {  
  29.             userManager.add(user);  
  30.             user.setUsername("o");  
  31.             Assert.assertEquals(true, userManager.exists(user));  
  32.         } else {  
  33.             Assert.fail("not added");  
  34.         }  
  35.     }  
  36.   
  37. }  


抽象DAO层,咋们考虑另一种客户端,不通过自己的逻辑,就想直接访问数据库里面的内容,所以我们把DAO层抽象出来,不要直接把数据库这张表暴露给它,保证安全。

假如,要跨数据库的实现,要跨各种各样的存储方式来实现,不只是包括Hibernate去访问数据库,还要包括:如把User存在xml文件里,把User存在网络上去。 因此UserManager不要把

User的存储最好不要写死,写死成Hibernate、写成JDBC或者xml。

所以这个时候就需要DAO层(专门用来封装对实体类的数据库的访问,就是增删改查,不加业务逻辑)。

UserDao层


UserDAOImpl实现层


UserManagerImple实现层

根据一个实现类抽取接口的方法

[java]  view plain copy print ?
  1. package com.demo.registration.service;  
  2.   
  3. import com.demo.registration.model.User;  
  4.   
  5. public interface UserManager {  
  6.   
  7.     public abstract boolean exists(User user) throws Exception;  
  8.   
  9.     public abstract void add(User user) throws Exception;  
  10.   
  11. }  


[java]  view plain copy print ?
  1. package com.demo.registration.service.impl;  
  2.   
  3.   
  4. import com.demo.registration.dao.UserDao;  
  5. import com.demo.registration.dao.impl.UserDaoImpl;  
  6. import com.demo.registration.model.User;  
  7. import com.demo.registration.service.UserManager;  
  8.   
  9. public class UserManagerImpl implements UserManager {  
  10.     UserDao userDao = new UserDaoImpl();  
  11.   
  12.     public UserDao getUserDao() {  
  13.         return userDao;  
  14.     }  
  15.   
  16.     public void setUserDao(UserDao userDao) {  
  17.         this.userDao = userDao;  
  18.     }  
  19.   
  20.     public boolean exists(User user) {  
  21.         return userDao.checkUserExistsWithName(user.getUsername());  
  22.     }  
  23.   
  24.     public void add(User user) {  
  25.         userDao.save(user);  
  26.     }  
  27.   
  28.   
  29. }  

struts2 解决了容器Cotroller (控制器)

1、把view  (V)层和 业务逻辑层(M)分开

2、view也可以进行重复使用,也可以进行替换,也可以进行扩展  (其实只是把view 起了个名,想把实现文件替换掉,只需要该配置文件即可)

3、(M)业务逻辑层 也可以进行重复使用,也可以进行扩展

4、主要解决互相之间耦合性不那么强的依赖于对方

struts 这一层准备工作:

1、引入jar包

2、web.xml 里面进行filter的配置

3、把struts.xml 引入进来

4、建立action


[html]  view plain copy print ?
  1. //struts.xml  
  2. <?xml version="1.0" encoding="UTF-8" ?>  
  3. <!DOCTYPE struts PUBLIC  
  4.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  5.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  6.   
  7. <struts>  
  8.     <constant name="struts.devMode" value="true"/>       
  9.       
  10.     <package name="registration" extends="struts-default">  
  11.         <action name="user" class="com.demo.registration.action.UserAction">  
  12.             <result name="success">/registerSuccess.jsp</result>  
  13.             <result name="fail">/registerFail.jsp</result>  
  14.         </action>  
  15.     </package>  
  16.    
  17.      
  18. </struts>  

[html]  view plain copy print ?
  1. web.xml  
  2.    
  3.   <filter>  
  4.         <filter-name>struts2</filter-name>  
  5.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  6.     </filter>  
  7.   
  8.     <filter-mapping>  
  9.         <filter-name>struts2</filter-name>  
  10.         <url-pattern>/*</url-pattern>  
  11.     </filter-mapping>  

[java]  view plain copy print ?
  1. package com.demo.registration.action;  
  2.   
  3. import com.demo.registration.model.User;  
  4. import com.demo.registration.service.UserManager;  
  5. import com.demo.registration.service.impl.UserManagerImpl;  
  6. import com.opensymphony.xwork2.ActionSupport;  
  7.   
  8. public class UserAction extends ActionSupport {  
  9.     private String username;  
  10.     private String password;  
  11.     private String password2;  
  12.       
  13.       
  14.     UserManager userManager = new UserManagerImpl();  
  15.       
  16.     public UserManager getUserManager() {  
  17.         return userManager;  
  18.     }  
  19.   
  20.     public void setUserManager(UserManager userManager) {  
  21.         this.userManager = userManager;  
  22.     }  
  23.   
  24.     @Override  
  25.     public String execute() throws Exception {  
  26.         User user = new User();  
  27.         user.setUsername(username);  
  28.         user.setPassword(password);  
  29.         if(userManager.exists(user)) {  
  30.             return "fail";  
  31.         }  
  32.         userManager.add(user);  
  33.         return "success";  
  34.     }  
  35.   
  36.     public String getUsername() {  
  37.         return username;  
  38.     }  
  39.   
  40.     public void setUsername(String username) {  
  41.         this.username = username;  
  42.     }  
  43.   
  44.     public String getPassword() {  
  45.         return password;  
  46.     }  
  47.   
  48.     public void setPassword(String password) {  
  49.         this.password = password;  
  50.     }  
  51.   
  52.     public String getPassword2() {  
  53.         return password2;  
  54.     }  
  55.   
  56.     public void setPassword2(String password2) {  
  57.         this.password2 = password2;  
  58.     }  
  59. }  



 

spring 加入

需要的配置

1、加入jar包

2、    beans.xml   、   log4j.properties

3、hibernate数据连接的配置已经在beans.xml里面 因此 hibernate.cfg.xml 可以删除了

业务分析

1、当UserManager 去拿UserDao的时候是spring帮你注入的

2、UserManager本身也是由spring来管理的

3、Action要用UserManager的时候也是由spring帮我注入的

4、UserManager里面的方法它都会帮你加上AOP

[html]  view plain copy print ?
  1. <listener>  
  2.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  3. </listener>  
listener的作用:

就是我们当前的Application启动,它就启动,listener启动之后就去找我们的配置文件,就把我们配置文件里面的对象全部都初始化出来,容器就产生了。

[html]  view plain copy print ?
  1. // 对beans.xml 所有配置的说明  
  2. <?xml version="1.0" encoding="UTF-8"?>  
  3. <beans xmlns="http://www.springframework.org/schema/beans"  
  4.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.        xmlns:context="http://www.springframework.org/schema/context"  
  6.        xmlns:aop="http://www.springframework.org/schema/aop"  
  7.        xmlns:tx="http://www.springframework.org/schema/tx"  
  8.        xsi:schemaLocation="http://www.springframework.org/schema/beans  
  9.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  10.            http://www.springframework.org/schema/context  
  11.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  12.            http://www.springframework.org/schema/aop   
  13.            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  14.            http://www.springframework.org/schema/tx   
  15.            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  16.   
  17.     <context:annotation-config />  
  18.     <!-- 扫描所有 com.demo包下面类中所有的组件和注入的资源Component Resource -->  
  19.     <context:component-scan base-package="com.demo"/>  
  20.   
  21.             <!--  
  22.       <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  23.       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
  24.       <property name="url" value="jdbc:mysql://localhost:3306/spring"/>  
  25.       <property name="username" value="root"/>  
  26.       <property name="password" value="root"/>  
  27.       </bean>  
  28.     -->  
  29.       
  30.     <!-- 连接数据库 -->  
  31.         <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  32.         <property name="locations">  
  33.             <value>classpath:jdbc.properties</value>  
  34.         </property>  
  35.         </bean>  
  36.       
  37.         <bean id="dataSource" destroy-method="close"  
  38.           class="org.apache.commons.dbcp.BasicDataSource">  
  39.         <property name="driverClassName" value="${jdbc.driverClassName}"/>  
  40.         <property name="url" value="${jdbc.url}"/>  
  41.         <property name="username" value="${jdbc.username}"/>  
  42.         <property name="password" value="${jdbc.password}"/>  
  43.         </bean>  
  44.   
  45.           
  46.     <!-- 通过数据库配置连接 -->  
  47.      <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
  48.         <property name="dataSource" ref="dataSource"/>  
  49.         <!--  
  50.         <property name="annotatedClasses">  
  51.           <list>  
  52.             <value>com.demo.model.User</value>  
  53.             <value>com.demo.model.Log</value>  
  54.           </list>  
  55.         </property>  
  56.        -->  
  57.        <!--  实体类(用@Entity标注)的自动扫描  -->  
  58.        <property name="packagesToScan">  
  59.           <list>  
  60.             <value>com.demo.registration.model</value>  
  61.           </list>  
  62.         </property>  
  63.          
  64.         <property name="hibernateProperties">  
  65.         <props>  
  66.             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
  67.             <prop key="hibernate.show_sql">true</prop>  
  68.          </props>  
  69.         </property>  
  70.       </bean>  
  71.         
  72.       <!-- 事物管理  HibernateTransactionManager 管理事务嵌套,开启,关闭,资源线程同步,提交,回滚 -->  
  73.       <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  74.       <property name="sessionFactory" ref="sessionFactory"/>  
  75.       </bean>  
  76.   
  77.       <aop:config>  
  78.         <aop:pointcut id="bussinessService" expression="execution(public * com.demo.registration.service..*.*(..))"/>  
  79.         <aop:advisor advice-ref="txAdvice" pointcut-ref="bussinessService"/>  
  80.       </aop:config>  
  81.             <!-- 在指定方法上面加事物   事物边界是放在service 这里,只有调用才会产生 -->  
  82.         <tx:advice id="txAdvice" transaction-manager="txManager">  
  83.         <tx:attributes>  
  84.             <tx:method name="exists" read-only="true"/>  
  85.             <tx:method name="add*" propagation="REQUIRED"/>  
  86.         </tx:attributes>  
  87.         </tx:advice>  
  88.   
  89.         <!-- Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作 也支持分页 -->  
  90.         <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">  
  91.             <property name="sessionFactory" ref="sessionFactory"></property>  
  92.         </bean>  
  93.   
  94. </beans>  

[html]  view plain copy print ?
  1. <listener>  
  2.    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  3.     <!-- default: /WEB-INF/applicationContext.xml -->  
  4. </listener>  
  5.   
  6. <!-- Context Configuration locations for Spring XML files -->  
  7. <context-param>  
  8.     <param-name>contextConfigLocation</param-name>  
  9.     <!--<param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>-->  
  10.         <param-value>classpath:beans.xml</param-value>  
  11.     </context-param>   
引入jar包 D:\javasoft\ssh\struts-2.1.6\lib\struts2-spring-plugin-2.1.6.jar

[html]  view plain copy print ?
  1. 转自 http://zhou568xiao.iteye.com/blog/192208下面是struts2+hibernate+spring配置文件的一部分,以前都是仿造已经写好的bean的配置。有一次 scope="prototype"忘记写了结果出了问题  
  2. 项目中对一个表的增删该操作是用一个action,这个action有add,update,delete,save这些方法,添加和修改是共用一个页面,当页面得到id时代表进行的修改操作,反之是添加操作。因为在配置spring的bean是忘了写scope="prototype"所以每次添加时都显示最后一次访问过的记录  
  3. 找了很长时间,原来是spring bean出了问题。 scope="prototype" 会在该类型的对象被请求时创建一个新的action对象。如果没有配置scope=prototype则添加的时候不会新建一个action,他任然会保留上次访问的过记录的信息。  
  4. <bean id="assetAction" class="com.servicezone.itsd.asset.webapp.action.AssetAction" scope="prototype">  
  5. <property name="assetManager" ref="assetManager"/>  
  6. <property name="itProductManager" ref="itProductManager"/>  
  7. <property name="vendorManager" ref="vendorManager"/>  
  8. <property name="deptManager" ref="deptManager"/>  
  9. <property name="userManager" ref="userManager"/>  
  10. <property name="assetTypeManager" ref="assetTypeManager"/>  
  11.     </bean>  

[html]  view plain copy print ?
  1. /**  
  2.  * scope="prototype" 会在该类型的对象被请求时创建一个新的action对象。  
  3.  * 如果没有配置scope=prototype则添加的时候不会新建一个action,  
  4.  * 他任然会保留上次访问的过记录的信息。   
  5.  */  

[html]  view plain copy print ?
  1. //web.xml  
  2.   
  3. <?xml version="1.0" encoding="UTF-8"?>  
  4. <web-app version="2.5"   
  5.     xmlns="http://java.sun.com/xml/ns/javaee"   
  6.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  7.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  8.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  9.   <welcome-file-list>  
  10.     <welcome-file>index.jsp</welcome-file>  
  11.   </welcome-file-list>  
  12.     
  13.     <!-- 监听器  初始化所有的配置文件  -->  
  14.   
  15.     <listener>  
  16.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  17.         <!-- default: /WEB-INF/applicationContext.xml -->  
  18.     </listener>  
  19.   
  20.     <!-- Context Configuration locations for Spring XML files -->  
  21.     <context-param>  
  22.         <param-name>contextConfigLocation</param-name>  
  23.         <!--<param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>-->  
  24.             <param-value>classpath:beans.xml</param-value>  
  25.         </context-param>  
  26.     
  27.   
  28.   
  29.     
  30.   <!-- struts的配置文件   -->  
  31.   
  32.  <filter>  
  33.         <filter-name>struts2</filter-name>  
  34.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  35.     </filter>  
  36.   
  37.     <filter-mapping>  
  38.         <filter-name>struts2</filter-name>  
  39.         <url-pattern>/*</url-pattern>  
  40.     </filter-mapping>  
  41. </web-app>  
[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <constant name="struts.devMode" value="true"/>       
  8.       
  9.     <package name="registration" extends="struts-default">  
  10.         <action name="user" class="com.demo.registration.action.UserAction">  
  11.             <result name="success">/registerSuccess.jsp</result>  
  12.             <result name="fail">/registerFail.jsp</result>  
  13.         </action>  
  14.     </package>  
  15.   
  16. </struts>  

ssh 整合视图

[html]  view plain copy print ?
  1. /**  
  2.  * scope="prototype" 会在该类型的对象被请求时创建一个新的action对象。  
  3.  * 如果没有配置scope=prototype则添加的时候不会新建一个action,  
  4.  * 他任然会保留上次访问的过记录的信息。   
  5.  */  
  6.   
  7. @Component("user")  
  8. @Scope("prototype")     // 每个请求都会生成一个新的action  

再加DTO层

[java]  view plain copy print ?
  1. package com.demo.registration.vo;  
  2.   
  3. public class UserRegisterInfo {  
  4.     private String username;  
  5.     private String password;  
  6.     private String password2;  
  7.     public String getUsername() {  
  8.         return username;  
  9.     }  
  10.     public void setUsername(String username) {  
  11.         this.username = username;  
  12.     }  
  13.     public String getPassword() {  
  14.         return password;  
  15.     }  
  16.     public void setPassword(String password) {  
  17.         this.password = password;  
  18.     }  
  19.     public String getPassword2() {  
  20.         return password2;  
  21.     }  
  22.     public void setPassword2(String password2) {  
  23.         this.password2 = password2;  
  24.     }  
  25.       
  26. }  

[java]  view plain copy print ?
  1. package com.demo.registration.action;  
  2.   
  3. import javax.annotation.Resource;  
  4.   
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.annotation.Scope;  
  7. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  8. import org.springframework.stereotype.Component;  
  9.   
  10. import com.demo.registration.model.User;  
  11. import com.demo.registration.service.UserManager;  
  12. import com.demo.registration.vo.UserRegisterInfo;  
  13. import com.opensymphony.xwork2.ActionSupport;  
  14. import com.opensymphony.xwork2.ModelDriven;  
  15.   
  16.   
  17. //1、action类中不要写annotation写了没用struts自己产生   
  18. // 2、spring可以注入    
  19. public class UserAction extends ActionSupport implements ModelDriven {  
  20.       
  21.     private UserRegisterInfo info = new UserRegisterInfo();  
  22.       
  23.     private UserManager userManager;  
  24.       
  25.     public UserManager getUserManager() {  
  26.         return userManager;  
  27.     }  
  28.   
  29.   
  30.     public void setUserManager(UserManager userManager) {  
  31.         this.userManager = userManager;  
  32.     }  
  33.     @Override  
  34.     public String execute() throws Exception {  
  35.         User user = new User();  
  36.         user.setUsername(info.getUsername());  
  37.         user.setPassword(info.getPassword());  
  38.         if(userManager.exists(user)) {  
  39.             return "fail";  
  40.         }  
  41.         userManager.add(user);  
  42.         return "success";  
  43.     }  
  44.   
  45.     public UserRegisterInfo getInfo() {  
  46.         return info;  
  47.     }  
  48.     public void setInfo(UserRegisterInfo info) {  
  49.         this.info = info;  
  50.     }  
  51.   
  52.     @Override  
  53.     public Object getModel() {  
  54.         return info;  
  55.     }  
  56. }  

以下为MVC架构图形

mvc

因此分析如下:

1、界面原型,帮我们建立分析需求

2、确定实体类,建立数据库表

[html]  view plain copy print ?
  1.     <s:debug></s:debug> 把开发模式设为 true   
  2.   
  3. <constant name="struts.devMode" value="true"/>       

获取数据库里面的usernam

[html]  view plain copy print ?
  1.  <body>  
  2. <s:iterator value="users">  <!-- UserAction 里面 private List<User> users; users属性 -->  
  3.     <s:property value="username"></s:property>  <!-- 封装在这个类里面UserRegisterInfo的username属性 -->  
  4. </s:iterator>  
  5. <s:debug></s:debug>  
  6.  </body>  

[java]  view plain copy print ?
  1. package com.demo.registration.action;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6.   
  7. import org.springframework.context.ApplicationContext;  
  8. import org.springframework.context.annotation.Scope;  
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  10. import org.springframework.stereotype.Component;  
  11.   
  12. import com.demo.registration.model.User;  
  13. import com.demo.registration.service.UserManager;  
  14. import com.demo.registration.vo.UserRegisterInfo;  
  15. import com.opensymphony.xwork2.ActionSupport;  
  16. import com.opensymphony.xwork2.ModelDriven;  
  17.   
  18.   
  19.   
  20. public class UserAction extends ActionSupport implements ModelDriven {  
  21.       
  22.     private UserRegisterInfo info = new UserRegisterInfo();  
  23.       
  24.     private UserManager userManager;  
  25.     private List<User> users;  
  26.       
  27.     public UserManager getUserManager() {  
  28.         return userManager;  
  29.     }  
  30.   
  31.     public void setUserManager(UserManager userManager) {  
  32.         this.userManager = userManager;  
  33.     }  
  34.     public String list() {  
  35.         this.users = this.userManager.getUsers();  
  36.         return "list";  
  37.     }   
  38.       
  39.     @Override  
  40.     public String execute() throws Exception {  
  41.         User user = new User();  
  42.         user.setUsername(info.getUsername());  
  43.         user.setPassword(info.getPassword());  
  44.         if(userManager.exists(user)) {  
  45.             return "fail";  
  46.         }  
  47.         userManager.add(user);  
  48.         return "success";  
  49.     }  
  50.   
  51.     public UserRegisterInfo getInfo() {  
  52.         return info;  
  53.     }  
  54.     public void setInfo(UserRegisterInfo info) {  
  55.         this.info = info;  
  56.     }  
  57.   
  58.     @Override  
  59.     public Object getModel() {  
  60.         return info;  
  61.     }  
  62.   
  63.     public List<User> getUsers() {  
  64.         return users;  
  65.     }  
  66.   
  67.     public void setUsers(List<User> users) {  
  68.         this.users = users;  
  69.     }  
  70. }  

[html]  view plain copy print ?
  1. /*  
  2.      * 在测试load方法的时候因为是getCurrentSession  load 完了就关闭  
  3.      * 在web.xml里面配置  OpenSessionInViewFilter jsp关闭session才关闭不过要配置的  
  4.      * StrutsPrepareAndExecuteFilter的前面   
  5.      */  
  6.       
  7.       
  8.       
  9.     public String load() {    
  10.         thisthis.user = this.userManager.loadById(info.getId());  
  11.         return "load";  
  12.     }  

[html]  view plain copy print ?
  1. //  以下是jsp获取属性的2中同样的方法  
  2.   <!--  
  3.   
  4.     <s:iterator value="user">  
  5.         <s:property value="username"/>  
  6.     </s:iterator>  
  7.     -->  
  8.   
  9.  <s:property value="user.username"/>  

[html]  view plain copy print ?
  1.       
  2. //以下配置文件作用是把Session 打开的时间一直延续到jsp这层,完了之后就关闭,不过单个对象可以用get方法(load)  如果没有配事物边界HibernateTransactionManager 那么它<pre name="code" class="html">//openSessionInView 认为这个session里面的这个事物是只读的,  
<filter><filter-name>openSessionInView</filter-name><filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class></filter><filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
 

 

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7.   <welcome-file-list>  
  8.     <welcome-file>index.jsp</welcome-file>  
  9.   </welcome-file-list>  
  10.     
  11.     
  12.     
  13.     <listener>  
  14.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  15.         <!-- default: /WEB-INF/applicationContext.xml -->  
  16.     </listener>  
  17.   
  18.     <!-- Context Configuration locations for Spring XML files -->  
  19.     <context-param>  
  20.         <param-name>contextConfigLocation</param-name>  
  21.         <!--<param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value>-->  
  22.             <param-value>classpath:beans.xml</param-value>  
  23.         </context-param>  
  24.     
  25.       
  26.       
  27.     <filter>  
  28.         <filter-name>openSessionInView</filter-name>  
  29.         <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
  30.     </filter>  
  31.     <filter-mapping>   
  32.         <filter-name>openSessionInView</filter-name>  
  33.         <url-pattern>/*</url-pattern>  
  34.     </filter-mapping>  
  35.     
  36.       
  37.       
  38.   
  39.     
  40.   <filter>  
  41.         <filter-name>struts2</filter-name>  
  42.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  43.     </filter>  
  44.   
  45.     <filter-mapping>  
  46.         <filter-name>struts2</filter-name>  
  47.         <url-pattern>/*</url-pattern>  
  48.     </filter-mapping>  
  49.       
  50.       
  51.   
  52.   
  53. </web-app>  
[html]  view plain copy print ?
  1. //查看mysql数据库表里面的编码  
  2.   
  3. mysql> show create table user;  
  4. +-------+----------------------------------  
  5. -------------------------------+  
  6. | Table | Create Table  
  7.                                |  
  8. +-------+----------------------------------  
  9. -------------------------------+  
  10. | user  | CREATE TABLE `user` (  
  11.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  12.   `username` varchar(100) DEFAULT NULL,  
  13.   `password` varchar(20) DEFAULT NULL,  
  14.   PRIMARY KEY (`id`)  
  15. ENGINE=InnoDB DEFAULT CHARSET=gb2312 |  
  16. +-------+----------------------------------  
  17. -------------------------------+  
  18. 1 row in set (0.05 sec)  

[html]  view plain copy print ?
  1. 编码问题  
  2.   
  3. 1、如果是在action 往数据库里面插入产生的,那么就需要解决action与数据库之间的编码问题,数据库连接,数据库底层表的实现的编码  
  4.   
  5. 2、如果是接收参数产生的就是配置web方面产生的  

[html]  view plain copy print ?
  1. <pre name="code" class="html">乱码问题解决 利用spring  
web.xml配置 filter 乱码     <filter>        <filter-name>encodingFilter</filter-name>        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>        <init-param>            <param-name>encoding</param-name>            <param-value>GBK</param-value>        </init-param>    </filter>    <filter-mapping>         <filter-name>encodingFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>  
 

 

[java]  view plain copy print ?
  1. package com.demo.registration.action;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.annotation.Resource;  
  6.   
  7. import org.springframework.context.ApplicationContext;  
  8. import org.springframework.context.annotation.Scope;  
  9. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  10. import org.springframework.stereotype.Component;  
  11.   
  12. import com.demo.registration.model.User;  
  13. import com.demo.registration.service.UserManager;  
  14. import com.demo.registration.vo.UserRegisterInfo;  
  15. import com.opensymphony.xwork2.ActionSupport;  
  16. import com.opensymphony.xwork2.ModelDriven;  
  17.   
  18. /** 
  19.  * scope="prototype" 会在该类型的对象被请求时创建一个新的action对象。 
  20.  * 如果没有配置scope=prototype则添加的时候不会新建一个action, 
  21.  * 他任然会保留上次访问的过记录的信息。  
  22.  */  
  23.   
  24.   
  25.   
  26. @Component("u")  //这个与struts.xml配置里面的 calss一直  
  27. @Scope("prototype")// 每个请求都会生成一个新的action  
  28. public class UserAction extends ActionSupport implements ModelDriven {  
  29.       
  30.     private UserRegisterInfo info = new UserRegisterInfo();  
  31.       
  32.     private UserManager userManager;  
  33.     private List<User> users;  
  34.     private User user;  
  35.       
  36.     public UserManager getUserManager() {  
  37.         return userManager;  
  38.     }  
  39.     @Resource  
  40.     public void setUserManager(UserManager userManager) {  
  41.         this.userManager = userManager;  
  42.     }  
  43.     public String list() {  
  44.         this.users = this.userManager.getUsers();  
  45.         return "list";  
  46.     }   
  47.     /* 
  48.      * 在测试load方法的时候因为是getCurrentSession  load 完了就关闭 
  49.      * 在web.xml里面配置  OpenSessionInViewFilter jsp关闭session才关闭不过要配置的 
  50.      * StrutsPrepareAndExecuteFilter的前面  
  51.      */  
  52.       
  53.       
  54.       
  55.     public String load() {    
  56.         this.user = this.userManager.loadById(info.getId());  
  57.         return "load";  
  58.     }  
  59.       
  60.     @Override  
  61.     public String execute() throws Exception {  
  62.         
  63.         System.out.println(info.getUsername());//判断乱码问题  
  64.           
  65.           
  66.         User user = new User();  
  67.         user.setUsername(info.getUsername());  
  68.         user.setPassword(info.getPassword());  
  69.         if(userManager.exists(user)) {  
  70.             return "fail";  
  71.         }  
  72.         userManager.add(user);  
  73.         return "success";  
  74.     }  
  75.   
  76.     public UserRegisterInfo getInfo() {  
  77.         return info;  
  78.     }  
  79.     public void setInfo(UserRegisterInfo info) {  
  80.         this.info = info;  
  81.     }  
  82.   
  83.     @Override  
  84.     public Object getModel() {  
  85.         return info;  
  86.     }  
  87.   
  88.     public List<User> getUsers() {  
  89.         return users;  
  90.     }  
  91.   
  92.     public void setUsers(List<User> users) {  
  93.         this.users = users;  
  94.     }  
  95.   
  96.     public User getUser() {  
  97.         return user;  
  98.     }  
  99.   
  100.     public void setUser(User user) {  
  101.         this.user = user;  
  102.     }  
  103. }  

[html]  view plain copy print ?
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6. <struts>  
  7.     <constant name="struts.devMode" value="true"/>       
  8.       
  9.     <package name="registration" extends="struts-default">  
  10.         <action name="userAction" class="u">  
  11.             <result name="success">/registerSuccess.jsp</result>  
  12.             <result name="fail">/registerFail.jsp</result>  
  13.             <result name="list">/userlist.jsp</result>  
  14.             <result name="load">/user.jsp</result>  
  15.         </action>  
  16.     </package>  
  17.    
  18.   
  19. </struts>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值