程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> SSH框架網上商城項目第1戰之整合Struts2、Hibernate4.3和Spring4.2

SSH框架網上商城項目第1戰之整合Struts2、Hibernate4.3和Spring4.2

編輯:關於JAVA

SSH框架網上商城項目第1戰之整合Struts2、Hibernate4.3和Spring4.2。本站提示廣大學習愛好者:(SSH框架網上商城項目第1戰之整合Struts2、Hibernate4.3和Spring4.2)文章只能為提供參考,不一定能成為您想要的結果。以下是SSH框架網上商城項目第1戰之整合Struts2、Hibernate4.3和Spring4.2正文


       本文開端做一個網上商城的項目,起首從搭建情況開端,一步步整合S2SH。這篇博文重要總結一下若何整合Struts2、Hibernate4.3和Spring4.2。

        整合三年夜框架得先從搭建各部門情況開端,也就是說起首得把Spring,Hibernate和Struts2的情況搭建好,確保它們沒有成績了,再做整合。這篇博文服從的次序是:先搭建Spring情況-->然後搭建Hibernate情況--> 整合Spring和Hibernate --> 搭建Struts2情況 --> 整合Spring和Struts2。

1. 全部項目jar包的治理

        Spring的jar包許多,開辟的時刻建議將它們分個類,然後順次添加到User Library,便利治理,也了如指掌。這裡我總結一下全部SSH所須要的根本jar包,看下圖:


        從圖中可以看出,起首將Spring的jar分為四類:spring-4.2.4-core、spring-4.2.4-aop、spring-4.2.4-persistence和spring-4.2.4-web。將spring的焦點包都放到core中,與aop相干的都放到aop中,與耐久化(與Hibernate整合)相干的放到persistence中,與web(與struts2整合)相干的放到web中。每一個部門都有哪些jar包呢?請看上面的截圖:

  


        注:以上每一個分類的包中,並不是包括本來包中一切的jar,有些jar文件並沒有效到,等詳細項目須要的時刻再往裡加就好了,上圖是包管項目標情況可以搭建所須要的的最根本的jar包。

2.搭建Spring情況

       下面的jar包截圖是最初整合好的一切jar包,剛開端搭建情況的時刻不須要一次性全體加出去,可以一點一點的加,如許也更利於懂得每一個部門的jar包都有甚麼感化,固然,一次都加出去也是可以的。

2.1 添加設置裝備擺設文件beans.xml和響應的jar包

        新建一個工程,然後添加在User Library中添加本身的庫,這裡重要添加兩個,即spring-4.2.4-core和spring4.2.4-aop,添加jar包不再贅述。添加完了後,在src目次下添加beans.xml文件,這個文件的模板網上許多,Spring自帶的例子裡也有,考一份過去就行,見下圖:


2.2 測試Spring的IoC情況

        我們寫一個通俗的java類java.util.Date類來測試一下Spring IoC能否正常,假如在測試法式中能正常注入,則解釋Spring的IoC情況搭建勝利,上面我們寫一個測試用例:

/** 
 * @Description TODO(采取Spring的注解調試,僅僅支撐Spring3.1及以上) 
 * @author Ni Shengwu 
 * 
 */ 
/* 
 * Spring3.1後多了個spring-test-4.2.4.RELEASE.jar包,這個jar包專門用來支撐JUnit基於注解的測試的,該jar包在spring-4.2.4-core中 
 * 該jar包裡有個SpringJUnit4ClassRunner.class,用@RunWith注解加出去便可 
 * 
 * 注解@ContextConfiguration表現將ApplicationContext對象注入出去,就不消像以往那樣在測試法式裡先new了,直接應用 
 */ 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:beans.xml") 
public class SSHTest { 
 
 @Resource 
 private Date date; 
 
 @Test //測試Spring IOC的開辟情況 
 public void springIoc() { 
 System.out.println(date); 
 } 
} 

        最初能正常輸入:Thu Apr 28 22:45:13 CST 2016。解釋Date對象曾經被Spring給注入出去了,從而驗證了Spring IoC功效正常,為此,Spring的情況搭建完成。

3. 搭建Hibernate情況

        Hibernate的情況搭建比擬於Spring要龐雜一些,由於用到了MyEclipse中的逆向工程。我們按以下步調來搭建Hibernate開辟情況:

3.1 添加響應的jar包

        這裡重要是向User Library中添加兩項jar包:hibernate4.3.11和MySQL驅動包mysql-connector-java-5.1.26,不再贅述。

3.2 新建數據庫和表

drop database if exists shop; 
create database shop default character set utf8; 
use shop; 
drop table if exists category; 
create table category 
( 
 /* 種別編號,主動增加 */ 
 id int not null auto_increment, 
 /* 種別稱號 */ 
 type varchar(20), 
 /* 種別能否為熱門種別,熱門種別才有能夠顯示在首頁*/ 
 hot bool default false, 
 /* 設置種別編號為主鍵*/ 
 primary key (id) 
); 

3.3 DB閱讀器銜接到Mysql數據庫

        DB閱讀器指的是MyEclipse中的一個視圖窗口,可以很直不雅的看到MySQL中都有哪些數據庫和表,翻開DB閱讀器的辦法:Window->Open Perspective->DB Browser翻開DB閱讀器任務窗口。假如沒有DB Browser,依照上面:Window->Show View->other->輸出DB Browser,找到翻開便可。

        翻開後,我們開端銜接到MySQL數據庫了,在DB Browser窗口的空白處右鍵->new,就會彈出上面的對話框:

        填好後,點擊Test Driver測試一下,測試經由過程表現DataBase connection Driver曾經設置裝備擺設好,然後finish便可,如許我們就可以在DB閱讀器窗口中看到數據庫MySQL5.6了,右鍵翻開就可以看到數據庫中已有的庫和表了,以下:


3.4 創立xml映照文件和sessionFactory

        sessionFactory是用來創立session的,我們經由過程以下方法創立:工程名右鍵->myeclipse->Add Hibernate Capabilities,假如沒有Add Hibernate Capabilities,就點擊project facets->Install Hibernate Facets,會彈出以下窗口:

        下一步,在MyEclipse中添加Hibernate Support,即hibernate.cfg.xml映照文件和sessionFactory。這裡重要是給sessionFactory建個包,默許包不可。

        下一步,添加驅動,因為我們之前曾經設置裝備擺設好了一個驅動了,所以在這裡直接選擇方才設置裝備擺設好的便可。

        下一步,因為之前我們曾經添加過本身的jar保存,這裡不消選擇,直接finish。

        如許我們就完成了Hibernate設置裝備擺設文件和sessionFactory的創立。上面我們簡略看一下MyEclipse創立的sessionFactory外面都有啥:

public class HibernateSessionFactory { 
 
 private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); //sessionFactory頂用的是線程池技巧 
 private static org.hibernate.SessionFactory sessionFactory; //sessionFactory:創立session的工場 
 
 private static Configuration configuration = new Configuration(); 
 private static ServiceRegistry serviceRegistry; 
 
 static { //類加載時初始化sessionFactory 
 try { 
 configuration.configure(); 
 serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); 
 sessionFactory = configuration.buildSessionFactory(serviceRegistry); //Hibernate4中創立sessionFactory的辦法 
 } catch (Exception e) { 
 System.err.println("%%%% Error Creating SessionFactory %%%%"); 
 e.printStackTrace(); 
 } 
 } 
 private HibernateSessionFactory() { //公有結構辦法阻攔new出對象,包管sessionFactory的單例 
 } 
 
 public static Session getSession() throws HibernateException { 
 Session session = (Session) threadLocal.get(); //從線程池中拿session 
 
 if (session == null || !session.isOpen()) { //假如線程池是空的,或許session翻開掉敗 
 if (sessionFactory == null) { 
 rebuildSessionFactory(); //假如sessionFactory是空的,那就再創立一次,和static部門一樣的 
 } 
 session = (sessionFactory != null) ? sessionFactory.openSession() : null; //sessionFactory不為空就創立一個session 
 threadLocal.set(session); //然後把這個session放到線程池中,下次再拿 
 } 
 
 return session; 
 } 
 
 public static void rebuildSessionFactory() { 
 try { 
 configuration.configure(); 
 serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry(); 
 sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
 } catch (Exception e) { 
 System.err.println("%%%% Error Creating SessionFactory %%%%"); 
 e.printStackTrace(); 
 } 
 } 
 
 public static void closeSession() throws HibernateException { 
 Session session = (Session) threadLocal.get(); 
 threadLocal.set(null); 
 
 if (session != null) { 
 session.close(); 
 } 
 } 
 
 public static org.hibernate.SessionFactory getSessionFactory() {//供給一個公共接口讓外界取得這個單例sessionFactory 
 return sessionFactory; 
 } 
 
 public static Configuration getConfiguration() { 
 return configuration; 
 } 
 
} 

 從創立的HibernateSessionFactory中可以看出,重要用到了單例形式和線程池技巧。也不難懂得。

