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
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>
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. %>
1. <p>用户注册得有个实体类吧 User</p><p><img src="" alt="" /></p><p>把jsp的业务逻辑封装在一个业务逻辑层</p><p><img src="" 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. conn = null;
15. pstmQuery = null;
16. 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. rs = pstmQuery.executeQuery();
24. count = 0;
25. while(rs.next()){
26. count = rs.getInt(1);
27. > 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. conn = null;
61. pstm = null;
62. 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类里面的业务逻辑即可
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 进行测试
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. "select count(*) from User u where u.username = :username")
25. "username", user.getUsername())
26. .uniqueResult();
27. session.getTransaction().commit();
28.
29. if(count > 0) return 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. }
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. new UserManager();
15. new User();
16. "a");
17. boolean exists = userManager.exists(user);
18. true, exists);
19. }
20.
21. @Test
22. public void testAdd() throws Exception {
23. new UserManager();
24. new User();
25. "o");
26. "o");
27. boolean exists = userManager.exists(user);
28. if(!exists) {
29. userManager.add(user);
30. "o");
31. true, userManager.exists(user));
32. else {
33. "not added");
34. }
35. }
36.
37. }
抽象DAO层,咋们考虑另一种客户端,不通过自己的逻辑,就想直接访问数据库里面的内容,所以我们把DAO层抽象出来,不要直接把数据库这张表暴露给它,保证安全。
假如,要跨数据库的实现,要跨各种各样的存储方式来实现,不只是包括Hibernate去访问数据库,还要包括:如把User存在xml文件里,把User存在网络上去。 因此UserManager不要把
User的存储最好不要写死,写死成Hibernate、写成JDBC或者xml。
所以这个时候就需要DAO层(专门用来封装对实体类的数据库的访问,就是增删改查,不加业务逻辑)。
UserDao层
UserDAOImpl实现层
UserManagerImple实现层
根据一个实现类抽取接口的方法
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. }
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. 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
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. >
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>
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>
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. 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. 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
1. <listener>
2. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
3. </listener>
listener的作用:
就是我们当前的Application启动,它就启动,listener启动之后就去找我们的配置文件,就把我们配置文件里面的对象全部都初始化出来,容器就产生了。
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. >
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>
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
下面是struts2+hibernate+spring配置文件的一部分,以前都是仿造已经写好的bean的配置。有一次 scope="prototype"忘记写了结果出了问题
1. 项目中对一个表的增删该操作是用一个action,这个action有add,update,delete,save这些方法,添加和修改是共用一个页面,当页面得到id时代表进行的修改操作,反之是添加操作。因为在配置spring的bean是忘了写scope="prototype"所以每次添加时都显示最后一次访问过的记录
2. 找了很长时间,原来是spring bean出了问题。 scope="prototype" 会在该类型的对象被请求时创建一个新的action对象。如果没有配置scope=prototype则添加的时候不会新建一个action,他任然会保留上次访问的过记录的信息。
3. <bean id="assetAction" class="com.servicezone.itsd.asset.webapp.action.AssetAction" scope="prototype">
4. <property name="assetManager" ref="assetManager"/>
5. <property name="itProductManager" ref="itProductManager"/>
6. <property name="vendorManager" ref="vendorManager"/>
7. <property name="deptManager" ref="deptManager"/>
8. <property name="userManager" ref="userManager"/>
9. <property name="assetTypeManager" ref="assetTypeManager"/>
10. </bean>
1. /**
2. scope="prototype" 会在该类型的对象被请求时创建一个新的action对象。
3. scope=prototype则添加的时候不会新建一个action,
4. * 他任然会保留上次访问的过记录的信息。
5. */
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. >
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>
1. <?xml version="1.0" encoding="UTF-8" ?>
2. <!DOCTYPE struts PUBLIC
3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4. >
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 整合视图
1. /**
2. scope="prototype" 会在该类型的对象被请求时创建一个新的action对象。
3. scope=prototype则添加的时候不会新建一个action,
4. * 他任然会保留上次访问的过记录的信息。
5. */
6.
7. @Component("user")
8. @Scope("prototype") // 每个请求都会生成一个新的action
再加DTO层
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. }
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. 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、确定实体类,建立数据库表
1. <s:debug></s:debug> 把开发模式设为 true
2.
3. <constant name="struts.devMode" value="true"/>
获取数据库里面的usernam
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>
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. 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. }
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. }
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"/>
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>
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. >
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>
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)
1. 编码问题
2.
3. 1、如果是在action 往数据库里面插入产生的,那么就需要解决action与数据库之间的编码问题,数据库连接,数据库底层表的实现的编码
4.
5. 2、如果是接收参数产生的就是配置web方面产生的
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>
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. //判断乱码问题
64.
65.
66. 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. }
1. <?xml version="1.0" encoding="UTF-8" ?>
2. <!DOCTYPE struts PUBLIC
3. "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
4. >
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>