现在的位置: 首页 > 综合 > 正文

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

2014年09月05日 ⁄ 综合 ⁄ 共 6774字 ⁄ 字号 评论关闭

Springstruts结合.

上篇中把spring应用到hibernate中,本篇中把spring应用到struts中,首先复习一下struts基础知识。

Struts旅程(一)Struts简介和原理

struts旅程(二)Struts登录示例

Struts旅程(三)Struts表单处理器ActionForm(静态动态)

Struts旅程(四)MVCstrutsMVC框架演变过程

Struts旅程(五)struts控制器DispatchAction

Struts旅程(六)Struts页面转发控制ActionForwardActionMapping

      

         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的配置,拷贝strutsjstl的依赖包;在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          建立相关的ActionActionForm。代码如下所示。

      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中配置SpringListener

修改后,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相关类,要是程序只看到的是接口,那要怎么做呢?

     第二种方案,将strutsAciton交给Spring来创建,让代理Action负责拿到beanFactory,根据Path名称到IOC中把对应的Action取出来。

 

 

 

 

抱歉!评论已关闭.