Struts2

Struts 以WebWork优秀的设计思想为核心,吸收了Struts1的部分有点,建立了一个兼容WebWork和Struts1的mvc框架,Struts2就是一个MVC形式的框架,其主要被用来传参,转向,标签

  1. 传参
    b—> s :setters();
    s—>b :getters();

  2. 转发
    struts2中在Action执行完后就会有return ,然后去匹配当前节点下节点

  3. 标签

	<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>
  1. 值栈
    值栈是对应一个请求对线的轻量级的内存数据中心,struts2中一个很激动人心的特性就是引入值栈,在这里统一管理数据,提供Action、Result、Interceptor等struts2的其他部分使用,Struts2会为每个请求创建一个新的值栈,值栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。正是因为值栈和请求的对应关系,因而值栈能保证线程安全的为每个请求提供公共的数据存取服务。

  2. 申明式异常
    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>
  1. 核心配置文件
    在这里插入图片描述
    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相关联的插件的信息,一般不怎么重要

  1. 转向的本质
    通过result结果映射找到org.apache.struts2.dispatcher.ServletDispatcherResult,然后通过ServletActionContext获取HttpServletRequest以及RequestDispatcher,在通过 **dispatcher.forward(request, response)**方法进行转向
    在这里插入图片描述在这里插入图片描述
  2. 拦截器
    拦截器是通过动态代理的方式来调用的,其实拦截器是动态拦截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> 
  1. 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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值