3.5 經由過程逆向工程生成model、orm映照文件

        上面開端應用逆向工程創立實例對象了,也就是數據庫的表對應的model。在DB Browsera窗口右擊我們方才創立的表shop,選擇Hibernate Reverse Engineering開端創立:

        創立的時刻有兩種方法,基於設置裝備擺設文件的和基於注解的,詳細的看開辟人員心境了,可以選擇:

        然後下一步,選擇一下native主鍵自增方法,然後便完成了逆向工程創立model和orm映照了。

        完成後,會有Category的model生成,同時在hibernate.cfg.xml文件中也會生成響應的映照,後面基於設置裝備擺設文件的和基於注解的在hibernate.cfg.xml中生成的映照時分歧的。

3.6 測試Hibernate耐久化數據庫

        由於這裡還沒有與Spring整合,只是純真的搭建Hibernate開辟情況,所以我們沒有需要應用注解,我們經由過程直接new一個service的方法履行數據入庫。

先寫CategoryService接口和完成類:

public interface CategoryService { 
 public void save(Category category); //用來測試Hibernate情況 
} 
 
public class CategoryServiceImpl implements CategoryService { 
 
 @Override //沒有和Spring整合的情形 
 public void save(Category category) { 
 //經由過程方才生成的sessionFactory獲得session 
 Session session = HibernateSessionFactory.getSession(); 
 try { 
 //手動事務 
 session.getTransaction().begin(); 
 //履行營業邏輯 
 session.save(category); 
 //手動提交 
 session.getTransaction().commit(); 
 } catch(Exception e) { 
 session.getTransaction().rollback(); 
 throw new RuntimeException(e); 
 } finally { 
 HibernateSessionFactory.closeSession(); 
 } 
 } 
} 

        上面在方才的測試用例中添加對Hibernate的測試:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:beans.xml") 
public class SSHTest { 
 
 @Resource 
 private Date date; 
 
 @Test //測試Spring IOC的開辟情況 
 public void springIoc() { 
 System.out.println(date); 
 } 
 
 @Test //測試Hibernate的開辟情況,由於沒有整合,可以直接new 
 public void hihernate() { 
 CategoryService categoryService = new CategoryServiceImpl(); 
 Category category = new Category("男士休閒", true); 
 categoryService.save(category); 
 } 
} 

        我們檢查數據庫,發明多了方才拔出的這項,解釋Hibernate情況沒有成績。至此,Hibernate的開辟情況我們就搭建好了。

4. 整合Spring和Hibernate

        搭建好了Spring和Hibernate的開辟情況後,我們開端整合這二者。整合Spring和Hibernate後便可以應用AOP讓Spring來治理Hibernate的事務了。整合Spring和Hibernate重要從兩年夜方面動手,一是導入需要的jar包,二是設置裝備擺設beans.xml文件。上面我們一步步整合Spring和Hibernate。

4.1 導入響應的jar包

        整合Spring和Hibernate時須要導入的jar包有兩年夜塊,spring4.2.4-persistence和c3p0-0.9.5.1,每塊jar包中的詳細jar文件請拜見下面的截圖,這裡不再贅述。上面開端設置裝備擺設beans.xml文件了。

