Struts2框架几乎是目前最优秀的MVC框架之一。Struts2框架是WebWork框架和Struts1框架的结合体。
Struts2结构体系
注:现在StrutsPrepareAndExecuteFilter过滤器已经代替了FilterDispatcher过滤器。
工作原理:当客户端发送一个HTTP请求时,需要经过一个过滤器链,这个过滤器链包括ActionContextClearUp过滤器,其他WEB应用过滤器及StrutsPrepareAndExecuteFilter过滤器,其中StrutsPrepareAndExecuteFilter过滤器是必须要配置的。
当StrutsPrepareAndExecuteFilter过滤器被调用时,ActionMapper将查找需要调用的Action对象,并返回该对象的代理ActionProxy。然后ActionProxy将从配置管理器ConfigurationManager中读取Struts2的相关配置(struts.xml)。Action容器ActionInvocation调用指定的Action对象,在调用之前需要经过Struts2的一系列拦截器。
当Action处理请求后,将返回相应的结果视图,在这些视图中可以使用Struts2标签显示数据并控制数据逻辑。然后HTTP请求回应给浏览器,在回应的过程中同样经过过滤器。
Struts2的用法
①添加jar包
struts2-core,xwork-core,ognl,freemarker,commons-io,commons-fileupload,javassist-GA,asm-commons,asm,commons-lang
②Struts2框架主要通过一个过滤器将Struts2集成到Web应用中,这个过滤器对象就是org.apache.Struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。通过它Struts2即可拦截Web应用中的http请求,并将这个http请求转发到指定的Action进行处理,Action根据处理的结果返回给客户端相应的页面。因此在Struts2中,过滤器StrutsPrepareAndExecuteFilter是web应用与struts2 API的入口。
在web.xml中声明struts2提供的过滤器
struts org.apache.struts2.dispatcher.ng.filetr.StrutsPrepareAndExecuteFilter struts /* ③在web应用的src文件夹下,创建struts.xml,在其中定义Struts2中的Action对象
/first.jsp Action对象
Action对象主要用来处理http 请求。在struts2 API中,Action对象是一个接口com.opensynphony.xwork.xwork2.Action。在此接口中,定义了五个常量(SUCCESS,NONE,ERROR,INPUT,LOGIN)和一个方法(execute())。
①请求参数的注入原理
在struts2框架中,表单提交的数据会自动注入到与Action对象中相对应的属性中去,它与Spring IOC注入原理一致,通过Action对象为属性提供setter方法进行注入。
②Action的基本流程
当浏览器向web容器发送一个HTTP请求时,Web容器就要调用Struts2过滤器的doFilter()方法。此时Struts2接收到HTTP请求,通过Struts2的内部处理机制会判断这个请求是否与某个Action对象相匹配。如果找到匹配的Action,就会调用Action对象的execute方法,并根据处理结果返回相应的值。然后Struts2通过Action的返回值查找返回值所映射的页面,最后经过一定的视图处理后将页面回应给浏览器。
Struts2的标签库
首先要引入标签<%@ taglib prefix="s" url="/struts-tags" %>
①property 属性 default value escape
②set 属性 scope value var
<s:set var="username" value="kaka" scope="request"/>
<s:property default="none" value="#request.username"/>
③a 属性 action href id method namespace
④param 属性 name value
⑤action
⑥push 将值推入值栈 value
⑦include 属性 file
⑧url 属性 action method namespace value var
⑨if elseif else 属性 test
10,iterator 属性var value
传递参数
①直接在Action类中定义属性和属性的setter方法。
②定义一个对象引用,但在请求参数中必须指定参数锁对应的实体对象。
public class UserAction extends ActionSupport { private User user; public User getUser(){ return user; } public void setUser(User user){ this.user = user; } public String execute(){ return SUCCESS; }}
③采用ModelDriven模式传递参数
public class UserAction extends ActionSupport implements
{ private User user = new User(); public User getModel(){ return this.user; } public String execute(){ return SUCCESS; }} ModelDriven过程:Struts2首先实例化Action对象,然后判断该对象是否实现了ModelDriven接口,若是,则调用getModel方法来获取实体对象模型,在之后的操作中对此实体对象进行赋值。
为什么要使用struts2代替struts1.x
(1)struts2的execute方法中的参数不会依赖于servletAPI,实现了也servlet解耦,是一种无侵入式的设计。
(2)struts2提供了拦截器,利用拦截器可以进行AOP编程,实现权限拦截等功能。
(3)struts2提供了类型转换器,我们可以很容易地对请求参数转换成需要的类型。
(4)提供了同种表现层技术支持,如JSP、freeMarker、velocity等
(5)可以对指定的方法进行校验,可以轻松地实现表单校验功能
(6)提供了全局范围、包范围和action范围的国际化资源文件管理实现。
Struts2的拦截器
拦截器是实现AOP的一种,通过它可以在Action执行前后进行一些相应的操作。拦截器能在action被调用之前和被调用之后执行一些“代码”。Struts2框架的大部分核心功能都是通过拦截器来实现的,如防止重复提交、类型转换、对象封装、校验、文件上传、页面预装载等等,都是在拦截器的帮助下实现的。每一个拦截器都是独立装载的(pluggable),我们可以根据实际的需要为每一个action配置它所需要的拦截器。
/success.jsp /failure.jsp 注意:虽然extends继承的strust-default自带有params拦截器,但是当我们自己引用了拦截器时,继承struts-default将不会再为我们分配默认的拦截器(有点类似构造器),但是我们仍然可以通过<interceptor-ref name="defaultStack"/>来继续使用struts-defalut的拦截器。
获取Servlet API
public class Login2Action extends ActionSupport implements RequestAware,SessionAware,ApplicationAware { private String username; Map request; Map session; Map application; public String execute() throws Exception { request.put("req", "requst属性"); session.put("ses", "sesion属性"); application.put("app", "application属性"); return SUCCESS; } public void setRequest(Map
request) { this.request=request; } public void setSession(Map session) { this.session=session; } public void setApplication(Map application) { this.application=application; } ...省略username的get/set方法 }