Spring+Hibernate+Struts(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);
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.