Struts拦截器及OGNL

Struts拦截器

可以理解为过滤器.但又不等同于过滤器.过滤器在服务器容器设置的一道闸门,而拦截器是在Struts框架里面和action之间设置的一道闸门. 其实拦截器用到了AOP的思想

拦截器的关键字

interceptors 在标记中声明拦截器和拦截器栈
interceptor 声明拦截器
interceptor-stack 声明拦截器栈
interceptor-ref 引用使用拦截器或拦截器栈
default-interceptor-ref 设置默认的拦截器或拦截器栈
param 为拦截器设置参数

  • 基于注解配置拦截器,在默认拦截器的基础上再添加日志拦截器
 @ParentPackage("struts-default")
@Namespace("/test")
public class GoodsAction extends ActionSupport {  
@Action(value="poa",results={
        @Result(name="success",location="/index.jsp")
},
interceptorRefs={  
        @InterceptorRef("logger"),
        @InterceptorRef("defaultStack")
}
        )
     public String save(){   
         System.out.println("进入Action");
         return ActionSupport.SUCCESS;
     }
}
  • xml方式
<package name="test" namespace="/test" extends="struts-default">  
<action name="poa" class="com.kxind.action.GoodsAction">  
<interceptor-ref name="logger"></interceptor-ref>  
<interceptor-ref name="defaultStack"></interceptor-ref>  
<result name="success" >/index.jsp</result>  
</action>  
</package>  
token防止重复提交

token:令牌,在客户端生成一个唯一的值

当客户重复点击按钮,而响应过慢,会提交多次值,从而加重服务器负担 .可以用token拦截器,执行第一次请求未完成,再执行第二次请求时,会跳转到token的location.

  • 在jsp页面中form表单引入< s:token/>,作为唯一验证

  • 拦截器拦截token,并当返回invalid.token返回另一个页面

 
{@Result(name="invalid.token",location="/error.jsp")
},interceptorRefs={
        @InterceptorRef("token"),
        @InterceptorRef("defaultStack")     
    }
使用execAndWait防止重复提交

过程和token拦截器一样,也要用到token令牌.不过过程是不同的,用户未完成直接跳到一个页面等待,如果完成后才自动跳转要执行的页面.

  • 在jsp页面中form表单引入< s:token/>,作为唯一验证

  • 拦截器拦截executeAndWaitStack栈,并当返回wait返回另一个页面

 
{@Result(name="wait",location="/wait.jsp")
},interceptorRefs={
        @InterceptorRef("executeAndWaitStack"),
    }
  • wait页面,<s:url includeParams="all" />自动生成本来要访问的url地址,通过html中的刷新 自动跳转到我们本来要访问的页面.
自定义拦截器
  • 创建一个类继承Interceptor
  • Struts.xml文件中新建一个拦截器
<package name="mypackage" abstract="true" extends="struts-default" >  
        <interceptors>
            <interceptor name="myinterceptor" class="com.kxind.interpter.myInterpter"/>
        </interceptors>
</package>  
  • Action中使用,params可以接收Action的属性goodsName,复制给filedName.
@InterceptorRef("defaultStack"),
        @InterceptorRef(value = "myinterceptor"
            , params = {"filedName", "goodsName"})
public String intercept(ActionInvocation arg0) throws Exception {  
       System.out.println("进入拦截器");
          return arg0.invoke();//放行
           //return  "errod"; 这是拦截,返回result
    }
OGGL及Struts标签

类似于EL表达式+jstl,等同于ognl+struts标签
ognl表达式和值栈:
ognl上下文实际就是一个Map对象
可以包含多个javabean对象,其中有一个根对象是值栈.默认调用哪个action就把哪个action放值栈栈顶

访问其他对象要加"#"
访问值栈就只是用"属性";


比el表达式强大在于可以调用对象中的任意方法
     .属性
     .方法  
 ,   用于分隔  取最后一个表达式
{}   用于生成数组
 in  not int 判断是否在集合中

 class 为类名:
调用静态方法
@class@method
访问静态字段
@class@field

list集合和数组差不多在ognl  
{"list1","list2","list3"}[1]用中括号访问
map集合  
{"key","value1","key2","value2"}
访问:
map["key"]或map.key

伪属性进行方法的调用

投影:
object.{#a.isEmpty?#this:this.toString}


选择
  ? 返回所有
  ^ 返回第一个
  $ 返回最后一个

lambda表达式 递归调用的  
#fact=:[#this<=1?1:#this*#fact[#this-1]],#fact[5]
struts2的标签
  • 表单标签

    < s:form action="action名字" method="">
    < s:form/>
    和普通的大同小异.

    < s:checkboxlist> < s:submmit value="登录" name="redirect:/reg.jsp">
    < s:reset> < s:file accept="限制文件上传类型" /> 主要是一个radio常用 同样这么用 一样的 可以遍历对象 也可以遍历map

  • list: 遍历的对象

  • listkey: 用来提供选项值的对象属性 list属性1 key

  • listValue: 用来提供选项行标的对象属性 list属性2 value

  • 控制标签

    < s:if test="ognl表达式">
    < s:set name="star" value="2" />设置一个零时变量

    iterator标签 进行迭代..

    首先从栈顶取值

             list           
  < s:iterator  value="#request.typeList" var="type"> 
       < s:property value="#type.id"> </s:property>    
       < s:property value="#type.typeName"> </s:property>      
  < /s:iterator>   
              map                     
  < s:iterator  value="#request.typeList">       
       < s:property value="key"> </s:property>          
       < s:property value="value.typeName"> </s:property>
  < /s:iterator>                    

把多个标签合并到一个标签,拼接的时候有序

把多个标签合并到一个标签,拼接的时候顺序插乱.

 < s:merge >
     < s:param  value="" > </s:param>
     < s:param  value=""> </s:param> 
   < /s:merge>

   分割   
     <s:generator  separator="," val="a,b,c,d"  >
        <s:iterator >                 
        </s:iterator>
     </s:generator>
  • 数据标签

    action:用于jsp中调用action
    date: 用于格式化输出一个日期
    include:用于在jsp界面中包含其他的jsp或Servlet资源
    param:用于设置一个参数,通常作为bean/url标签的子标签
    url:生成url地址
    set:设置新变量
    property:用于输出某一个值

    以xx参数包含
    < s:include value="/MyJsp.jsp">
    < s:param name="id" value="10">

    帮你找站点根目录
    < s:url value="/show.jsp"/>
    < s:url namespace="/test" action="ognl">
    帮你带参数
    < s:url action="/MyJsp.jsp" includeParams="all">
    < s:param name="id" value="10">
    < /s:url>

kxind

性别:男. 敢于尝试 爱折腾的死宅程序猿. https://github.com/kxinds