4.2 設置裝備擺設數據源dataSource

        起首設置裝備擺設一下dataSource,然後hibernate.cfg.xml中響應的部門可以干失落了。由於在Spring中設置裝備擺設好了,Spring會去初始化這個dataSource,也就是說這就交給Spring來完成了,hibernate.cfg.xml中的響應部門可以刪失落了。以下:

<!-- com.mchange.v2.c3p0.ComboPooledDataSource類在c3p0-0.9.5.1.jar包的com.mchange.v2.c3p0包中 --> 
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
 <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
 <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/shop" /> 
 <property name="user" value="root" /> 
 <property name="password" value="root" /> 
</bean> 

        hibernate.cfg.xml中須要干失落的部門:


4.3 設置裝備擺設sessionFactory

        設置裝備擺設sessionFactory是用來發生一個session的,別的HibernateTemplate也能夠,然則這裡采取sessionFactory而不消HibernateTemplate,是由於HibernateTemplate是Spring供給的,依附於Spring,假如哪天不消Spring了,就會報錯。而sessionFactory是Hibernate供給的,沒有成績。HibernateTemplate的依附性太強了。上面看一下詳細設置裝備擺設:

<!-- org.springframework.orm.hibernate4.LocalSessionFactoryBean類在spring-orm-4.2.4.RELEASE.jar包的org.springframework.orm.hibernate4包中 --> 
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
 <property name="dataSource" ref="dataSource" /> 
 <property name="configLocation" value="classpath:hibernate.cfg.xml" /> <!-- 加載hibernate設置裝備擺設文件 --> 
</bean> 

        sessionFactory中的dataSource我們用方才配好的dataSource,用ref屬性援用出去便可,configLocation我們不在這配了,直接加載hibernate.cfg.xml文件,應用hibernate設置裝備擺設文件中的設置裝備擺設,加倍簡練便利。

4.4 設置裝備擺設事務治理器

        設置裝備擺設事務治理器,是用來治理sessionFactory的,如許一切的由sessionFactory發生的session將會有聲明式的治理。設置裝備擺設以下:

<!-- org.springframework.orm.hibernate4.HibernateTransactionManager類spring-orm-4.2.4.RELEASE.jar包的org.springframework.orm.hibernate4包中 --> 
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
 <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

        異樣,sessionFactory我們用方才設置裝備擺設好的sessionFactory,用ref屬性援用出去便可。到這裡就會發明,從下面一向配上去,都是連續串的操作,一個個援用上去。

4.5 設置裝備擺設advice(告訴)

設置裝備擺設advice的目標是指定哪些辦法須要甚麼類型的事務形式。看設置裝備擺設:

<tx:advice id="advice" transaction-manager="transactionManager"> 
 <tx:attributes> 
 <tx:method name="save*" propagation="REQUIRED"/> 
 <tx:method name="update*" propagation="REQUIRED"/> 
 <tx:method name="delete*" propagation="REQUIRED"/> 
 <tx:method name="*" propagation="SUPPORTS"/> 
 </tx:attributes> 
</tx:advice> 

        REQUIRED表現假如存在事務,則支撐以後的事務,假如沒有則創立一個新的事務,這個事務形式運用在一切以save、update和delete開首的辦法上,也就是說對數據庫的增刪改的時刻須要添加事務支撐。SUPPORTS表現假如存在事務,則支撐以後的事務,假如沒有就算了。

4.6 設置裝備擺設AOP切面

<aop:config> 
 <!-- 設置裝備擺設哪些包的類要切入事務 --> 
 <aop:pointcut id="pointcut" expression="execution(* cn.it.shop.service.impl.*.*(..))" /> 
 <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/><!-- 銜接了<span >上</span>面的advice和下面的pointcut --> 
 <!-- aop:pointcut要寫在aop:advisor下面,不然會報錯 --> 
 </aop:config> 

        AOP即面向切面編程,aop:pointcut界說一個切面,expression屬性中設置裝備擺設的意思是一切cn.it.shop.service.impl包下的一切辦法,不論前往值和參數是甚麼,都要切入事務。該包是屬於dao層的,直接操作數據庫的。aop:advice將告訴和切面聯合起來,我們直接應用下面設置裝備擺設好的advice和pointcut,將其引入出去便可。如許設置裝備擺設好了後,意思就是說,但凡cn.it.shop.service.impl包下的辦法都須要切入事務治理,詳細地,以save、update、delete開首的辦法應用REQUIED方法,其他辦法應用SUPPORTS方法。如許就很好懂得這個設置裝備擺設的意思了。
