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修改内存大小不足_百度经验

错误

SSH框架整合_第1张图片

这个错误很奇怪,困扰很久,原来的那种写法不知道为什么就是不能成功,而且在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";
    }
}

完成

你可能感兴趣的:(tomcat,Hibernate,框架,ssh)