Spring+Hibernate+Struts(SSH)프레임 통합 실전

45137 단어 SpringHibernateStruts
SSH 프레임 워 크 통합
앞에서 말 했 듯 이 아직도 유행 하 는 주류 프레임 워 크 라 고 SSM 이 나 온 지 오래 되 었 는데 SSH 는 말 할 것 도 없다.나 는 그렇게 생각 하지 않 는 다.현재 많은 회사 들 이 사용 하 는 오래된 프로젝트 는 ssh 이 므 로 주류 구조 로 바 꾸 려 면 원가 가 필요 하 다.그리고 예 를 들 어 금융 IT 라 는 부분 에서 데이터베이스 dao 층 은 hibenate 를 추천 합 니 다.인터넷 을 제외 하고 높 은 병행 과 관련 되 기 때문에 dao 층 은 my batis 를 사용 하고 데이터 의 상호작용 효율 이 빠 릅 니 다.따라서 SSH 는 무시 할 수 없다.
SSH
SSH 는 struts+spring+hibenate 의 통합 프레임 워 크 로 현재 유행 하 는 웹 응용 프로그램의 오픈 소스 프레임 워 크 입 니 다.
SSH 프레임 워 크 를 통합 하 는 시스템 은 직책 상 4 층 으로 나 뉜 다.표현 층,업무 논리 층,데이터 지구 층 과 도 메 인 모듈 층 으로 개발 자 들 이 단기 적 으로 구조 가 뚜렷 하고 재 활용 성 이 좋 으 며 유지 가 편리 한 웹 응용 프로그램 을 구축 하도록 도와 준다.그 중에서 Struts 를 시스템 의 전체적인 기초 구조 로 사용 하여 MVC 의 분 리 를 책임 지고 Struts 구조의 모델 부분 에서 업무 전환 을 통제 하 며 Hibernate 프레임 워 크 를 이용 하여 지구 층 에 지원 을 제공 하고 Spring 을 관리 하 며 struts 와 hibenate 를 관리 합 니 다.구체 적 인 방법 은 대상 을 대상 으로 하 는 분석 방법 으로 수요 에 따라 모델 을 제시 하여 이 모델 들 을 기본 적 인 자바 대상 으로 실현 한 다음 에 기본 적 인 DAO(Data Access Objects)인 터 페 이 스 를 작성 하고 Hibernate 의 DAO 실현 을 제시 하 며 Hibernate 구조 로 이 루어 진 DAO 류 로 자바 류 와 데이터 베이스 간 의 전환 과 방문 을 실현 하고 마지막 으로 Spring 에서 관리 하 는 것 이다.struts 와 hibenate 를 관리 합 니 다.
바 이 두 백과
2.SSH 와 관련 된 부분


3.신속 한 배치 환경
여 기 는 고객 을 저장 하 는 작은 데모 로 통합 SSH 를 보 여 줍 니 다.
1.필요 한 jar 패키지 가 져 오기
1).Struts 2 프레임 워 크
* struts-2.3.24\apps\struts2-blank\WEB-INF\lib\*.jar        -- Struts 2 에 필요 한 모든 jar 가방
* struts2-spring-plugin-2.3.24.jar                          ---Struts 2 스프링 통합 플러그 인 패키지

2).Hibernate 프레임 워 크
* hibernate-release-5.0.7.Final\lib\required\*.jar          -- Hibernate 프레임 에 필요 한 jar 패키지
* slf4j-api-1.6.1.jar                                       -- 로그 인터페이스
* slf4j-log4j12-1.7.2.jar                                   -- 로그 구현
* mysql-connector-java-5.1.7-bin.jar                        -- MySQL 드라이버

3).스프링 프레임
*IOC 핵심 패키지
*AOP 핵심 패키지
*JDBC 템 플 릿 과 트 랜 잭 션 핵심 패키지
*Spring 통합 JUnit 테스트 패키지
*Spring 통합 Hibernate 핵심 패키지
*Spring 통합 Struts 2 핵심 패키지

2.웹.xml 에 spring 과 struts 의 관련 코드 를 설정 합 니 다.
1)struts 2 핵심 필터 설정
모든 것 을 차단 하 는 것 으로 정의 합 니 다.

 <!--         -->
 <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>