4.7 測試整合成果
        之前搭建Hibernate情況的時刻,我們測試是直接new了一個Service來操作數據庫,由於其時還沒有和Spring整合。如今經由過程設置裝備擺設beans.xml後,讓Spring去治理Hibernate的事務了,所以如今的測試要把Service交給Spring治理,經由過程Spring注入出去,而且依附sessionFactory,假如能拔出數據到數據庫,則解釋聲明事務OK。
        起首,我們要在Spring的設置裝備擺設文件beans.xml中配一下這個Service:
<bean id="categoryService" class="cn.it.shop.service.impl.CategoryServiceImpl"> 
    <property name="sessionFactory" ref="sessionFactory" /><!-- 依附的sessionFactory用我們之前配好的sessionFactory--> 
</bean>
        其次,我們須要在CategoryService接口和它的完成類CategoryServiceImpl中增長一個辦法用來測試整合後的情形:

public interface CategoryService { 
 public void save(Category category); //用來測試Hibernate情況 
 public void update(Category category); //用來測試Spring和Hibernate整合後 
} 
 
public class CategoryServiceImpl implements CategoryService { 
 
 @Override //沒有和Spring整合的情形 
 public void save(Category category) { 
 //經由過程對象類獲得session 
 Session session = HibernateSessionFactory.getSession(); 
 try { 
 //手動事務 
 session.getTransaction().begin(); 
 //履行營業邏輯 
 session.save(category); 
 //手動提交 
 session.getTransaction().commit(); 
 } catch(Exception e) { 
 session.getTransaction().rollback(); 
 throw new RuntimeException(e); 
 } finally { 
 HibernateSessionFactory.closeSession(); 
 } 
 
 } 
 /*Spring和Hibernate全部後*/ 
 private SessionFactory sessionFactory; //界說一個sessionFactory 
 
 //當須要應用sessoinFactory的時刻,Spring會將sessionFactory注入出去 
 public void setSessionFactory(SessionFactory sessionFactory) { 
 this.sessionFactory = sessionFactory; 
 } 
 protected Session getSession() { 
 //從以後線程獲得session,假如沒有則創立一個新的session 
 return sessionFactory.getCurrentSession(); 
 } 
 
 @Override //Spring和Hibernate整合後的情形 
 public void update(Category category) { 
 getSession().update(category); 
 } 
} 

        如今我們可以去測試類中增加測試辦法,來測試Spring和Hibernate整合後的成果了:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations="classpath:beans.xml") 
public class SSHTest { 
 
 @Resource 
 private Date date; 
 
 @Resource 
 private CategoryService categoryService; 
 
 @Test //測試Spring IOC的開辟情況 
 public void springIoc() { 
 System.out.println(date); 
 } 
 
 @Test //測試Hibernate的開辟情況,由於沒有整合,可以直接new 
 public void hihernate() { 
 CategoryService categoryService = new CategoryServiceImpl(); 
 Category category = new Category("男士休閒", true); 
 categoryService.save(category); 
 } 
 
 @Test //測試Hibernate和Spring整合後 
 public void hibernateAndSpring() { 
 categoryService.update(new Category(1, "休閒女式", true)); //categoryService經由過程Spring從下面注入出去的 
 } 
} 

        然後我們檢查數據庫,發明id=1的category被修正成了休閒女式了,解釋更新勝利。至此,Spring和Hibernate整分解功。

