Spring與Struts2整合

來源:互聯網
上載者:User

這裡需要用到struts2-spring-plugin-2.0.11.jar檔案

首先是web.xml檔案

<?xml version="1.0" encoding="UTF-8"?><br /><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"<br />xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />xsi:schemaLocation="http://java.sun.com/xml/ns/javaee<br />http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><br /><filter><br /><filter-name>struts2</filter-name><br /><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class><br /></filter><br /><filter-mapping><br /><filter-name>struts2</filter-name><br /><url-pattern>/*</url-pattern><br /></filter-mapping></p><p><!-- 啟動Web伺服器時,便載入Spring容器 --><br /><listener><br /><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class><br /></listener></p><p><welcome-file-list><br /><welcome-file>loginSpring.jsp</welcome-file><br /></welcome-file-list><br /></web-app>

然後是同樣位於WEB-INF目錄下的applicationContext.xml檔案

<?xml version="1.0" encoding="UTF-8"?><br /><beans xmlns="http://www.springframework.org/schema/beans"<br />xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />xsi:schemaLocation="http://www.springframework.org/schema/beans<br />http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"></p><p><!-- 理論上來說,這裡<bean/>的id值可以隨意命名 --><br /><!-- 但是下面的那個對應具體的Action類的id值【即Struts2SpringPlugin】就必須與struts.xml中的class值相同 --><br /><bean id="loginSpringService" class="com.jadyer.service.impl.LoginServiceImpl"/></p><p><!-- 將scope設為prototype就是指:每過來一個請求,都會產生當前類的一個執行個體 --><br /><!-- 這裡<property name=""/>中的name值應該與com.jadyer.action.LoginSpringAction類中的loginService成員變數的名字相同 --><br /><!-- 這裡其中<property name=""/>中的ref的值對應的就是上面配置的<bean/>的id值 --><br /><bean id="Struts2SpringPlugin" class="com.jadyer.action.LoginSpringAction" scope="prototype"><br /><property name="loginService" ref="loginSpringService" /><br /></bean></p><p></beans><br /><!-- ***********【<bean>中的singleton與設計模式中的Singleton】**************************** --><br /><!-- 不過Spring中的<bean scope="singleton">與設計模式中的Singleton有些不同 --><br /><!-- 設計模式中的Singleton只是針對一個JVM而言,它只會產生類的唯一的一個執行個體 --><br /><!-- 而Spring中的singleton只是針對一個IoC容器,它只會產生類的唯一的一個執行個體 --><br /><!-- 如果應用啟動時有兩個IoC容器,那麼在整個JVM運行中,該類就會產生兩個執行個體 --><br /><!-- *************【關於Strust2的校正架構以及scope="prototype"】************************** --><br /><!-- 將Struts2和Spring整合時,若前台表單應用了Struts2的校正架構 --><br /><!-- 當第一個輸入錯誤的內容時,校正架構生效,表單中就會提示校正資訊 --><br /><!-- 然後再接著輸入正確的內容,我們會離奇的發現,提交表單時沒有反應 --><br /><!-- 這時因為IoC容器預設使用唯一的一個Ation執行個體來處理使用者所有請求 --><br /><!-- 當第一次校正架構提示錯誤資訊時,那麼該執行個體中已經包含了錯誤訊息 --><br /><!-- 緊接著第二次表單請求時,它就發現在該Action執行個體中還存在錯誤訊息 --><br /><!-- 我們可以在Action中驗證一下,範例程式碼如下所示: --><br /><!--<br /> @Override<br /> public void validate() {<br /> Map map = this.getFieldErrors();<br /> Set set = map.keySet();<br /> for (Iterator iter = set.iterator(); iter.hasNext();) {<br /> System.out.println(map.get(iter.next()));<br /> }<br /> }<br /> --><br /><!-- 然後我們在前台表單中第一次輸入錯誤的內容,然後第二次也輸入錯誤的內容 --><br /><!-- 這時我們會發現前台中出現了兩條相同的錯誤提示訊息,然後對比控制台輸出 --><br /><!-- 究其原因是Struts2和Struts1不同,它的Action是有狀態的,即成員變數 --><br /><!-- 所以Struts2的Action交給Spring管理時,應定義scope="prototype" --><br /><!-- 這就表示每次使用Ation時,它都會為我們new一個Action執行個體出來 --><br /><!-- ********************************************************************************* -->

然後是位於classpath下的struts.xml檔案

