Struts 以WebWork优秀的设计思想为核心,吸收了Struts1的部分有点,建立了一个兼容WebWork和Struts1的mvc框架,Struts2就是一个MVC形式的框架,其主要被用来传参,转向,标签
-
传参
b—> s :setters();
s—>b :getters(); -
转发
struts2中在Action执行完后就会有return ,然后去匹配当前节点下节点 -
标签
<s:if test=""> </s:if>
<s:else></s:else>
<s:file></s:file> #文件上传
<s:iterator></s:iterator> #用于遍历集合
<s:hidden></s:hidden> #隐藏
OGNL表达式(Object-Graph Nacigation Language),一种强大的表达式语言,可以方便的操作对象属性的开源表达式语言,Struts2默认的表达式语言的OGNL,且该表达式经常与struts2的标签一起使用
<s:proprety value="%{#request.list}"></s:proprety>
-
值栈
值栈是对应一个请求对线的轻量级的内存数据中心,struts2中一个很激动人心的特性就是引入值栈,在这里统一管理数据,提供Action、Result、Interceptor等struts2的其他部分使用,Struts2会为每个请求创建一个新的值栈,值栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。正是因为值栈和请求的对应关系,因而值栈能保证线程安全的为每个请求提供公共的数据存取服务。 -
申明式异常
Struts2的异常处理,靠的是ExceptionMappingInterceptor异常拦截器。这个异常处理的拦截器是我们struts.xml配置文件中继承过的struts-default包中的一个默认拦截器,所以不用我们做额外的拦截器配置
#在struts.xml中配置:
<action name="hello" class="com.rj.bd.hello.HelloAction" >
<exception-mapping result="nullpoint" exception="java.lang.NullPointerException"></exception-mapping>
<result name="success" type="dispatcher">/jsp/list.jsp</result>
<result name="nullpoint">/hello/error.jsp</result>
</action>
#针对所有的Action都起作用的全局声明式异常
<global-exception-mappings>
<exception-mapping result="nullpoint" exception="java.lang.NullPointerException"></exception-mapping>
</global-exception-mappings>
- 核心配置文件
struts.xml
<struts>
<!-- include元是将每个功能模块独立到一个xml配置文件中包含进来,注意引入顺序 -->
<include file="struts-default.xml"></include>
<!-- package提供了将多个Action组织为一个模块的方式
name:package名称,必须是唯一的。
extends:继承的父package名称,父package必须在此之前配置
abstract:设置package是否抽象的(true或false) 。当值为true时,page不能定义action。
namespace:定义package命名空间 该命名空间影响到url的地址。
-->
<package name="com.kay.struts2" extends="struts-default" namespace="/test">
<interceptors>
<!-- 自定义拦截器 name:拦截器名称 class:拦截器类路径-->
<interceptor name="timer" class="com.kay.timer"></interceptor>
<interceptor name="logger" class="com.kay.logger"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="logger"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器 每个Action都会自动引用。 如果Action中引用了其它的拦截器 默认的拦截器将无效 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<!-- 全局results配置 -->
<global-results>
<result name="input">/error.jsp</result>
</global-results>
<!-- Action配置 一个Action可以被多次映射(只要action配置中的name不同)
name:action名称
class: 对应的类的路径
method: 调用Action中的方法名
-->
<action name="hello" class="com.kay.struts2.Action.LoginAction">
<!-- 引用拦截器 name:拦截器名称或拦截器栈名称 -->
<interceptor-ref name="timer"></interceptor-ref>
<!-- 节点配置
name : result名称 和Action中返回的值相同
type : result类型 不写则选用superpackage的type struts-default.xml中的默认为dispatcher-->
<result name="success" type="dispatcher">/talk.jsp</result>
<!-- 参数设置 name:对应Action中的get/set方法 -->
<param name="url">http://www.sina.com</param>
</action>
</package>
</struts>
struts.properties详解:
https://www.cnblogs.com/jimsu/p/6045904.html
struts-default.xml: 定义了32个拦截器,默认使用18个拦截器构成默认的拦截器栈,struts2执行Action方法之后使用result结果映射
<!-- 异常处理拦截器 -->
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
<!-- 文件上传拦截器 -->
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<!-- 国际化拦截器 -->
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
<!-- servlet配置拦截器 -->
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
<!-- 参数拦截器 -->
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<!-- 表单提交拦截器 -->
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
...
result返回结果映射
<!-- 转发 -->
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<!-- 重定向 -->
<result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
<!-- 重定向到Action -->
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<!-- 返回一个InputStream 用于文件下载 -->
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
...
struts-plugin.xml 存放的是一些与struts1相关联的插件的信息,一般不怎么重要
- 转向的本质
通过result结果映射找到org.apache.struts2.dispatcher.ServletDispatcherResult,然后通过ServletActionContext获取HttpServletRequest以及RequestDispatcher,在通过 **dispatcher.forward(request, response)**方法进行转向
- 拦截器
拦截器是通过动态代理的方式来调用的,其实拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式
拦截器就是在Action执行前或者后处理的类
实现自定义拦截器
1、实现Interceptor接口
2、继承AbstractInterceptor抽象类
在struts中配置,将自定义的拦截器配置一下,在将自定义拦截器和默认的拦截器栈构建在一起使用
<interceptors>
<!-- 自定义拦截器 name:拦截器名称 class:拦截器类路径-->
<interceptor name="timer" class="com.kay.timer"></interceptor>
<interceptor name="logger" class="com.kay.logger"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="mystack">
<interceptor-ref name="timer"></interceptor-ref>
<interceptor-ref name="logger"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认的拦截器 每个Action都会自动引用。 如果Action中引用了其它的拦截器 默认的拦截器将无效 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
- Struts2和Servlet的关系
struts2是一个基于mvc设计模式的Web应用框架,struts2不是servlet,而是使用了Filter过滤器来作为控制器,并且使用了拦截器,组成了拦截器栈,是对Filter的改善,封账,简化
Struts2中获取servlet的3种方式
1、ServletAPI解耦方式
为了避免与Servlet API耦合在一起,Struts 2对HttpServletRequest、HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象。ActionContext是Action执行的上下文,保存了很多对如parameters、request、session等,通过ActionContext类获取Map
ActionContext context = ActionContext.getContext();//得到Action上下文
Map<String, Object> request = (Map) context.get("reuqest");//获取HttpServleRequest的Map
Map<String, Object> session = context.getSession();//获取去session
Map<String, Object> application = context.getApplication();//获取application
2、IOC(控制反转)获取servletAPI(解耦)
Struts2运行时向Action实例注入reuqest,session,application对象
public class SampleAction implementsAction,
RequestAware, SessionAware, ApplicationAware
{
private Map request;
private Map session;
private Map application;
@Override
public void setRequest(Map request)
{this.request = request;}
@Override
public void setSession(Map session)
{this.session = session;}
@Override
public void setApplication(Map application)
{this.application = application;}
}
3、与Servlet API耦合的方式
HttpServletRequest request = ServletActionContext.getRequest();
ServletContext servletContext = ServletActionContext.getServletContext();