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-app xmlns: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个属性)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>String_Struts</title> </head> <body> <form action="new/string_struts.action"> 用户名:<input type="text" name="name"> <br/> 密码:<input type="text" name="pass"> <br/> <input type="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>
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <constant name="struts.objectFactory" value="spring"/>
<package name="default" namespace="/new" extends="struts-default">
<action name="string_struts" class="string_struts"> <result name="success">/WEB-INF/contest/success.jsp</result> </action>
<action name="*"> <result>/WEB-INF/contest/{1}.jsp</result> </action> </package>
<!-- Add packages here -->
</struts> |
注意上面action的class对应的不是一个具体的类(包名.类名),而是一个字符串标识(先理解为专门的ID)
h)配置applicationContext.xml
<beans xmlns ="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">
<bean id="string_struts" class="com.jluzh.ex8.action.Spring_StrutsAction"> <property name="us"> <bean class="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的类去注入。