• SSH第一篇【整合SSH步骤、OpenSessionInView】


    前言

    到目前为止,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>
        &lt;!&ndash; # AOP配置 &ndash;&gt;
        <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>
    

    这里写图片描述


  • 相关阅读:
    前端开发资料、实用小工具
    冒泡排序法,二分查找法
    数组练习
    一维数组练习题
    for循环输出菱形
    练习题
    课堂练习
    gO语言的安装和环境变量的配置
    PO BO VO DTO POJO DAO 概念及其作用
    BaseServlet
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7202945.html
Copyright © 2020-2023  润新知