5. 搭建Struts2情況
5.1 添加響應的設置裝備擺設和jar包
        struts2運轉所需的jar包我放在struts2.3.41的Library中了,直接引入便可,不再贅述。別的,還要對web.xml文件停止設置裝備擺設,設置裝備擺設以下:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
 <display-name>E_shop</display-name> 
 <welcome-file-list> 
 <welcome-file>index.jsp</welcome-file> 
 </welcome-file-list> 
 
 <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>*.action</url-pattern> 
 </filter-mapping> 
 
</web-app> 

        如上,我們設置裝備擺設了一個StrutsPrepareAndExecuteFilter過濾器,並將過濾器的url-pattern設置為*.action,即一切.action後綴的都邑起首經由這個過濾器,這也是struts2的進口處。
5.2 創立Action而且設置裝備擺設到struts.xml文件中
        我們創立一個Action以下:

public class CategoryAction extends ActionSupport { 
 private CategoryService categoryService; //設置categoryService是為了很直不雅的看出與Spring整合前後的分歧 
 
 public void setCategoryService(CategoryService categoryService) { 
 this.categoryService = categoryService; 
 } 
 
 public String update() { 
 System.out.println("----update----"); 
 System.out.println(categoryService); //整合前後輸入分歧 
 return "index"; 
 } 
 
 public String save() { 
 System.out.println("----save----"); 
 System.out.println(categoryService);//整合前後輸入分歧 
 return "index"; 
 } 
} 

        然後我們設置裝備擺設struts.xml文件,該文件放在src目次下:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
 "http://struts.apache.org/dtds/struts-2.3.dtd"> 
 
<struts> 
 <package name="shop" extends="struts-default"> 
 <!-- category_update.actiocan: 拜訪update辦法 --> 
 <action name="category_*" class="cn.it.shop.action.CategoryAction" method="{1}"> 
 <result name="index">/index.jsp</result> 
 </action> 
 </package> 
 
</struts> 

5.3 測試Struts2情況
       測試辦法是:寫一個jsp拜訪Action,假如Action可以創立,則表現struts2情況OK。即struts2的連續串流程可以正常走完:jsp-->struts.xml-->Action-->struts.xml-->jsp,如許struts2的情況就算搭好了。我們寫一個簡略的index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
 <head> 
 <title>My JSP 'index.jsp' starting page</title> 
 </head> 
 
 <body> 
 <!-- 上面兩種寫法都可以拜訪 --></span> 
 <a href="${pageContext.request.contextPath }/category_update.action">拜訪update</a> 
 <a href="category_save.action">拜訪save</a> 
 </body> 
</html> 

        然後我們安排以下工程,翻開tomcat辦事器,在閱讀器中輸出:http://localhost:8080/E_shop/index.jsp後,能湧現正常jsp頁面,然後點擊兩個按鈕,依然跳轉到index.jsp,然後我們看一下掌握台的輸入信息:
----update---- 
null 
----save---- 
null  

        解釋struts2的一條線走完了,情況沒有成績,至此,struts2開辟情況搭建終了。
        我們看掌握台輸入了null,也就是說categoryService是空,也就是說基本沒拿到categoryService,由於我們沒有和Spring停止整合,沒有被注入出去,所以null是正常的。我們沿著掌握台輸入的信息往上翻,會發明一條信息:Choosing bean (struts) for (com.opensymphony.xwork2.ObjectFactory)。括號裡是struts解釋沒有和Spring整合前,Action是有Struts2發生的。

6. Spring和Struts2整合
6.1 添加響應的jar包
        Spring與Struts2整應時的jar包重要在spring4.2.4-web外面,外面包含struts2-spring-plugin-2.3.24.1.jar,導包不再贅述。
6.2 把Action和它的依附交給Spring治理
        在Spring的設置裝備擺設文件beans.xml中設置裝備擺設Action和它的依附,我們今朝只要一個Action,設置裝備擺設以下所示:

<bean id="date" class="java.util.Date" /> 
<bean id="categoryAction" class="cn.it.shop.action.CategoryAction" scope="prototype"> 
 <property name="categoryService" ref="categoryService" /> <!-- 依附的categoryService用下面和Hibernate整應時設置裝備擺設好的categoryService --> 
</bean> 