2)스프링 의 모니터 설정
서비스 가 시작 되면 spring 설정 파일 을 먼저 불 러 옵 니 다.

<!--   Spring    WEB     -->
  <listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
3)기본 로드 경로 설정

 <!--        Web-INF   ,              -->
 <context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:applicationContext.xml</param-value>
</context-param>
요약:웹.xml 모든 코드 는

<!--   Spring    WEB     -->
  <listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <!--        Web-INF   ,              -->
 <context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath: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>
2.src 에서 관련 프로필 작성
1)spring:applicationContext.xml
관련 제약 조건 가 져 오기

<?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:context="http://www.springframework.org/schema/context"
 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.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd
 http://www.springframework.org/schema/tx 
 http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
2)hibernate:hibernate.cfg.xml
관련 제약 조건 가 져 오기 및 데이터베이스 설정

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
 "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 
 <session-factory>
  <!--      -->
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.url">jdbc:mysql://192.168.174.130:3306/SSH</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  
  <!--      -->
  <property name="hibernate.show_sql">true</property>
  <property name="hibernate.format_sql">true</property>
  <property name="hibernate.hbm2ddl.auto">update</property>
  
  <!--   C3P0     -->
  <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
  
  <!--                -->
  <!--        -->
  <mapping resource="com/clj/domain/Customer.hbm.xml"/>
 </session-factory>
 
</hibernate-configuration> 
3)log4j.properties 설정

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout
4)struts2:struts.xml
관련 제약 조건 가 져 오기

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
 "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
</struts>
요약:src 에 필요 한 프로필 그림

3.dao 층 설정
인터페이스 와 구현 클래스 를 정의 합 니 다.

public interface CustomerDao {
 public void save(Customer customer);
}

public class CustomerDaoImpl implements CustomerDao {
 public void save(Customer customer) {
  
 }

}
4.업무 계층 인터페이스 와 실현 클래스 정의

package com.clj.service;

import com.clj.domain.Customer;

public interface CustomerService {
 public void save(Customer customer);
}

package com.clj.service;

import org.springframework.transaction.annotation.Transactional;

import com.clj.dao.CustomerDao;
import com.clj.domain.Customer;
/**
 *       
 * @author Administrator
 *
 */
public class CustomerServiceImpl implements CustomerService{//      
 public void save(Customer customer) {
  
 }

}
5.pojo 클래스 정의
hibenate 는 pojo 류 를 조작 하여 데이터베이스 시트 를 조작 하여 대상 관계 매 핑 을 실현 합 니 다.

package com.clj.domain;

public class Customer {
 
 private Long cust_id;
 private String cust_name;
 private Long cust_user_id;
 private Long cust_create_id;
 private String cust_source;
 private String cust_industry;
 private String cust_level;
 private String cust_linkman;
 private String cust_phone;
 private String cust_mobile;
 
 public Long getCust_id() {
  return cust_id;
 }
 public void setCust_id(Long cust_id) {
  this.cust_id = cust_id;
 }
 public String getCust_name() {
  return cust_name;
 }
 public void setCust_name(String cust_name) {
  this.cust_name = cust_name;
 }
 public Long getCust_user_id() {
  return cust_user_id;
 }
 public void setCust_user_id(Long cust_user_id) {
  this.cust_user_id = cust_user_id;
 }
 public Long getCust_create_id() {
  return cust_create_id;
 }
 public void setCust_create_id(Long cust_create_id) {
  this.cust_create_id = cust_create_id;
 }
 public String getCust_source() {
  return cust_source;
 }
 public void setCust_source(String cust_source) {
  this.cust_source = cust_source;
 }
 public String getCust_industry() {
  return cust_industry;
 }
 public void setCust_industry(String cust_industry) {
  this.cust_industry = cust_industry;
 }
 public String getCust_level() {
  return cust_level;
 }
 public void setCust_level(String cust_level) {
  this.cust_level = cust_level;
 }
 public String getCust_linkman() {
  return cust_linkman;
 }
 public void setCust_linkman(String cust_linkman) {
  this.cust_linkman = cust_linkman;
 }
 public String getCust_phone() {
  return cust_phone;
 }
 public void setCust_phone(String cust_phone) {
  this.cust_phone = cust_phone;
 }
 public String getCust_mobile() {
  return cust_mobile;
 }
 public void setCust_mobile(String cust_mobile) {
  this.cust_mobile = cust_mobile;
 }
 @Override
 public String toString() {
  return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name
    + ", cust_user_id=" + cust_user_id + ", cust_create_id="
    + cust_create_id + ", cust_source=" + cust_source
    + ", cust_industry=" + cust_industry + ", cust_level="
    + cust_level + ", cust_linkman=" + cust_linkman
    + ", cust_phone=" + cust_phone + ", cust_mobile=" + cust_mobile
    + "]";
 }
 
}
6.customer.hbm.xml 정의
이 프로필 은 Customer 라 는 pojo 클래스 와 관련 이 있 습 니 다.이 파일 은 Customer pojo 클래스 와 같은 가방 에 두 어야 합 니 다.

<?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>
 
 <class name="com.clj.domain.Customer" table="cst_customer">
  <id name="cust_id" column="cust_id">
   <generator class="native"/>
  </id>
  
  <property name="cust_name" column="cust_name"/>
  <property name="cust_user_id" column="cust_user_id"/>
  <property name="cust_create_id" column="cust_create_id"/>
  <property name="cust_source" column="cust_source"/>
  <property name="cust_industry" column="cust_industry"/>
  <property name="cust_level" column="cust_level"/>
  <property name="cust_linkman" column="cust_linkman"/>
  <property name="cust_phone" column="cust_phone"/>
  <property name="cust_mobile" column="cust_mobile"/>
  
 </class>
 
</hibernate-mapping>
프로젝트 구축 개요 도

4.demo 의 저장 고객 초기 프레젠테이션
여기 서 먼저 초 략 적 인 정의 지구 층 을 heibernate 에 건 네 주 고 업무 층 은 struts 2 를 건 네 주 며 인 스 턴 스 를 만들어 spring 에 건 네 줍 니 다.
1.고객 을 저장 하 는 인터페이스 를 정의 하고 form 폼 을 이용 하여 데 이 터 를 제출 합 니 다.
도 메 인 이름 에 따 르 면 struts 2 의 마스크 방식 으로 접근 합 니 다.

<FORM id=form1 name=form1
  action="${pageContext.request.contextPath }/customer_add.action"
  method=post>
   <!--table    -->
</FORM>
2.struts.xml 에서 요청 을 받 아들 이 고 action 이름과 방법 에 따라 지정 한 action 으로 이동 하여 지정 한 방법 을 실행 합 니 다.
spring 통합 struts 2 방식 1:action 은 struts 2 프레임 워 크 에서 관리 합 니 다.
*가 져 온 struts 2-spring-plugin-2.3.24.jar 패키지 가 설정 파일 struts-plugin.xml 을 가지 고 있 기 때문에 이 설정 파일 에는 다음 과 같은 코드 가 있 습 니 다.
*   상수 하 나 를 엽 니 다.이 상수 가 열 리 면 아래 상수 에서 사용 할 수 있 습 니 다.
*struts.object Factory.spring.autoWire=name,이 상수 는 Action 클래스 로 Bean 대상 을 자동 으로 조립 할 수 있 습 니 다!

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
 "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
 "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
 <!--       -->
  <package name="crm" extends="struts-default" namespace="/">
   <!--      Action -->
   <!--    :aciton struts2    -->
      <action name="customer_*" class="com.clj.web.action.CustomerAction" method="{1}"/> 
    </package>
 </struts>
3.spring 의 applicationContext.xml 에 대응 하 는 bean 및 사 무 를 설정 합 니 다.
spring 에서 IOC(반전 제어)의 특성 을 이용 하여 인 스 턴 스 를 만 드 는 작업 을 spring 프레임 워 크 관리 에 맡 깁 니 다.

 <bean id="customerService" class="com.clj.service.CustomerServiceImpl">
  <property name="customerDao" ref="customerDao"></property>
 </bean>
 <bean id="customerDao" class="com.clj.dao.CustomerDaoImpl">
  <property name="hibernateTemplate" ref="hibernateTemplate"/>
 </bean>
 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
  <!--   sessionFactory -->
  <property name="sessionFactory"/>
 </bean>
</beans>
4.지구 층 구현 클래스 관련 코드 작성
여기 서 hibenate 가 제공 하 는 템 플 릿 류 를 이용 하여 내부 에 session 을 봉 하여 session 의 방법 을 호출 할 수 있 습 니 다.

/**
 *    
 * 
 * @author Administrator
 *
 */
public class CustomerDaoImpl implements CustomerDao {
 //          (     (hibernate  ,     session))
 private HibernateTemplate hibernateTemplate;
 
 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  this.hibernateTemplate = hibernateTemplate;
 }

 /**
  *     
  */
 public void save(Customer customer) {
  System.out.println("   :    ");
  hibernateTemplate().save(customer);
 }

}
5.업무 계층 구현 클래스 관련 코드 작성

package com.clj.service;

import org.springframework.transaction.annotation.Transactional;

import com.clj.dao.CustomerDao;
import com.clj.domain.Customer;
/**
 *       
 * @author Administrator
 *
 */
@Transactional
public class CustomerServiceImpl implements CustomerService{
 private CustomerDao customerDao;
 
 public void setCustomerDao(CustomerDao customerDao) {
  this.customerDao = customerDao;
 }

 //      
 public void save(Customer customer) {
  System.out.println("   ,    ");
  customerDao.save(customer);
 }

}
6.action 관련 코드 작성
여기 struts 2 템 플 릿 클래스 를 통 해

package com.clj.web.action;

import org.apache.struts2.ServletActionContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.clj.domain.Customer;
import com.clj.service.CustomerService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 *       
 * @author Administrator
 *
 */
public class CustomerAction extends ActionSupport implements ModelDriven<Customer>{
 //      new
 private Customer customer=new Customer();
 public Customer getModel() {
  return customer;
 }
 //  service    ,  set  
 private CustomerService customerService;
 
 

 public void setCustomerService(CustomerService customerService) {
  this.customerService = customerService;
 }



 /**
  *     
  * @return
  */
 public String add(){
  System.out.println("WEB ,    ");
  //   :  web   (action struts2  )
  WebApplicationContext context=WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
  CustomerService cs=(CustomerService) context.getBean("customerService");
  //    
  cs.save(customer);return NONE;
 }

 
}
5.프로젝트 최적화 의 통합
1、 spring 통합 struts 2 방식 2:action 은 spring 프레임 워 크 에서 관리 합 니 다.
구체 적 인 Action 류 프로필 applicationContext.xml 의 프로필 에 있 지만 주의:struts.xml 은 수정 이 필요 합 니 다.

<struts>
 <!--       -->
  <package name="crm" extends="struts-default" namespace="/">
   <!--      Action -->
   <!--    :aciton struts2    
   <action name="customer_*" class="com.clj.web.action.CustomerAction" method="{1}"/>-->
   <!--    :action spring  ,class        srping  bean ID    -->
    <action name="customer_*" class="customerAction" method="{1}"></action>
  </package>
</struts>
2.applicationContext.xml 에 Action 클래스 설정
메모:1)Spring 프레임 워 크 는 기본적으로 customerAction 을 생 성 하 는 것 이 하나의 예 이 고 Struts 2 프레임 워 크 는 여러 가지 예 입 니 다.scope="prototype"설정 이 필요 합 니 다.
2)이 때 struts 2 의 자동 조립 이 없습니다.action 에서 customerService 속성 을 수 동 으로 설정 하고 action 류 에서 set 방법 을 생 성 해 야 합 니 다.

<!--        -->
 <!--   :   Aciton,       -->
 <bean id="customerAction" class="com.clj.web.action.CustomerAction" scope="prototype">
  <!--  :struts  action ,      struts-plugin jar ,       
    struts.objectFactory.spring.autoWire = name     ,      ,     set  
      action spring  ,      ,            
  -->
  <property name="customerService" ref="customerService"></property>
</bean>
3.사무 설정
spring 통합 hibenate 방식 1:(hibenate.cfg.xml 가 있 는 프로필.강조:현재 스 레 드 를 연결 할 수 없 는 설정)
이전에 hibenate 를 할 때 hibenate.cfg.xml 는 모두 hibenate 프레임 워 크 에 의 해 관리 되 었 습 니 다.그 프로필 은 session Factory 를 생 성 할 수 있 습 니 다.이 프로필 을 영구적 으로 불 러 와 session Factory 를 가 져 와 공장 생 성 session 을 만 들 고 데이터 의 첨삭 을 변경 할 수 있 습 니 다.이때 그 프로필 은 spring 관리 에 맡 기 고 spring 의 IOC 특성 을 충분히 이용 해 야 합 니 다.
Spring 프레임 워 크 는 HibernateDao Support 의 도구 클래스 를 제공 합 니 다.앞으로 DAO 가 이 클래스 를 계승 할 수 있 습 니 다!!hibenate 핵심 프로필 을 도입 하기 전에 dao 층 에 부모 클래스 HibernateDao Support 를 계승 해 야 합 니 다.이 부모 클래스 내부 에 트 랜 잭 션 템 플 릿 이 봉인 되 어 있 습 니 다.
원본 코드 보기:

1)이에 대응 하 는 지구 층 구현 클래스 를 수정 하여 HibernateDao Support 계승

package com.clj.dao;

import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.clj.domain.Customer;
/**
 *    
 *   HibernateDaoSupport,     HibernateTemplate
 * @author Administrator
 *
 */
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
 //          (     (hibernate  ,     session))
 /*private HibernateTemplate hibernateTemplate;
 
 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  this.hibernateTemplate = hibernateTemplate;
 }*/

 /**
  *     
  */
 public void save(Customer customer) {
  System.out.println("   :    ");
  this.getHibernateTemplate().save(customer);
 }

}
2)비 즈 니스 층 의 양 보 를 수정 하고 트 랜 잭 션 주 해 를 엽 니 다.

package com.clj.service;

import org.springframework.transaction.annotation.Transactional;

import com.clj.dao.CustomerDao;
import com.clj.domain.Customer;
/**
 *       
 * @author Administrator
 *
 */
@Transactional
public class CustomerServiceImpl implements CustomerService{
 private CustomerDao customerDao;
 
 public void setCustomerDao(CustomerDao customerDao) {
  this.customerDao = customerDao;
 }

 //      
 public void save(Customer customer) {
  System.out.println("   ,    ");
  customerDao.save(customer);
 }

}
3)applicationContext.xml 파일 수정
hibenate 프로필 먼저 가 져 오기

<!--   bean,       , spring  ,    hibernate.cfg.xml     -->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
 <!--     :        ,        ,    hibernate.cfg.xml  ,    sessionFactory  -->
  <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
플랫폼 트 랜 잭 션 관리 설정:트 랜 잭 션 을 관리 하 는 데 사 용 됩 니 다.현재 Hibernate 프레임 워 크 를 사용 하고 있 으 므 로 Hibernate 프레임 워 크 의 트 랜 잭 션 관리 자 를 사용 해 야 합 니 다.

<!--            -->
 <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
  <!--     ,session      ,      session -->
  <property name="sessionFactory" ref="sessionFactory"/>
 </bean>
트 랜 잭 션 설명 열기

  <!--         -->
 <tx:annotation-driven transaction-manager="transactionManager"/>
템 플 릿 클래스 설정 을 제거 하고 영구적 인 세 션 팩 토 리 를 설정 합 니 다.

<!--   ,Dao     HibernateDaoSupport,  sessionFactory -->
 <bean id="customerDao" class="com.clj.dao.CustomerDaoImpl">
  <!--<property name="hibernateTemplate" ref="hibernateTemplate"/>-->
  <!--         ,    sessionFactory,      session(   session)-->
  <property name="sessionFactory" ref="sessionFactory"/>
 </bean>
모든 코드 는 다음 과 같 습 니 다.

<?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:context="http://www.springframework.org/schema/context"
 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.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd
 http://www.springframework.org/schema/tx 
 http://www.springframework.org/schema/tx/spring-tx.xsd">
 <!--   bean,       , spring  ,    hibernate.cfg.xml     -->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
 <!--     :        ,        ,    hibernate.cfg.xml  ,    sessionFactory  -->
  <property name="configLocation" value="classpath:hibernate.cfg.xml"/>
 </bean>
 
 <!--            -->
 <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
  <!--     ,session      ,      session -->
  <property name="sessionFactory" ref="sessionFactory"/>
 </bean>
 
 <!--         -->
 <tx:annotation-driven transaction-manager="transactionManager"/>
 
 <!--        -->
 <!--   :   Aciton,       -->
 <bean id="customerAction" class="com.clj.web.action.CustomerAction" scope="prototype">
  <!--  :struts  action ,      struts-plugin jar ,       
    struts.objectFactory.spring.autoWire = name     ,      ,     set  
      action spring  ,      ,            
  -->
  <property name="customerService" ref="customerService"></property>
 </bean>
 <bean id="customerService" class="com.clj.service.CustomerServiceImpl">
  <property name="customerDao" ref="customerDao"></property>
 </bean>
 <bean id="customerDao" class="com.clj.dao.CustomerDaoImpl">
  <!--<property name="hibernateTemplate" ref="hibernateTemplate"/>-->
  <!--         ,    sessionFactory,      session(   session)-->
  <property name="sessionFactory" ref="sessionFactory"/>
 </bean>
 <!--      (hibernate     ,     session),    spring  ,        HibernateDaoSupport,     -->
 <!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
    sessionFactory 
  <property name="sessionFactory"/>
 </bean>-->
</beans>
4)액 션 클래스 수정
업무 층 실현 클래스 를 주입 하 였 기 때문에,이 때 는 업무 층 방법 을 직접 호출 할 수 있 으 며,bean 을 불 러 올 필요 가 없습니다.

package com.clj.web.action;

import org.apache.struts2.ServletActionContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.clj.domain.Customer;
import com.clj.service.CustomerService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 *       
 * @author Administrator
 *
 */
public class CustomerAction extends ActionSupport implements ModelDriven<Customer>{
 //      new
 private Customer customer=new Customer();
 public Customer getModel() {
  return customer;
 }
 //  service    ,  set  
 private CustomerService customerService;
 public void setCustomerService(CustomerService customerService) {
  this.customerService = customerService;
 }
 /**
  *     
  * @return
  */
 public String add(){
  System.out.println("WEB ,    ");
  //   :  web   (action struts2  )
  /*WebApplicationContext context=WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
  CustomerService cs=(CustomerService) context.getBean("customerService");
  //    
  cs.save(customer);*/
  customerService.save(customer);
  return NONE;
 }
}
spring 통합 hibenate 방식 2:(hibenate.cfg.xml 설정 파일 이 없 음)
hibenate 의 핵심 프로필 을 삭제 하려 고 합 니 다.삭제 하기 전에 설정 파일 의 관련 내용 을 spring 의 application Context.xml 파일 에 설정 해 야 합 니 다.
1.hibenate.cfg.xml 파일 의 내용 보기
*데이터베이스 연결 기본 매개 변수(4 대 매개 변수)
*Hibernate 관련 속성
*연결 풀
*맵 파일
2.설정 도입
연결 풀 도입

<!--    C3p0     -->
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  <property name="jdbcUrl" value="jdbc:mysql://192.168.174.130:3306/SSH"/>
  <property name="user" value="root"/>
  <property name="password" value="root"/>
 </bean>
대응 하 는 session Factory 수정:hibenate.cfg.xml 설정 파일 이 없 기 때문에 이 설정 을 수정 하고 연결 풀 에 주입 해 야 합 니 다.
대상 맵 파일 도입:hibenate.cfg.xml 프로필 이 없 기 때문에 이 프로필 을 검색 하지 않 고 주입 해 야 합 니 다.

 <!--   bean,       , spring  ,    hibernate.cfg.xml     -->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  <!--       -->
  <property name="dataSource" ref="dataSource"/>
  <!--     ,      -->
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.format_sql">true</prop>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
   </props>
  </property>
  
  <!--           -->
  <property name="mappingResources">
   <list>
    <value>com/clj/domain/Customer.hbm.xml</value>
   </list>
  
  </property>
 </bean>
현재:applicationContext.xml 모든 코드 는 다음 과 같 습 니 다.

<?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:context="http://www.springframework.org/schema/context"
 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.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd
 http://www.springframework.org/schema/tx 
 http://www.springframework.org/schema/tx/spring-tx.xsd">
 
 <!--    C3p0     -->
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
  <property name="driverClass" value="com.mysql.jdbc.Driver"/>
  <property name="jdbcUrl" value="jdbc:mysql://192.168.174.130:3306/SSH"/>
  <property name="user" value="root"/>
  <property name="password" value="root"/>
 </bean>
 
 <!--   bean,       , spring  ,    hibernate.cfg.xml     -->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  <!--       -->
  <property name="dataSource" ref="dataSource"/>
  <!--     ,      -->
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.format_sql">true</prop>
    <prop key="hibernate.hbm2ddl.auto">update</prop>
   </props>
  </property>
  
  <!--           -->
  <property name="mappingResources">
   <list>
    <value>com/clj/domain/Customer.hbm.xml</value>
   </list>
  
  </property>
 </bean>
 
 <!--            -->
 <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
  <!--     ,session      ,      session -->
  <property name="sessionFactory" ref="sessionFactory"/>
 </bean>
 
 <!--         -->
 <tx:annotation-driven transaction-manager="transactionManager"/>
 
 <!--        -->
 <!--   :   Aciton,       -->
 <bean id="customerAction" class="com.clj.web.action.CustomerAction" scope="prototype">
  <!--  :struts  action ,      struts-plugin jar ,       
    struts.objectFactory.spring.autoWire = name     ,      ,     set  
      action spring  ,      ,            
  -->
  <property name="customerService" ref="customerService"></property>
 </bean>
 <bean id="customerService" class="com.clj.service.CustomerServiceImpl">
  <property name="customerDao" ref="customerDao"></property>
 </bean>
 <!--   ,Dao     HibernateDaoSupport,  sessionFactory -->
 <bean id="customerDao" class="com.clj.dao.CustomerDaoImpl">
  <!--<property name="hibernateTemplate" ref="hibernateTemplate"/>-->
  <!--         ,    sessionFactory,      session(   session)-->
  <property name="sessionFactory" ref="sessionFactory"/>
 </bean>
 <!--      (hibernate     ,     session),    spring  ,        HibernateDaoSupport,     -->
 <!-- <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
    sessionFactory 
  <property name="sessionFactory"/>
 </bean>-->
</beans>
이 때 안심 하고 hibenate.cfg.xml 파일 을 삭제 할 수 있 습 니 다.
이렇게 SSH 가 통합 되 었 습 니 다.
6.Hibernate 템 플 릿 상용 방법
메모:다음 코드 는 인터페이스 에 있 는 프 리 젠 테 이 션 을 생략 합 니 다.(게 으 름 을 피 웠 으 니 초보 자 들 이 알 아 보지 못 할 것 이 라 고 믿 습 니 다)
1)삽입:
지구 층

package com.clj.dao;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.clj.domain.Customer;
/**
 *    
 *   HibernateDaoSupport,     HibernateTemplate
 * @author Administrator
 *
 */
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
 @Override
 public void update(Customer customer) {
  // TODO Auto-generated method stub
  this.getHibernateTemplate().update(customer);
 }
}
실무 층

package com.clj.service;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import com.clj.dao.CustomerDao;
import com.clj.domain.Customer;
/**
 *       
 * @author Administrator
 *
 */
@Transactional
public class CustomerServiceImpl implements CustomerService{
 private CustomerDao customerDao;
 
 public void setCustomerDao(CustomerDao customerDao) {
  this.customerDao = customerDao;
 }
 @Override
 public void update(Customer customer) {
  // TODO Auto-generated method stub
  customerDao.update(customer);
 }
}
테스트 클래스

package com.clj.test;

import java.util.List;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.clj.domain.Customer;
import com.clj.service.CustomerService;

/**
 *   Hiberante        
 * @author Administrator
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {
 @Resource(name="customerService")
 private CustomerService customerService;
 /**
  *     
  */
 @Test
 public void run1(){
  Customer customer=new Customer();
  customer.setCust_id(1L);
  customer.setCust_name("  ");
  customerService.update(customer);
 }
 
}
2)다음은 지 정 된 조회,모든 조회,오프라인 조회 코드
지구 층

package com.clj.dao;

import java.util.List;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.clj.domain.Customer;
/**
 *    
 *   HibernateDaoSupport,     HibernateTemplate
 * @author Administrator
 *
 */
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
 //          (     (hibernate  ,     session))
 /*private HibernateTemplate hibernateTemplate;
 
 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  this.hibernateTemplate = hibernateTemplate;
 }*/

 /**
  *     
  */
 public void save(Customer customer) {
  System.out.println("   :    ");
  this.getHibernateTemplate().save(customer);
 }

 @Override
 public void update(Customer customer) {
  // TODO Auto-generated method stub
  this.getHibernateTemplate().update(customer);
 }

 /**
  *       
  */
 public Customer getById(Long id) {
  return this.getHibernateTemplate().get(Customer.class, id);
 }
 /**
  *     
  */
 @Override
 public List<Customer> findAll() {
  String sql="from Customer";
  List<Customer> list=(List<Customer>) this.getHibernateTemplate().find(sql);
  return list;
 }
 /**
  * QBC    
  */
 @Override
 public List<Customer> findAllByQBC() {
  DetachedCriteria criteria=DetachedCriteria.forClass(Customer.class);
  List<Customer> list=(List<Customer>) this.getHibernateTemplate().findByCriteria(criteria);
  return list;
 }
}
실무 층

package com.clj.service;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import com.clj.dao.CustomerDao;
import com.clj.domain.Customer;
/**
 *       
 * @author Administrator
 *
 */
@Transactional
public class CustomerServiceImpl implements CustomerService{
 private CustomerDao customerDao;
 
 public void setCustomerDao(CustomerDao customerDao) {
  this.customerDao = customerDao;
 }

 //      
 public void save(Customer customer) {
  System.out.println("   ,    ");
  customerDao.save(customer);
 }

 @Override
 public void update(Customer customer) {
  // TODO Auto-generated method stub
  customerDao.update(customer);
 }

 @Override
 public Customer getById(Long id) {
  // TODO Auto-generated method stub
  return customerDao.getById(id);
 }

 @Override
 public List<Customer> findAll() {
  return customerDao.findAll();
 }

 @Override
 public List<Customer> findAllByQBC() {
  // TODO Auto-generated method stub
  return customerDao.findAllByQBC();
 }
}
테스트 클래스

package com.clj.test;

import java.util.List;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.clj.domain.Customer;
import com.clj.service.CustomerService;

/**
 *   Hiberante        
 * @author Administrator
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {
 @Resource(name="customerService")
 private CustomerService customerService;
 /**
  *     
  */
 @Test
 public void run1(){
  Customer customer=new Customer();
  customer.setCust_id(1L);
  customer.setCust_name("  ");
  customerService.update(customer);
 }
 /**
  *          
  */
 @Test
 public void run2(){
  Customer customer=customerService.getById(2L);
  System.out.println(customer);
 }
 /**
  *        
  */
 @Test
 public void run3(){
  List<Customer> list=customerService.findAll();
  System.out.println(list);
 }
 /**
  * QBC(    )
  */
 @Test
 public void run4(){
  List<Customer> list=customerService.findAllByQBC();
  System.out.println(list);
 }
}
질문
1.로 딩 지연 을 사용 할 때 WEB 층 에서 대상 을 조회 할 때 프로그램 에 이상 이 발생 합 니 다!
*로 딩 지연 이 아직 발생 하지 않 았 기 때문에 업무 층 session 대상 은 이미 소각 되 었 기 때문에 조 회 된 자바 빈 대상 은 위탁 관리 대상 이 되 었 습 니 다!
*메모:javassist-3.11.0.GA.jar 패키지(jar 패키지 충돌)를 반드시 삭제 해 야 합 니 다.
2.해결 방법
Spring 프레임 워 크 는 session 대상 이 WEB 층 에서 만 들 고 WEB 층 에서 소각 할 수 있 도록 필 터 를 제공 합 니 다.이 필터 만 설정 하면 됩 니 다.
*단:struts 2 의 핵심 필 터 를 사용 하기 전에 스프링 모니터 를 설정 해 야 합 니 다.

<!--           -->
   <filter>
   <filter-name>OpenSessionInViewFilter</filter-name>
   <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
   <filter-name>OpenSessionInViewFilter</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>
3.프 리 젠 테 이 션 지연 로드
지구 층:load 방법 을 호출 합 니 다.이 방법 은 로드 지연 입 니 다.

/**
  *     
  */
 @Override
 public Customer loadById(long id) {
  // TODO Auto-generated method stub
  return this.getHibernateTemplate().load(Customer.class, id);
 }
실무 층

@Override
 public Customer loadById(long id) {
  // TODO Auto-generated method stub
  return customerDao.loadById(id);
 }
테스트 클래스

@Test
 public void run5(){
  Customer customer=customerService.loadById(2L);
  System.out.println(customer);
 }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기