Spring和struts結合.
上篇中把spring應用到hibernate中,本篇中把spring應用到struts中,首先復習一下struts基礎知識。
[Struts旅程(一)Struts簡介和原理](http://blog.csdn.net/lovesummerforever/article/details/18942381)
[struts旅程(二)Struts登錄示例](http://blog.csdn.net/lovesummerforever/article/details/17348871)
[Struts旅程(三)Struts表單處理器ActionForm(靜態動態)](http://blog.csdn.net/lovesummerforever/article/details/18951649)
[Struts旅程(四)MVC向strutsMVC框架演變過程](http://blog.csdn.net/lovesummerforever/article/details/18963959)
[Struts旅程(五)struts控制器DispatchAction](http://blog.csdn.net/lovesummerforever/article/details/18967831)
[Struts旅程(六)Struts頁面轉發控制ActionForward和ActionMapping](http://blog.csdn.net/lovesummerforever/article/details/19125933)
?????
? ? ? ?Struts調用流程如下圖所示。

看到這幅圖一下子就能了解了struts的原理。Spring的核心就是IOC容器和AOP,所以我們用spring主要是管理業務對象和事務的管理,所以主要是Model層來讓spring管理,這是我們的一種方案。
**第一種集成方案在Action中取得beanFactory**
還記的在上篇文章中,測試的時候是在單元測試中拿到的BeanFactory,與struts結合就是在Action中取得beanFactory。步驟如下。
1、建立一個web項目。
2、建立相關頁面,代碼如下所示。
Login.jsp代碼入下所示。
~~~
<%@ pagelanguage="java" contentType="text/html; charset=GB18030"
??pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=GB18030">
<title>Insert titlehere</title>
</head>
<body>
??????<formaction="login.do" method="post">
?????????????用戶:<input type="text"name="username"><br>
?????????????密碼:<input type="password"name="password"><br>
?????????????<inputtype="submit" value="登錄">
??????</form>
</body>
</html>
Login_success.jsp?
<%@ pagelanguage="java" contentType="text/html; charset=GB18030"
??pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type" content="text/html;charset=GB18030">
<title>Insert titlehere</title>
</head>
<body>
??????xx,用戶登錄成功!
</body>
</html>
~~~
3、配置struts環境,關于struts的配置,拷貝struts和jstl的依賴包;在web.xml中配置ActionServlet,提供struts-config.xml文件。前篇文中有說明,在此就不贅述了。
struts-config.xml代碼如下所示。
~~~
<struts-config>
??????
?????? <form-beans>
????????????? <form-beanname="loginForm"type="com.bjpowernode.usermgr.web.forms.LoginActionForm"></form-bean>
?????? </form-beans>
??????
?????? <action-mappings>
????????????? <actionpath="/login"
????????????? type="com.bjpowernode.usermgr.web.actions.LoginAction"
????????????? name="loginForm"
????????????? scope="request"
????????????? >
?????????????
????????????? <forwardname="success" path="/login_success.jsp"/>
????????????? </action>
?????? </action-mappings>
?????? ?<message-resourcesparameter="resources.MessageResources" />
</struts-config>
~~~
4、配置spring環境,拷貝spring相關jar包,建立spring配置文件applicationContext-beans.xml。
applicationContext-beans.xml代碼如下所示。
~~~
<beansxmlns="http://www.springframework.org/schema/beans"
??????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??????????xmlns:aop="http://www.springframework.org/schema/aop"
??????????xmlns:tx="http://www.springframework.org/schema/tx"
??????????xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
?????????http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.0.xsd
?????????http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
??????<beanid="userManager"class="com.bjpowernode.usermgr.manager.UserManagerImpl"/>
</beans>
~~~
5、建立相關的Action和ActionForm。代碼如下所示。
? ? LoginAction.java代碼如下所示。
~~~
public class LoginAction extendsAction {
? ? ?@Override
??????publicActionForward execute(ActionMapping mapping, ActionForm form,
?????????????????????HttpServletRequestrequest, HttpServletResponse response)
?????????????????????throwsException {
?????????????
?????????????LoginActionFormlaf = (LoginActionForm)form;
?????????????
?????????????Stringusername = laf.getUsername();
?????????????Stringpassword = laf.getPassword();
? ? ? ? ? ?? ?//但是我們每次都要去調用,去創建太麻煩了.
?????????????//我們在這里只需要去配置Listener就可以了,spring給實現好了.
?????????????BeanFactoryfactory = newClassPathXmlApplicationContext("applicationContext.xml");
?????????????UserManageruserManager = (UserManager)factory.getBean("userManager");
?????????????userManager.login(username,password);
??????}
}
? ? LoginActionForm.java代碼如下所示。
public class LoginActionFormextends ActionForm {
??????//表單上有什么提供什么屬性.
??????//名字一定要與表單中的一樣.
??????
??????privateString username;
??????
??????publicString getUsername() {
?????????????returnusername;
??????}
??????publicvoid setUsername(String username) {
?????????????this.username= username;
??????}
??????privateString password;
??????publicString getPassword() {
?????????????returnpassword;
??????}
??????publicvoid setPassword(String password) {
?????????????this.password= password;
??????}
}
~~~
6、建立業務邏輯層,代碼如下所示。
? ? UserManager代碼如下所示。
~~~
public interface UserManager {
??????publicvoid login(String username, String password);
}
? ? UserManagerImpl.java代碼如下所示。
public class UserManagerImplimplements UserManager {
??????publicvoid login(String username, String password) {
?????????????System.out.println("UserManagerImpl"+"username="+ username);
??????}
}
~~~
7、?web.xml配置文件代碼如下所示。
~~~
<servlet>
??<servlet-name>action</servlet-name>
??<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
??<init-param>
????<param-name>config</param-name>
????<param-value>/WEB-INF/struts-config.xml</param-value>
??</init-param>
??<init-param>
????<param-name>debug</param-name>
????<param-value>2</param-value>
??</init-param>
??<init-param>
????<param-name>detail</param-name>
????<param-value>2</param-value>
??</init-param>
??<load-on-startup>2</load-on-startup>
</servlet>
~~~
? ? 就這樣我們在LoginAction中,使用beanFactory讀取spring配置文件,找到UserManagerImpl實例。如果每次在Action中讀取application-beans.xml文件,我們是否可以在服務器啟動的時候就就創建BeanFactory呢?在這里我們可以使用spirng的工具WebApplicationContextUtils.getRequiredWebApplicationContext()從? ServletContext中 ?取得BeanFactory,然后再web.xml中配置Spring的Listener。
修改后,LoginAction代碼如下所示。
~~~
public class LoginAction extendsAction {
??????@Override
??????publicActionForward execute(ActionMapping mapping, ActionForm form,
?????????????????????HttpServletRequestrequest, HttpServletResponse response)
?????????????????????throwsException {
?????????????LoginActionFormlaf = (LoginActionForm)form;
?????????????
?????????????Stringusername = laf.getUsername();
?????????????Stringpassword = laf.getPassword();
?????????????
?????????????//用工具包直接拿出來就可以了。
?????????????BeanFactoryfactory =WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());
?????????????UserManageruserManager = (UserManager)factory.getBean("userManager");
?????????????userManager.login(username,password);
?????????????returnmapping.findForward("success");
??????}
}??????
~~~
? ? 加入相關配置,web.xml代碼如下所示。
~~~
<context-param>
?????<param-name>contextConfigLocation</param-name>
?????<param-value>classpath:applicationContext-*.xml</param-value>
</context-param>
<listener>??
?????<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
~~~
第一種方案缺點:
? ?我們在在Action中仍然看到Spring相關東西,看到Spring相關類,要是程序只看到的是接口,那要怎么做呢?
? ?第二種方案,將struts的Aciton交給Spring來創建,讓代理Action負責拿到beanFactory,根據Path名稱到IOC中把對應的Action取出來。
- 前言
- Struts旅程(一)Struts簡介和原理
- struts旅程(二)Struts登錄示例
- Struts旅程(三)Struts表單處理器ActionForm(靜態動態)
- Struts旅程(四)MVC向struts MVC框架演變過程
- Struts旅程(五)struts控制器DispatchAction
- Struts旅程(六)Struts頁面轉發控制ActionForward和ActionMapping
- Hibernate旅程(一)Hibernate架構概述
- Hibernate旅程(二)Hibernate實例
- Hibernate旅程(三)Hibernate持久化對象的三個狀態
- Hibernate旅程(四)Hibernate對數據庫刪除、查找、更新操作
- Hibernate旅程(五)Hibernate映射--基本類映射和對象關系映射
- Hibernate旅程(六)Hibernate映射--繼承映射
- Hibernate旅程(七)Hibernate緩存機制--一級緩存
- Hibernate旅程(八)Hibernate緩存機制--二級緩存
- Hibernate旅程(九)Hibernate緩存機制--查詢緩存
- Spring旅程(一)為什么使用Spring
- Spring旅程(二)非Spring向Spring過渡-- Spring IOC容器的使用
- Spring旅程(三) AOP--Spring AOP容器基礎
- Spring旅程(四) AOP--Spring AOP實例
- SSH旅程(五)Spring運用到Hibernate中
- SSH旅程(六)Spring和struts結合(方案一)