zoukankan      html  css  js  c++  java
  • SSH框架整合

    ssh框架整合步骤如下

    提示:myeclipse环境、工程环境、tomcat环境的jdk保持一致
    1、新建一个工程,把工程的编码为utf-8
    2、把jsp的编码形式改成utf-8
    3、把jar包放入到lib下
    4、建立三个src folder
    src 存放源代码
    config 存放配置文件
    hibernate 存放hibernate的配置文件
    spring 存放spring的配置文件
    struts 存放struts的配置文件
    struts.xml
    test 存放单元测试
    5、在src下建立包
    cn.itcast.s2sh.domain
    持久化类和映射文件
    6、编写dao层和service层
    7、写spring的配置文件
    1、写sessionFactory
    2、测试
    3、写dao和service
    4、测试
    8、写action
    9、写spring的配置文件
    把action注入到spring容器中

          <bean id="personAction"              class="cn.itcast.s2sh.struts2.action.sh.PersonAction" scope="prototype">

    scope为”prototype”保证了action的多实例
    10、在web.xml
    加入spring的监听器
    加入struts2的过滤器
    11、请求

    详细代码

    持久化类与映射文件

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <!-- 
            用来描述一个持久化类
            name  类的全名
            table 可以不写  默认值和类名一样 
            catalog  数据库的名称  一般不写
         -->
        <class name="cn.itcast.s2sh.domain.sh.Person">
            <!-- 
                标示属性  和数据库中的主键对应
                name  属性的名称
                column 列的名称
             -->
            <id name="pid" column="pid" length="200" type="java.lang.Long">
                <!-- 
                    主键的产生器
                      就该告诉hibernate容器用什么样的方式产生主键
                 -->
                <generator class="increment"></generator>
            </id>
            <!-- 
                描述一般属性
             -->
            <property name="pname" column="pname" length="20" type="string">
            </property>
    
            <property name="psex" column="psex" length="10" type="java.lang.String"></property>
        </class>
    </hibernate-mapping>

    dao

    package cn.itcast.s2sh.sh.dao.impl;
    
    import java.io.Serializable;
    
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    
    import cn.itcast.s2sh.domain.sh.Person;
    import cn.itcast.s2sh.sh.dao.PersonDao;
    
    public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao{
    
        @Override
        public void savePerson(Person person) {
            // TODO Auto-generated method stub
            this.getHibernateTemplate().save(person);
        }
    
        @Override
        public Person getPesonById(Serializable id) {
            // TODO Auto-generated method stub
            return (Person) this.getHibernateTemplate().load(Person.class, id);
        }
    
    }

    service

    package cn.itcast.s2sh.sh.service.impl;
    
    import java.io.Serializable;
    
    import cn.itcast.s2sh.domain.sh.Person;
    import cn.itcast.s2sh.sh.dao.PersonDao;
    import cn.itcast.s2sh.sh.service.PersonService;
    
    public class PersonServiceImpl implements PersonService{
        private PersonDao personDao;
    
        public PersonDao getPersonDao() {
            return personDao;
        }
    
        public void setPersonDao(PersonDao personDao) {
            this.personDao = personDao;
        }
    
        @Override
        public void savePerson(Person person) {
            // TODO Auto-generated method stub
            this.personDao.savePerson(person);
        }
    
        @Override
        public Person getPersonByID(Serializable id) {
            // TODO Auto-generated method stub
            return this.personDao.getPesonById(id);
        }
    }

    spring配置文件

    applicationcontext.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
        <import resource="applicationContext-db.xml"/>
        <import resource="applicationContext-person.xml"/>
    </beans>

    applicationContext-db.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
        <!--  
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="configLocation">
                <value>classpath:hibernate/hibernate.cfg.xml</value>
            </property>
        </bean>
        -->
        <bean
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <value>classpath:jdbc.properties</value>
            </property>
        </bean>
    
    
        <bean id="dataSource" destroy-method="close"
            class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${jdbc.driverClassName}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </bean>
    
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource">
                <ref bean="dataSource" />
            </property>
            <property name="mappingResources">
            <!-- list all the annotated PO classes -->
                <list>
                    <value>
                        cn/itcast/s2sh/domain/sh/Person.hbm.xml
                    </value>
                </list>
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">
                        org.hibernate.dialect.MySQLDialect
                    </prop>
                    <prop key="hibernate.hbm2ddl.auto">
                        update
                    </prop>
                <prop key="hibernate.show_sql">
                        true
                    </prop>
                    <prop key="hibernate.format_sql">
                        true
                    </prop>
                </props>
            </property>
        </bean>
    
        <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory">
                <ref bean="sessionFactory"/>
            </property>
        </bean>
    
        <tx:advice id="tx" transaction-manager="transactionManager">
            <tx:attributes>
                <tx:method name="save*" read-only="false"/>
                <tx:method name="update*" read-only="false"/>
                <tx:method name="delete*" read-only="false"/>
                <!-- 
                    * 代表了除了上述的三种情况的以外的情况
                 -->
                <tx:method name="*" read-only="true"/>
            </tx:attributes>
        </tx:advice>
    
        <aop:config>
            <aop:pointcut expression="execution(* cn.itcast.s2sh.sh.service.impl.*.*(..))" id="perform"/>
            <aop:advisor advice-ref="tx" pointcut-ref="perform"/>
        </aop:config>
    </beans>

    applicationContext-person.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
        <bean id="personDao" class="cn.itcast.s2sh.sh.dao.impl.PersonDaoImpl">
            <property name="sessionFactory">
                <ref bean="sessionFactory"/>
            </property>
        </bean>
    
        <bean id="personService" class="cn.itcast.s2sh.sh.service.impl.PersonServiceImpl">
            <property name="personDao">
                <ref bean="personDao"/>
            </property>
        </bean>
    
        <bean id="personAction" class="cn.itcast.s2sh.struts2.action.sh.PersonAction" scope="prototype">
            <property name="personService">
                <ref bean="personService"/>
            </property>
        </bean>
    </beans>

    struts.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
        "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <struts>
        <constant name="struts.devMode" value="true"/>
        <include file="struts2/struts-person.xml"></include>
        <!--  <constant name="struts.objectFactory" value="spring" />-->
    </struts>   

    struts-person.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
        "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <struts>
       <package name="person" namespace="/" extends="struts-default">
            <action name="personAction_*" method="{1}" class="personAction">
                <result name="index">index.jsp</result>
            </action>
       </package>
    </struts>   

    web.xml文件的编写

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
        <!-- 整合Spring -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/applicationContext.xml</param-value>
        </context-param>
    
         <filter>
            <filter-name>OpenSessionInViewFilter</filter-name>
            <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>OpenSessionInViewFilter</filter-name>
            <url-pattern>*.action</url-pattern>
        </filter-mapping>
    
        <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>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

    三大框架整合原理

    1、三大框架的作用

    • struts2是一个mvc框架
    • spring容器
      1、利用ioc和di做到了完全的面向接口编程
      2、由于spring的声明式事务处理,使程序员不再关注事务
      3、dao层和service层的类是单例的,但是action层是多例
    • hibernate
      就是一个数据库的ormapping的框架

      2、整合原理
      1、当tomcat启动时,做的事情
      1、因为在web.xml中,

                     <listener>
                        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
                     </listener>
                     <context-param>
                          <param-name>contextConfigLocation</param-name>
                          <param-value>classpath:spring/applicationContext.xml</param-value>
                     </context-param>
                     <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>

    所以在启动的时候,执行的是

    
             ContextLoaderListener
             contextInitialized
          this.contextLoader = createContextLoader();
             加载spring的配置文件
        这里有一个固定的参数con的textConfigLocation
          可以指定classpath路径下的spring的配置文
           也可以任意位置指定配置文件  spring*.xml    WEB-INF/任意多个任意文件夹/spring-*.xml
      如果没有指定固定参数,则查找默认的加载路径:WEB-INF/applicationContext.xml
                              this.contextLoader.initWebApplicationContext(event.getServletContext());
     启动spring容器
     总结:当tomcat启动的时候,spring容器就启动了,这个时候service层和dao层所有的单例类就创建对象了
      struts2容器:
      加载了default.properties,struts-default.xml,struts-plugin.xml,struts.xml

    2、请求一个url时,发生的事情:
    1、在引入jar包时,导入了struts2-spring-plugin-2.1.8.1.jar包,该jar中有一个文件struts-plugin.xml

                    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" 
                          class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
                    <constant name="struts.objectFactory" value="spring" />

    2、由于上面的配置改变了action的生成方式,action由StrutsSpringObjectFactory生成,经过查找是由SpringObjectFactory中的buidBean方法
    生成的

                   try {
             o = appContext.getBean(beanName);
              } catch (NoSuchBeanDefinitionException e) {
                  lass beanClazz = getClassInstance(beanName);
            o = buildBean(beanClazz, extraContext);
            }

    3、由上面的代码可以看出,先从spring容器中查找相应的action,如果没有找到,再根据反射机制创建action,
    beanName就是struts配置文件class属性的值,所以class属性的值和spring中ID的值保持一致

    openSessionView模式

    在web.xml中
    
          <filter>
      <filter-name>OpenSessionInViewFilter</filter-name>
      <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
     </filter>
     <filter-mapping>
      <filter-name>OpenSessionInViewFilter</filter-name>
      <url-pattern>*.action</url-pattern>
     </filter-mapping>
    
    <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>

    OpenSessionInView在第一个位置,struts2的过滤器在第二个位置

    1、加入了OpenSessionInView模式解决了懒加载的问题
    2、因为延迟了session的关闭时间,所以在session一级缓存中的数据会长时间停留在内存中,
    增加了内存的开销

    错误

    在整合SSH框架的时候出现了很多错误

    java.lang.OutOfMemoryError: PermGen space

    内存不够,可能是tomcat,或者是myeclipse内存不够的原因

    参考链接

    Tomcat中JVM内存溢出及合理配置 - ye1992的专栏 - 博客频道 - CSDN.NET

    [转]MyEclipse内存不足问题 - - ITeye技术网站

    myeclipse修改内存大小不足_百度经验

    错误

    这里写图片描述

    这个错误很奇怪,困扰很久,原来的那种写法不知道为什么就是不能成功,而且在tomcat8中刷新一下就可以了,但在tomcat7中不行,而且如果tomcat中有了一个新的写法的程序时,原来写法的程序也可以用了,tomcat程序之间可以互相影响吗???找到一个最接近的解释,不知道对不对。

    参考链接

    上网站时输入密码后提示could not open Hibernate Session for transaction;nested exception is_百度知道

    注解方式实现整合SSH框架

    spring配置文件修改为

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
            http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
        <!--  
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="configLocation">
                <value>classpath:hibernate/hibernate.cfg.xml</value>
            </property>
        </bean>
        -->
        <bean
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="locations">
                <value>classpath:jdbc.properties</value>
            </property>
        </bean>
    
    
        <bean id="dataSource" destroy-method="close"
            class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="${jdbc.driverClassName}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
        </bean>
    
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource">
                <ref bean="dataSource" />
            </property>
            <property name="mappingResources">
            <!-- list all the annotated PO classes -->
                <list>
                    <value>
                        cn/itcast/s2sh/domain/sh/Person.hbm.xml
                    </value>
                </list>
            </property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">
                        org.hibernate.dialect.MySQLDialect
                    </prop>
                    <prop key="hibernate.hbm2ddl.auto">
                        update
                    </prop>
                <prop key="hibernate.show_sql">
                        true
                    </prop>
                    <prop key="hibernate.format_sql">
                        true
                    </prop>
                </props>
            </property>
        </bean>
    
        <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
            <property name="sessionFactory">
                <ref bean="sessionFactory"/>
            </property>
        </bean>
    
        <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory">
                <ref bean="sessionFactory"/>
            </property>
        </bean>
    
        <context:component-scan base-package="cn.itcast.s2sh"></context:component-scan>
    
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
    
    </beans>

    dao

    package cn.itcast.s2sh.sh.dao.impl;
    
    import java.io.Serializable;
    
    import javax.annotation.Resource;
    
    import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
    import org.springframework.stereotype.Repository;
    
    import cn.itcast.s2sh.domain.sh.Person;
    import cn.itcast.s2sh.sh.dao.PersonDao;
    
    @Repository("personDao")
    public class PersonDaoImpl implements PersonDao{
        @Resource(name="hibernateTemplate")
        private HibernateTemplate hibernateTemplate;
        @Override
        public void savePerson(Person person) {
            // TODO Auto-generated method stub
            this.hibernateTemplate.save(person);
        }
    
        @Override
        public Person getPesonById(Serializable id) {
            // TODO Auto-generated method stub
            return  (Person) this.hibernateTemplate.load(Person.class, id);
        }
    
    }

    service

    package cn.itcast.s2sh.sh.service.impl;
    
    import java.io.Serializable;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import cn.itcast.s2sh.domain.sh.Person;
    import cn.itcast.s2sh.sh.dao.PersonDao;
    import cn.itcast.s2sh.sh.service.PersonService;
    
    @Service("personService")
    public class PersonServiceImpl implements PersonService{
        @Resource(name="personDao")
        private PersonDao personDao;
    
        @Override
        @Transactional(readOnly=false)
        public void savePerson(Person person) {
            // TODO Auto-generated method stub
            this.personDao.savePerson(person);
        }
    
        @Override
        public Person getPersonByID(Serializable id) {
            // TODO Auto-generated method stub
            Person person = this.personDao.getPesonById(id);
            return person;
        }
    }

    action

    package cn.itcast.s2sh.struts2.action.sh;
    
    import javax.annotation.Resource;
    
    import org.apache.struts2.ServletActionContext;
    import org.springframework.beans.factory.annotation.Configurable;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Controller;
    
    import cn.itcast.s2sh.domain.sh.Person;
    import cn.itcast.s2sh.sh.service.PersonService;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.config.entities.ActionConfig;
    import com.opensymphony.xwork2.config.impl.ActionConfigMatcher;
    
    @Controller("personAction")
    @Scope("prototype")
    public class PersonAction extends ActionSupport{
        @Resource(name="personService")
        private PersonService personService;
    
        public String savePerson(){
            Person person = new Person();
            person.setPname("afds");
            this.personService.savePerson(person);
            return null;
        }
    
        public String showPerson(){
            System.out.println("annoation aaaaaaaaaaaaaaaaa");
            Person person = this.personService.getPersonByID(2L);
            ServletActionContext.getRequest().setAttribute("person", person);
            return "index";
        }
    }

    完成

  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/jjx2013/p/6223675.html
Copyright © 2011-2022 走看看