搭建ssh框架相关配置文件总结


第一步 导入jar包

 

第二步 搭建struts2环境

1)创建action(继承actionnsuport),创建struts.xml配置文件,配置action

1
public  class  UserAction  extends  ActionSupport{}
1
2
3
4
5
6
7
8
9
10
11
<?xml version= "1.0"  encoding= "UTF-8" ?>
<!DOCTYPE struts PUBLIC
     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     "http://struts.apache.org/dtds/struts-2.3.dtd" >
<struts>
     < package  name= "User_test"  extends = "struts-default"  namespace= "/" >
         <action name= "user_*"  class = "com.my.action.UserAction"  method= "{1}" >
     
         </action>
     </ package >
</struts>

(2)配置struts2的过滤器,在web.xml中

1
2
3
4
5
6
7
8
<filter>
         <filter-name>struts2</filter-name>
         <filter- class >org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter- class >
   </filter>
   <filter-mapping>
         <filter-name>struts2</filter-name>
         <url-pattern>/*</url-pattern>
   </filter-mapping>

第三步 搭建hibernate环境

(1)创建实体类,User

1
2
3
4
5
6
7
8
9
10
public  class  User {
     private  Integer uid;
     private  String username;
     private  String password;
     private  String email;
     private  String code;
     private  Boolean state;
 
     //再生成set/get方法
}

实体类编写规则

实体类里面属性私有的

 

私有属性使用公开的setget方法操作

 

要求实体类有属性作为唯一值(一般使用id值)

 

实体类属性建议不使用基本数据类型,使用基本数据类型对应的包装类

1)八个基本数据类型对应的包装类

- int  Integer

- charCharacter

其他的都是首字母大写 比如 double  Double

2)比如 表示学生的分数,假如 int score;

比如学生得了0分 ,int score = 0;

如果表示学生没有参加考试,int score = 0;不能准确表示学生是否参加考试

解决:使用包装类可以了, Integer score = 0,表示学生得了0分,

表示学生没有参加考试,Integer score = null;

(2)配置实体类和数据库表映射关系,User.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version= "1.0"  encoding= "UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
     < class  name= "com.my.entity.User"  table= "t_user" >
         <id name= "uid"  column= "uid" >
             <generator  class = "native" ></generator>
         </id>
         <property name= "username"   column= "username" ></property>
         <property name= "password"   column= "password" ></property>
         <property name= "email"   column= "email" ></property>
         <property name= "code"   column= "code" ></property>
         <property name= "state"   column= "state" ></property>
     </ class >
</hibernate-mapping>

(3)创建hibernate核心配置文件,hibernate.cfg.xml

- 引入映射配置文件

(配置文件需要引入约束)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version= "1.0"  encoding= "UTF-8" ?>
<!DOCTYPE hibernate-configuration PUBLIC
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" >
<hibernate-configuration>
     <session-factory>
     <!-- 这里没有配置数据库,之后创建spring的时候配置 --> 
         <property name= "hibernate.show_sql" > true </property>
         <property name= "hibernate.format_sql" > true </property>
         <property name= "hibernate.hbm2ddl.auto" >update</property>
         <property name= "hibernate.dialect" >org.hibernate.dialect.MySQLDialect</property>
 
         <mapping resource= "com/my/entity/User.hbm.xml" />
     </session-factory>
</hibernate-configuration>

第四步 搭建spring环境

(1)创建spring核心配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version= "1.0"  encoding= "UTF-8" ?>
<beans xmlns= "http://www.springframework.org/schema/beans" <!-- IOC相关 -->
     xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" <!-- IOC相关 -->
     xmlns:p= "http://www.springframework.org/schema/p" <!-- P名称空间 -->
     xmlns:context= "http://www.springframework.org/schema/context" <!-- IOC注解相关 -->
     xmlns:aop= "http://www.springframework.org/schema/aop" <!-- aop相关 -->
     xmlns:tx= "http://www.springframework.org/schema/tx" <!-- 事务相关 -->
     xsi:schemaLocation="http: //www.springframework.org/schema/beans 
     http: //www.springframework.org/schema/beans/spring-beans.xsd
     http: //www.springframework.org/schema/context
     http: //www.springframework.org/schema/context/spring-context.xsd
     http: //www.springframework.org/schema/aop
     http: //www.springframework.org/schema/aop/spring-aop.xsd
     http: //www.springframework.org/schema/tx
     http: //www.springframework.org/schema/tx/spring-tx.xsd">
 
</beans>

(2)让spring配置文件在服务器启动时候加载,在web.xml中

- 配置监听器

- 指定spring配置文件位置

1
2
3
4
5
6
7
8
9
10
<context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>classpath:bean.xml</param-value>
   </context-param>
       
       ......
       
<listener>
         <listener- class >org.springframework.web.context.ContextLoaderListener</listener- class >
     </listener>


第五步 struts2和spring整合

(1)把action在spring配置(action多实例的)

(2)在struts.xml中action标签class属性里面写 bean的id值

1
2
3
bean.xml
<bean id= "userAction"  class = "com.my.action.UserAction"  scope= "prototype" >
</bean>
1
2
struts.xml
<action name= "user_*"  class = "userAction"  method= "{1}" >


 

第六步 spring和hibernate整合

(1)把hibernate核心配置文件中数据库配置,在spring里面配置

(2)把hibernate的sessionFactory在spring配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<bean id= "dataSource"  class = "com.mchange.v2.c3p0.ComboPooledDataSource" >
         <property name= "driverClass"  value= "com.mysql.jdbc.Driver" ></property>
         <property name= "jdbcUrl"  value= "jdbc:mysql:///my" ></property>
         <property name= "user"  value= "root" ></property>
         <property name= "password"  value= "123" ></property>
     </bean>
 
     <bean id= "sessionFactory"  class = "org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
         <property name= "dataSource"  ref= "dataSource" ></property>
         <property name= "configLocations"  value= "classpath:hibernate.cfg.xml" ></property>
     </bean>
     
     <bean id= "transactionManager"  class = "org.springframework.orm.hibernate5.HibernateTransactionManager" >
         <property name= "sessionFactory"  ref= "sessionFactory" ></property>
     </bean>
     <tx:annotation-driven transaction-manager= "transactionManager" />


第七步 完成互相注入关系(在dao里面使用hibernateTemplate)

(1)在dao注入hibernateTemplate对象

(2)在hibernateTemplate对象中注入sessionFactory

1
2
3
4
5
6
public  class  UserAction  extends  ActionSupport{
     private  UserService userService;
     public  void  setUserService(UserService userService) {
         this .userService = userService;
     }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Transactional
public  class  UserService {
     private  UserDao userDao;
     public  void  setUserDao(UserDao userDao) {
         this .userDao = userDao;
     }
}
/**
问题:如果在service类上面没有添加注解,出现异常
 
问题:只读模式下(FlushMode.NEVER/MANUAL)写操作不被允许:把你的Session改成FlushMode.COMMIT/AUTO或者清除事务定义中的readOnly标记。
  
错误原因:
           OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。
           然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session,在请求过后再接除该sessionFactory的绑定,
最后closeSessionIfNecessary根据该session是否已和transaction绑定来决定是否关闭session。
在这个过程中,若HibernateTemplate 发现自当前session有不是readOnly的transaction,就会获取到FlushMode.AUTO Session,使方法拥有写权限。
也即是,如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete操作权限,如果没有transaction,并且没有另外人为地设flush model的话,则doFilter的整个过程都是Flush.NEVER。
所以受transaction(声明式的事务)保护的方法有写权限,没受保护的则没有。
*/
1
public  interface  UserDao {}
1
public  class  UserDaoImpl  extends  HibernateDaoSupport  implements  UserDao {}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<bean id= "userAction"  class = "com.my.action.UserAction"  scope= "prototype" >
         <property name= "userService"  ref= "userService" ></property>
     </bean>
     <bean id= "userService"  class = "com.my.service.UserService" >
         <property name= "userDao"  ref= "userDaoImpl" ></property>
     </bean>
     <bean id= "userDaoImpl"  class = "com.my.dao.UserDaoImpl" >
         <property name= "sessionFactory"  ref= "sessionFactory" ></property>
     </bean>
<!--  
这一部分可以另外创建一个xml文件(比如user.xml),再引入bean.xml中的约束,
最后在bean.xml中引入这个文件< import  resource= "classpath:user.xml" />
适合多人开发。
-->


最后结构图:

wKioL1keYY2jfDiCAABJH-PMCAs256.png-wh_50


测试:启动服务器(我试过tomcat和resin),如果没有报错,并且数据库中存在数据表,则说明成功。

注意:数据库必须有,表可以没有;log4j.properties是一个可以显示详细日志信息的配置文件。


补:

在web.xml中在配置如下,原因是防止"no session"问题

1
2
3
4
5
6
7
8
9
<filter>
           <filter-name>openSessionInViewFilter</filter-name>
           <filter- class >org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter- class >
       </filter>
       
       <filter-mapping>
           <filter-name>openSessionInViewFilter</filter-name>
           <url-pattern>/*</url-pattern>
       </filter-mapping>