到目前为止,Struts二、Hibernate、Spring框架都过了一遍了。也写过了Spring怎么与Struts2整合,Spring与Hibernate整合…本博文主要讲解SSH的整合html
整合步骤:java
需求:员工与部门之间的关系。当操做员工的时候,能够获得员工所在的部门mysql
web.xml配置文件
初始化struts功能、spring容器web
<?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】spring
<?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配置文件配置着一些公用的信息sql
<?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>
需求:获取用户信息的时,可以获得用户拥有的角色。express
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; } }
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; } }
User.hbm.xmlapache
<?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.xmlmarkdown
<?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添加到容器上,而且获得sessionFactory对象session
@Repository public class UserDao { @Autowired private SessionFactory sessionFactory; public User findbyId(int id) { return (User) sessionFactory.getCurrentSession().get(User.class, id); } }
获得UserDao对象,把UserService添加到容器中
@Service public class UserService { @Autowired private UserDao userDao; public User findbyId(int id) { return userDao.findbyId(id); } }
设置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; } }
<?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>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> 员工的姓名:${user.username} </body> </html>
咱们在学习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>