6.3 修正struts.xml中的設置裝備擺設
        本來在struts.xml中,class屬性對應的是詳細Action的完整限制名,如今將class屬性的值改成Spring中設置裝備擺設action的id值,即categoryAction,以下:

<struts> 
 <package name="shop" extends="struts-default"> 
 
 <!-- class對應的是Spring中設置裝備擺設該Action的id值,由於要交給Spring治理 --> 
 <action name="category_*" class="categoryAction" method="{1}"> 
 <result name="index">/index.jsp</result> 
 </action> 
 </package> 
 
</struts> 

6.4 設置裝備擺設監聽器
        在web.xml中設置裝備擺設監聽器ContextLoaderListener,如許在辦事器啟動的時刻便可以加載Spring的設置裝備擺設文件了。以下:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
 <display-name>E_shop</display-name> 
 <welcome-file-list> 
 <welcome-file>index.jsp</welcome-file> 
 </welcome-file-list> 
 
 <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>*.action</url-pattern> 
 </filter-mapping> 
 
 <!-- web.xml中監聽器的啟動優先級要高於過濾器,所以配鄙人面無所謂的 --> 
 <listener> 
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
 </listener> 
 
 <context-param> 
 <param-name>contextConfigLocation</param-name> 
 <param-value>classpath:beans.xml</param-value> 
 </context-param> 
 
</web-app> 

6.5 測試整合成果
        我們在Action中新加一句更新數據庫的語句,以下:

public class CategoryAction extends ActionSupport { 
 
 private Category category;//設置一個公有成員變量吸收url帶過去的參數,留意上面要寫好get和set辦法 
 
 private CategoryService categoryService; 
 
 public void setCategoryService(CategoryService categoryService) { 
 this.categoryService = categoryService; 
 } 
 
 public String update() { 
 System.out.println("----update----"); 
 System.out.println(categoryService);//因為曾經和Spring整合,所以可以拿到這個categoryService了,打印出來就不是null了 
 categoryService.update(category); //新加一條語句,來更新數據庫 
 return "index"; 
 } 
 
 public String save() { 
 System.out.println("----save----"); 
 System.out.println(categoryService); 
 return "index"; 
 } 
 
 public Category getCategory() { 
 return category; 
 } 
 
 public void setCategory(Category category) { 
 this.category = category; 
 } 
} 

        然後我們修正一下index.jsp文件,以下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
 <head> 
 <title>My JSP 'index.jsp' starting page</title> 
 </head> 
 
 <body> 
 <a href="${pageContext.request.contextPath }/category_update.action?category.id=2&category.type=gga&category.hot=false">拜訪update</a> 
 <a href="category_save.action">拜訪save</a> 
 </body> 
</html> 

        然後我們安排以下工程,翻開tomcat辦事器,在閱讀器中輸出:http://localhost:8080/E_shop/index.jsp後,能湧現正常jsp頁面,然後點擊“拜訪update”按鈕,依然跳轉到index.jsp,然後我們看一下掌握台的輸入信息:

----update---- 
cn.it.shop.service.impl.CategoryServiceImpl@7c5ecf80 
Hibernate: update category set hot=?, type=? where id=? 

       我們看到可以輸入categoryService這個對象的信息了,也能夠輸入履行update語句時的SQL語句,然後我們查詢一下數據庫,發明id=2的數據的type被更新為gga,hot更新為false。我們沿著掌握台輸入的信息往上翻,會發明一條信息:Choosing bean (spring) for (com.opensymphony.xwork2.ObjectFactory),括號裡為spring,與下面的情形比較可知,Struts2在與Spring整合後,Action交給了Spring去治理了。
        至此,Struts2、Hibernate4和Spring4整合任務曾經全體完成,接上去便可以在SSH情況下停止開辟了!

本文引見的SSH整合中所須要的完全jar包:收費下載

全部項目標源碼下載地址:http://www.jb51.net/article/86099.htm

原文地址:http://blog.csdn.net/eson_15/article/details/51277324

(注:到最初供給全部項目標源碼下載!迎接年夜家珍藏或存眷)

以上就是本文的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved