Struts+Spring整合3
struts與<nobr>spring</nobr>三種整合方法_3
一個更好的解決方法是將 Strut 動作管理委託給 Spring。您可以通過在 struts-config
動作對映中註冊一個代理來實現。代理負責在 Spring 環境中查詢 Struts 動作。由於動作在 Spring 的控制之下,所以它可以填充動作的 JavaBean 屬性,併為應用諸如 Spring 的 AOP 攔截器之類的特性帶來了可能。
清單 5 中的 Action
類與清單 4 中的相同。但是 struts-config 有一些不同:
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <!DOCTYPE struts-config PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
- "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
- <struts-config>
- <form-beans>
- <form-bean name="searchForm"
- type="org.apache.struts.validator.DynaValidatorForm">
- <form-property name="isbn" type="java.lang.String"/>
- </form-bean>
- </form-beans>
- <global-forwards type="org.apache.struts.action.ActionForward">
- <forward name="welcome" path="/welcome.do"/>
- <forward name="searchEntry" path="/searchEntry.do"/>
- <forward name="searchSubmit" path="/searchSubmit.do"/>
- </global-forwards>
- <action-mappings>
- <action path="/welcome" forward="/WEB-INF/pages/welcome.htm"/>
- <action path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/>
- <action path="/searchSubmit"
- type="org.springframework.web.struts.DelegatingActionProxy" |(1)
- input="/searchEntry.do"
- validate="true"
- name="searchForm">
- <forward name="success" path="/WEB-INF/pages/detail.jsp"/>
- <forward name="failure" path="/WEB-INF/pages/search.jsp"/>
- </action>
- </action-mappings>
- <message-resources parameter="ApplicationResources"/>
- <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
- <set-property
- property="pathnames"
- value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
- </plug-in>
- <plug-in
- className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/>
- </plug-in>
- </struts-config>
清單 5 是一個典型的 struts-config.xml 檔案,只有一個小小的差別。它註冊 Spring 代理類的名稱,而不是宣告動作的類名,如(1)處所示。DelegatingActionProxy 類使用動作對映名稱查詢 Spring 環境中的動作。這就是我們使用 ContextLoaderPlugIn
宣告的環境。
將一個 Struts 動作註冊為一個 Spring bean 是非常直觀的,如清單 6 所示。我利用動作對映使用 <bean>
標記的名稱屬性(在這個例子中是 "/searchSubmit
")簡單地建立了一個 bean。這個動作的 JavaBean 屬性像任何 Spring bean 一樣被填充:
清單 6. 在 Spring 環境中註冊一個 Struts 動作
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
- "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>
- <bean name="/searchSubmit"
- class="ca.nexcel.books.actions.SearchSubmit">
- <property name="bookService">
- <ref bean="bookService"/>
- </property>
- </bean>
- </beans>
動作委託解決方法是這三種方法中最好的。Struts 動作不瞭解 Spring,不對程式碼作任何改變就可用於非 Spring 應用程式中。RequestProcessor
的改變不會影響它,並且它可以利用 Spring AOP 特性的優點。
動作委託的優點不止如此。一旦讓 Spring 控制您的 Struts 動作,您就可以使用 Spring 給動作補充更強的活力。例如,沒有 Spring 的話,所有的 Struts 動作都必須是執行緒安全的。如果您設定 <bean>
標記的 singleton 屬性為“false”,那麼不管用何種方法,您的應用程式都將在每一個請求上有一個新生成的動作物件。您可能不需要這種特性,但是把它放在您的工具箱中也很好。您也可以利用 Spring 的生命週期方法。例如,當例項化 Struts 動作時,<bean>
標記的 init-method 屬性被用於執行一個方法。類似地,在從容器中刪除 bean 之前,destroy-method 屬性執行一個方法。這些方法是管理昂貴物件的好辦法,它們以一種與 Servlet 生命週期相同的方式進行管理。
前面提到過,通過將 Struts 動作委託給 Spring 框架而整合 Struts 和 Spring 的一個主要的優點是:您可以將 Spring 的 AOP 攔截器應用於您的 Struts 動作。通過將 Spring 攔截器應用於 Struts 動作,您可以用最小的代價處理橫切關注點。
雖然 Spring 提供很多內建攔截器,但是我將向您展示如何建立自己的攔截器並把它應用於一個 Struts 動作。為了使用攔截器,您需要做三件事:
- 建立攔截器。
- 註冊攔截器。
- 宣告在何處攔截程式碼。
這看起來非常簡單的幾句話卻非常強大。例如,在清單 7 中,我為 Struts 動作建立了一個日誌記錄攔截器。 這個攔截器在每個方法呼叫之前列印一句話:
|
這個攔截器非常簡單。before()
方法在攔截點中每個方法之前執行。在本例中,它列印出一句話,其實它可以做您想做的任何事。下一步就是在 Spring 配置檔案中註冊這個攔截器,如清單 8 所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
- "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/>
- <bean name="/searchSubmit"
- class="ca.nexcel.books.actions.SearchSubmit">
- <property name="bookService">
- <ref bean="bookService"/>
- </property>
- </bean>
- <!-- Interceptors -->
- <bean name="logger"
- class="ca.nexcel.books.interceptors.LoggingInterceptor"/> |(1)
- <!-- AutoProxies -->
- <bean name="loggingAutoProxy"
- class="org.springframework.aop.framework.autoproxy.
- BeanNameAutoProxyCreator"> |(2)
- <property name="beanNames">
- <value>/searchSubmit</valuesgt; |(3)
- </property>
- <property name="interceptorNames">
- <list>
- <value>logger</value> |(4)
- </list>
- </property>
- </bean>
- </beans>
您可能已經注意到了,清單 8 擴充套件了 清單 6 中所示的應用程式以包含一個攔截器。具體細節如下:
- 在 (1) 處,我註冊了這個攔截器。
- 在 (2) 處,我建立了一個 bean 名稱自動代理,它描述如何應用攔截器。還有其他的方法定義攔截點,但是這種方法常見而簡便。
- 在 (3) 處,我將 Struts 動作註冊為將被攔截的 bean。如果您想要攔截其他的 Struts 動作,則只需要在 "beanNames" 下面建立附加的
<value>
標記。 - 在 (4) 處,當攔截髮生時,我執行了在 (1) 處建立的攔截器 bean 的名稱。這裡列出的所有攔截器都應用於“beanNames”。
就是這樣。就像這個例子所展示的,將您的 Struts 動作置於 Spring 框架的控制之下,為處理您的 Struts 應用程式提供了一系列全新的選擇。在本例中,使用動作委託可以輕鬆地利用 Spring 攔截器提高 Struts 應用程式中的日誌記錄能力。
在本文中,您已經學習了將 Struts 動作整合到 Spring 框架中的三種竅門。使用 Spring 的 ActionSupport
來整合 Struts(第一種竅門中就是這樣做的)簡單而快捷,但是會將 Struts 動作與 Spring 框架耦合在一起。如果您需要將應用程式移植到一個不同的框架,則需要重寫程式碼。第二種解決方法通過委託 RequestProcessor
巧妙地解開程式碼的耦合,但是它的可擴充套件性不強,並且當 Struts 的 RequestProcessor
變成一系列命令時,這種方法就持續不了很長時間。第三種方法是這三種方法中最好的:將 Struts 動作委託給 Spring 框架可以使程式碼解耦,從而使您可以在您的 Struts 應用程式中利用 Spring 的特性(比如日誌記錄攔截器)。
三種 Struts-Spring 整合竅門中的每一種都被實現成一個完整可用的應用程式
你可以通過這個連結引用該篇文章:http://pearlkeeper.bokee.com/tb.b?diaryId=15898825
相關文章
- [我]Struts+Spring整合Spring
- [我]Struts+Spring的整合Spring
- 如何組合Struts+Spring?Spring
- struts+spring action應配置為scope="prototype"(轉)Spring
- 請各位Struts+Spring 改寫Jive的建議Spring
- SSM學習筆記3——整合 SpringMVC、整合SSMSSM筆記SpringMVC
- Spring整合Disruptor3Spring
- FreeMarker整合Spring 3Spring
- Spring Cache與Ehcache 3整合Spring
- CherryPy3 與 IIS 6.0 整合
- (九) SpringBoot起飛之路-整合/整合Swagger 2 And 3Spring BootSwagger
- Spring Boot 快速整合 Ehcache3Spring Boot
- Atlas 2.1.0 實踐(3)—— Atlas整合HIveHive
- SpringMVC(3)- 校驗框架、SSM整合SpringMVC框架SSM
- Unity3D整合到iOS工程Unity3DiOS
- Spring3+MyBatis 整合多方法使用SpringMyBatis
- 求EJB3 + MyBatis整合的經驗MyBatis
- SprongBoot3整合Knife4jboot
- 加速Java應用開發速度3:單元/整合測試+持續整合Java
- 整合學習demo(3) oob_bagging
- Spring Boot 整合 SpringDoc Swagger 3Spring BootSwagger
- Nuxt3實戰系列之整合ElementPlusUIUXUI
- Unity3D整合騰訊語音GVoice SDKUnity3D
- ViCANdo新版本釋出(PART3)| OpenCV整合OpenCV
- vue-cli3整合typescript,sass variables,多頁打包VueTypeScript
- SMSSDK的Unity3D的兩種整合方式Unity3D
- Flowable 6.6.0 表單 - 3.Spring 整合 - 3.1 FormEngineFactoryBeanSpringORMBean
- S2S3H4 整合程式碼示例S3
- 整合雲和企業資料的 3 種方法
- Scratch3之AI整合 - flappy bird AI版本AIAPP
- 智慧整合介面:I3 ISA-95 的應用
- [SpringCloud教程]3. Eureka服務註冊中心整合SpringGCCloud
- springcloud - alibaba - 3 - 整合config - 更新完畢SpringGCCloud
- Vue3學習(五)之整合HTTP庫axiosVueHTTPiOS
- Spring和cxf3的整合,以maven的方式SpringMaven
- Spring+SpringMVC+MyBatis整合(easyUI、AdminLte3)SpringMVCMyBatisUI
- D3 力導向圖和 WebGL 的整合使用Web
- PLM整合3D CAD的開發範例3D