到目前爲止,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>