Struts2整合Spring

来源:互联网 发布:手机人工智能有什么用 编辑:程序博客网 时间:2024/06/09 20:36

Struts整合Spring:

前2天弄了Struts2整合Spring弄了好久,开始一直对配置文件哪些不理解,为什么在Struts的Action中可以生成实例对线,为什么要用Spring的ico容器来生成,还给它起了一个牛B哄哄的名字(依赖注入/控制反转)--其实也没有那么神秘,废话不多说,你慢慢看下去会对你的理解Struts整合Spring有帮助。

 

首先:Spring的核心是IoC(Inversion ofControl 控制反转)容器和AOP机制;控制反转或者叫依赖注入其实很好理解;比如说一个person类(调用者),要用斧头类(被调用者)的对象去调用劈柴的方法。通常我们是在person类中去new 一个斧头类的对象,然后再去调用劈柴的方法。但是你用spring框架的时候,你就不需要这样去做,那怎么做呢?在Spring框架下,创建斧头类的对象不再需要person类去做,而是又spring容器去生成斧头的对象(控制反转),然后注入到person类(调用者)中(依赖注入)。理解这里很重要,

这里是告诉我们spring容器它帮我们创建被调用者的对象,并且通过依赖注入到调用者中去。

 

 

接下来我们用一个登录例子去讲解Struts2整合Spring。

 

 

步骤:
                   1、首先你得有一个空白的Struts2项目(这个不会可以到我博客前面找Struts框架的搭建,估计看这篇博文的应该没有不会的吧,如果有那么小伙子你是要上天呀!)

1、准备Spring.jar和commons-logging.jar。Struts2整合spring必须的2个包,网上可以下载到

2、完成Spring容器的初始化并配置相关内容(类似Strust2加载核心控制器一样)

3、请求页面

4、实现控制器逻辑(Action)

5、实现业务逻辑(Service)

6、配置Struts.xml

7、配置applicationContext.xml

 

 

 

 

 

 

首先给贴出文件目录结构:清晰明了有木有啊有木有!!!


a)  把相应jar包拉到一个空白的Struts2的lib目录下

 

 

 

 

a)web.xml

 

<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"id="WebApp_9"version="2.4">

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

  <filter>

    <filter-name>struts2</filter-name>

    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

  </filter>

  <filter-mapping>

    <filter-name>struts2</filter-name>

    <url-pattern>/*</url-pattern>

  </filter-mapping>

  <listener>

    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

  </listener>

</web-app>

 

<listerner>标签会在web应用启动时自动加载applicationContext.xml文件(默认是在ERB-INF路径下);可以通过在加入<context-param>

                                                                                                        <param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/classes/applocationContext.xml</param-value>

<context-param>

                   以上代码可以把加载路径修改为/WEB-INF/目录下的classes中

b)  我们来写一个很简单的请求页面(里边有name和pass 2个属性)

 

<%@ pagelanguage="java"contentType="text/html; charset=utf-8"

    pageEncoding="utf-8"%>

<%@ taglibprefix="s"uri="/struts-tags"%>

<!DOCTYPEhtml 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=ISO-8859-1">

<title>String_Struts</title>

</head>

<body>

    <formaction="new/string_struts.action">

        用户名:<inputtype="text"name="name">

        <br/>

        密码:<inputtype="text"name="pass">

        <br/>

        <inputtype="submit"name="提交把">

    </form>

</body>

</html>

 

e)实现控制器逻辑(Action)

package com.jluzh.ex8.action;

 

 

 

import com.jluzh.ex8.servlet.UserServlet;

import com.opensymphony.xwork2.ActionSupport;

 

public class Spring_StrutsAction extends ActionSupport{

        

         private String name;

         private String pass;

         private UserServlet us;

        

        

         public String getName() {

                   return name;

         }

 

 

         public void setName(String name) {

                   this.name = name;

         }

 

 

         public String getPass() {

                   return pass;

         }

 

 

         public void setPass(String pass) {

                   this.pass = pass;

         }

 

 

         public UserServlet getUs() {

                   return us;

         }

 

 

         public void setUs(UserServlet us) {

                   this.us = us;

         }

 

 

         public String execute() throws Exception{

                   if(us.logintest(getName(), getPass()))

                   return SUCCESS;       

                   else return ERROR;

         }

}

这里需要注意的是加粗字体部分,我们把处理用户登录的逻辑放在UserServlet组件中,该组件包含一个logintest方法;该方法根据用户名与密码判断用户登录是否成功。实际上,业务逻辑组件是整个应用的核心,控制器可以获得业务逻辑组件的引用,既可以调用业务逻辑组件的所有方法,这就完成了控制器与业务逻辑组件的之间的整合。

 

 

 

 

 

 

 

 

 

c)  实现业务逻辑组件

              定义业务逻辑组件接口:

publicinterfaceUserServlet{

    publicbooleanlogintest(Stringname,Stringpass);

}

 

                            实现业务逻辑组件接口

publicclassUserServletImpimplementsUserServlet{

 

    @Override

    publicbooleanlogintest(Stringname,Stringpass){

        //TODO Auto-generated method stub

        if(name.equals("wanglinbomk")&&pass.equals("wlb922922"))

        returntrue;

        elsereturnfalse;

    }

   

}

从以上代码可以看出UserServletImp类实现了UserServlet(业务逻辑组件接口),在配置文件中会把UserServletImp依赖注入到前面Action类的UserServlet 的us对象中。

 

d)  配置Struts.xml

<struts>

 

    <constantname="struts.enable.DynamicMethodInvocation"value="false"/>

    <constantname="struts.devMode"value="true"/>

    <constantname="struts.objectFactory"value="spring"/>

 

    <packagename="default"namespace="/new"extends="struts-default">

     

           <actionname="string_struts"class="string_struts">

                 <resultname="success">/WEB-INF/contest/success.jsp</result>

           </action>

    

       <actionname="*">

                 <result>/WEB-INF/contest/{1}.jsp</result>

           </action>

    </package>

 

    <!-- Add packages here -->

 

</struts>

注意上面action的class对应的不是一个具体的类(包名.类名),而是一个字符串标识(先理解为专门的ID)

h)配置applicationContext.xml

<beansxmlns ="http://www.springframework.org/schema/beans"

    xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation ="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

   

 

   

    <beanid="string_struts"class="com.jluzh.ex8.action.Spring_StrutsAction">

       <propertyname="us">

           <beanclass="com.jluzh.ex8.servlet.UserServletImp"></bean>

        </property>

    </bean>

 

</beans>

 

注意看以上代码:<beanid=”String_struts”…/>对应struts.xml中的具体处理类(包名加类名)。<property name=”us”…/>指定action中的”us”(也就是为action中的us注入)。用什么注入呢?用的就是<property<bean   class=”…”/>  />  是<bean>中class的类去注入。


1 0
原创粉丝点击