<?xml version="1.0" encoding="UTF-8" ?><br /><!DOCTYPE struts PUBLIC<br /> "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br /> "http://struts.apache.org/dtds/struts-2.0.dtd"></p><p><struts><br /><package name="struts2" extends="struts-default"><br /><action name="springplugin" class="Struts2SpringPlugin"><br /><result>/loginSpringResult.jsp</result><br /><result name="input">/loginSpring.jsp</result><br /></action><br /></package><br /></struts><br /><!-- *****************【Struts2與Spring整合的關鍵點】************************************************************* --><br /><!-- Spring的IOC容器可以看作是一個大的工廠,它裡面維護了很多很多的<bean/> --><br /><!-- 當我們需要某個<bean>的時候,Spring的IOC工廠就會直接把我們需要的東西給我們 --><br /><!-- 這個IOC工廠裡面可以維護的是一般的JavaBean、業務類、DAO類等等 --><br /><!-- 也就是說凡是我們能想到的,或者程式中用到的Java類等等,都可以由IOC容器來管理 --><br /><!-- Struts1.X和Struts2.X都是通過Plugin外掛程式的方式,但二者相對於Spring的配置方式還是不太一樣的 --><br /><!-- *****************【淺析Spring外掛程式中的struts-plugin.xml檔案】**************************************************** --><br /><!-- 查看struts2-spring-plugin-2.0.11.jar裡面的struts-plugin.xml檔案發現裡面定義了一個<bean/> --><br /><!-- <bean/>的類型是com.opensymphony.xwork2.ObjectFactory --><br /><!-- <bean/>的名字是spring --><br /><!-- <bean/>對應的類org.apache.struts2.spring.StrutsSpringObjectFactory --><br /><!-- 也就是說,該外掛程式真正啟動並執行就是struts2-spring-plugin-2.0.11.jar中的StrutsSpringObjectFactory類 --><br /><!-- 接下來它又配置了一個常量,常量的名字是struts.objectFactory,常量的值是spring --><br /><!-- 實際上這個常量的名字就是在引用StrutsSpringObjectFactory類 --><br /><!-- 換句話說struts.objectFactory屬性對應StrutsSpringObjectFactory類,然後再查看Struts2中該屬性的說明 --><br /><!-- 將Struts2的org.apache.struts2.default.properties全域屬性檔案的第38行的解說文字翻譯過來就是 --><br /><!-- 翻譯:如果被指定的話,那麼預設的對象工廠就可以被覆蓋掉了 --><br /><!-- 說明:當接收到一個請求的時候,Struts2架構本身的ObjectFactory就會為我們產生一個Action執行個體 --><br /><!-- 當我們整合Spring之後,就可以由Spring協助我們產生Action執行個體,然後自動注入Action執行個體裡面的屬性 --><br /><!-- 在Spring外掛程式中定義好com.opensymphony.xwork2.ObjectFactory的<bean>並配置struts.objectFactory屬性後 --><br /><!-- 那麼產生Action執行個體的工作就可以由Struts2本身轉交給Spring來完成了 --><br /><!-- 補充:Struts2本身是由WebWork發展起來的,實際上WebWork本身就提供了一個IOC容器,但是Struts2拋棄了這個容器 --><br /><!-- 因為它覺得Spring的實現已經非常非常好了,它就沒有必要再去【重新發明輪子】,就沒必要再去重新做這件事情了 --><br /><!-- 因此它就直接引用了Spring的IOC容器,於是它就為我們提供了Spring外掛程式的整合方式 --><br /><!-- 另外:在struts-plugin.xml中還配置了spring-default包,裡面定義了兩個攔截器。我們還用不到它們,暫時無需理會 --><br /><!-- 我們只要知道:配置好Spring外掛程式後,對象的工廠便由Struts2轉化到了Spring,變成由Spring來完成這個工作 --><br /><!-- *****************【<action/>中的class值一定要與<bean/>中的id值相同】********************************************* --><br /><!-- 伺服器啟動時,Struts2會根據這裡的class值到applicationContext.xml中通過id值匹配<bean/> --><br /><!-- 也就是說拿Struts2SpringPlugin到Spring設定檔中尋找id為Struts2SpringPlugin的<bean/> --><br /><!-- 然後才會由Spring自動執行個體化名為Struts2SpringPlugin的<bean/>中的class對應的Action --><br /><!-- 也就說,這裡的class的值一定一定要與Spring設定檔中的<bean/>的id值一致 --><br /><!-- 這樣子,Spring才會自動進行映射,自動進行裝配 --><br /><!-- ************************************************************************************************************ -->

用於輸入使用者名稱和密碼的loginSpring.jsp頁面

<%@ page language="java" pageEncoding="UTF-8"%><br /><%@ taglib prefix="s" uri="/struts-tags"%></p><p><h2>Struts2整合Spring</h2></p><p><h3><font color="red">提示:</font>程式設定的使用者名稱和密碼各為<font color="blue"><strong>admin</strong></font>和<font color="blue"><strong>jadyer</strong></font></h3><br /><h3><font color="red">注意:</font>使用者名稱或密碼不正確時將停留在該頁面不動</h3></p><p><s:form action="springplugin" theme="simple"><br />姓名:<s:textfield name="username"/><br/><br />密碼:<s:password name="password"/><br/><br /><s:submit value="整合測試"/><br /></s:form>

當使用者名稱和密碼正確時登入成功的loginSpringResult.jsp頁面

<%@ page pageEncoding="UTF-8"%><br /><h2>Login Success</h2>

用到的service層的介面和實作類別

package com.jadyer.service;<br />/**<br /> * Spring推薦面向介面編程<br /> */<br />public interface LoginService {<br />/**<br /> * 判斷是否登入成功<br /> */<br />public boolean isLogin(String username, String password);<br />}</p><p>package com.jadyer.service.impl;<br />import com.jadyer.service.LoginService;<br />public class LoginServiceImpl implements LoginService {<br />public boolean isLogin(String username, String password) {<br />if ("admin".equals(username) && "jadyer".equals(password)) {<br />return true;<br />}else{<br />return false;<br />}<br />}<br />}

最後是用到的Action類

package com.jadyer.action;</p><p>import com.jadyer.service.LoginService;<br />import com.opensymphony.xwork2.ActionSupport;</p><p>@SuppressWarnings("serial")<br />public class LoginSpringAction extends ActionSupport {<br />private String username;<br />private String password;</p><p>/* 關於username和password對應的setter和getter略 */</p><p>private LoginService loginService;</p><p>//loginService成員變數並不是由我們自己主動進行set的,是由Spring的IOC容器協助我們完成的<br />//因此只要為它提供一個setXxx()方法就可以了,而不需要提供getXxx()方法<br />public void setLoginService(LoginService loginService) {<br />this.loginService = loginService;<br />}</p><p>@Override<br />public String execute() throws Exception {<br />if(loginService.isLogin(username, password)){<br />return SUCCESS;<br />}else{<br />return INPUT;<br />}<br />}<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.