SSH第一篇【整合SSH步骤、OpenSessionInView】
2018-01-21 00:00
351 查看
前言
到目前为止,Struts2、Hibernate、Spring框架都过了一遍了。也写过了Spring怎么与Struts2整合,Spring与Hibernate整合…本博文主要讲解SSH的整合整合步骤:
1) 引入SSH Jar文件
Struts 核心jar
Hibernate 核心jar
Spring
Core 核心功能
Web 对web模块支持
Aop aop支持
Orm 对hibernate支持
Jdbc/tx jdbc支持包、事务相关包
2)配置文件
Web.xml
初始化struts功能、spring容器
Struts.xml 配置请求路径与映射action的关系
Spring.xml IOC容器配置
bean-base.xml 【公用信息】
bean-service.xml
bean-dao.xml
bean-action.xml
需求:员工与部门之间的关系。当操作员工的时候,可以得到员工所在的部门
引入jar文件
配置文件
web.xml配置文件
初始化struts功能、spring容器<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!--初始化Struts功能--> <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> <!--初始化Spring容器--> <!-- 2. spring 配置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/bean*</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
Struts.xml
配置请求路径与映射action的关系【记得继承着struts-default】<?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="aaa" extends="struts-default"> </package> </struts>
SpringIOC容器配置
该Spring配置文件配置着一些公用的信息<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 1) 连接池实例 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///zhongfucheng"></property> <property name="user" value="root"></property> <property name="password" value="root"></property> <property name="initialPoolSize" value="3"></property> <property name="maxPoolSize" value="6"></property> </bean> <!-- 2) SessionFactory实例创建 --> <!-- 所有的配置都由spring维护(项目中不需要hibernate.cfg.xml啦) --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- a. 连接池 --> <property name="dataSource" ref="dataSource"></property> <!-- b. hibernate常用配置: 方言、显示sql、自动建表等 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <!-- c. 映射配置 --> <property name="mappingLocations"> <list> <value>classpath:zhongfucheng/entity/*.hbm.xml</value> </list> </property> </bean> <!-- 3) 事务配置 --> <!-- # 事务管理器 --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- # 事务增强 --> <!-- <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="*" read-only="false"/> </tx:attributes> </tx:advice> <!– # AOP配置 –> <aop:config> <aop:pointcut expression="execution(* cn.itcast.service.*.*(..))" id="pt"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/> </aop:config>--> <!--4)开启注解扫描器--> <context:component-scan base-package="zhongfucheng"/> <!--5)开启注解处理事务--> <tx:annotation-driven transaction-manager="txManager"/> </beans>
编写entity
需求:获取用户信息的时,能够得到用户拥有的角色。Dept.java
package zhongfucheng.entity; /** * Created by ozc on 2017/5/15. */ public class Dept { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
User.java
package zhongfucheng.entity; /** * Created by ozc on 2017/5/15. */ public class User { private String id; private String username; private Dept dept; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Dept getDept() { return dept; } public void setDept(Dept dept) { this.dept = dept; } }
entity的映射文件
User.hbm.xml<?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 package="zhongfucheng.entity"> <class name="User" table="t_user"> <id name="id" column="user_id"> <generator class="native"></generator> </id> <property name="username" column="userName"></property> <many-to-one name="dept" class="Dept" column="dept_id"/> </class> </hibernate-mapping>
Dept.hbm.xml
<?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 package="zhongfucheng.entity"> <class name="Dept" table="t_dept"> <id name="id" column="deptId"> <generator class="native"></generator> </id> <property name="name" column="deptName"></property> </class> </hibernate-mapping>
编写Dao
把Dao添加到容器上,并且得到sessionFactory对象@Repository public class UserDao { @Autowired private SessionFactory sessionFactory; public User findbyId(int id) { return (User) sessionFactory.getCurrentSession().get(User.class, id); } }
编写Service
得到UserDao对象,把UserService添加到容器中@Service public class UserService { @Autowired private UserDao userDao; public User findbyId(int id) { return userDao.findbyId(id); } }
编写Action
设置Action的实例为多例,得到userService对象,将查询结果存放到request域对象中@Controller @Scope("prototype") public class UserAction extends ActionSupport { @Autowired private UserService userService; @Override public String execute() throws Exception { //假设查询员工的主键为1 int user_id = 1; User user = userService.findbyId(user_id); //得到request对象,把数据存到request中 Map<String, Object> request = ActionContext.getContext().getContextMap(); request.put("user", user); return SUCCESS; } }
Struts2配置文件
<?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="aaa" extends="struts-default"> <action name="show" class="userAction" method="execute"> <result name="success">/show.jsp</result> </action> </package> </struts>
JSP页面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> 员工的姓名:${user.username} </body> </html>
测试效果
OpenSessionInView
我们在学习Hibernate的时候已经说过,Hibernate默认是开启懒加载的。当用到对象的时候才去获取数据…现在我在JSP页面上获取员工的部门是什么,出现了错误为什么呢?Spring的事务控制是在Service层的,当Service层调用完之后,事务就会被提交。然而到了Action层的时候,事务已经关闭了。JSP就获取不到事务关闭后的数据了!
Spring也知道我们Hibernate的懒加载技术,可能使我们老是自己写拦截器去开启Session,直到view层关闭。于是Spring提供了OpenSessionInView供我们使用:在web.xml文件下配置就行了。
<!-- 配置spring的OpenSessionInView模式 【目的:JSp页面访问懒加载数据】 --> <!-- 注意:访问struts时候需要带上*.action后缀 --> <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>*.action</url-pattern> </filter-mapping>
相关文章推荐
- SSH第一篇【整合SSH步骤、OpenSessionInView】
- SSH第一篇【整合SSH步骤、OpenSessionInView】
- SSH整合之-OpenSessionInViewFilter为何无效?
- spring_SSH整合之_OpenSessionInView
- 异常处理:SSH整合中OpenSessionInViewFilter不生效问题的解决
- SSH整合——OpenSessionInViewFilter
- Struts整合Spring 之OpenSessionInView设置
- s2sh01 整合原理和openSessionInView模式
- Spring 和Struts2 整合 特别需要关注Session 关闭的问题:解决方法是使用 OpenSessionInViewFilter
- 关于在SSH项目中使用OpenSessionInViewFilter过滤器后数据库数据不更新的问题
- Spring3.x_Struts2.x_Hibernate3.x整合之OpenSessionInView的实现
- Spring与Hibernate整合中,使用OpenSessionInViewFilter后出现sessionFactory未注入问题
- Spring与Hibernate整合中,使用OpenSessionInViewFilter后出现sessionFactory未注入问题
- spring--openSessionInView的使用步骤
- Java程序员从笨鸟到菜鸟之(八十三)细谈Spring(十二)OpenSessionInView详解及用法
- OpenSessionInViewFilter解决数据库操作表(一对多)延迟加载时session关闭的异常
- Spring配置之OpenSessionInViewFilter
- Open Session In View
- 第一次配置opensessioninview。。写下来。。
- OpenSessionInViewFilter 的配置及作用