SSH旅程(六)Spring和struts结合(方案一)

最后更新于:2022-04-01 14:50:18

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调用流程如下图所示。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-21_576908fbb61a4.jpg) 看到这幅图一下子就能了解了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取出来。
';