Struts2框架几乎是目前最优秀的MVC框架之一。Struts2框架是WebWork框架和Struts1框架的结合体。java
Struts2结构体系web
注:如今StrutsPrepareAndExecuteFilter过滤器已经代替了FilterDispatcher过滤器。apache
工做原理:当客户端发送一个HTTP请求时,须要通过一个过滤器链,这个过滤器链包括ActionContextClearUp过滤器,其余WEB应用过滤器及StrutsPrepareAndExecuteFilter过滤器,其中StrutsPrepareAndExecuteFilter过滤器是必需要配置的。编程
当StrutsPrepareAndExecuteFilter过滤器被调用时,ActionMapper将查找须要调用的Action对象,并返回该对象的代理ActionProxy。而后ActionProxy将从配置管理器ConfigurationManager中读取Struts2的相关配置(struts.xml)。Action容器ActionInvocation调用指定的Action对象,在调用以前须要通过Struts2的一系列拦截器。浏览器
当Action处理请求后,将返回相应的结果视图,在这些视图中可使用Struts2标签显示数据并控制数据逻辑。而后HTTP请求回应给浏览器,在回应的过程当中一样通过过滤器。session
Struts2的用法app
①添加jar包框架
struts2-core,xwork-core,ognl,freemarker,commons-io,commons-fileupload,javassist-GA,asm-commons,asm,commons-langjsp
②Struts2框架主要经过一个过滤器将Struts2集成到Web应用中,这个过滤器对象就是org.apache.Struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。经过它Struts2便可拦截Web应用中的http请求,并将这个http请求转发到指定的Action进行处理,Action根据处理的结果返回给客户端相应的页面。所以在Struts2中,过滤器StrutsPrepareAndExecuteFilter是web应用与struts2 API的入口。this
在web.xml中声明struts2提供的过滤器
<filter> <filter-name>struts</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filetr.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> <filter-pattern>
③在web应用的src文件夹下,建立struts.xml,在其中定义Struts2中的Action对象
<struts> <package name="myPackage" extends="struts-default" method=""> <action name="first" class=""> <result name="" type="">/first.jsp</result> </action> </package> </struts>
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; } } <input type="text" name="user.username"/> <input type="text" name="user.password"/>
③采用ModelDriven模式传递参数
public class UserAction extends ActionSupport implements<User> { private User user = new User(); public User getModel(){ return this.user; } public String execute(){ return SUCCESS; } } <input type="text" name="username"/> <input type="text" name="password"/>
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配置它所须要的拦截器。
<package name="myFirst" namespace="/" extends="struts-default"> <interceptors> <interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor" /> <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor" /> </interceptors> <action name="login" class="com.asm.LoginAction"> <interceptor-ref name="timer"></interceptor-ref> <interceptor-ref name="params"></interceptor-ref> <result name="loginSuccess">/success.jsp</result> <result name="loginFailure">/failure.jsp</result> </action> </package>
注意:虽然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<String, Object> request) { this.request=request; } public void setSession(Map<String, Object> session) { this.session=session; } public void setApplication(Map<String, Object> application) { this.application=application; } ...省略username的get/set方法 }