您的位置:首页 > 运维架构

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>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: