zoukankan      html  css  js  c++  java
  • struts2 基础5 OGNL、标签、四大域、默认拦截器说明

    OGNL表达式
        OGNL:对象导抗图语言
    OGNL表达式是一个上下文的概念,上下文Map结构
    OGNL表达式需要使用#标注命名空间。访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application、#session 
        OGNL表达式结构
            valueStack(值栈):
                List 取值直接写            
            访问以下内容需要"#"开始
                application:上下文中的Map
                session: HttpSession中的Map
                request: HttpRequest中的Map
                parameters:请求参数的Map(paramValues)
                attr:findAttribute(查找顺序page--request--session--application)

    OGNL表达式语言

     1 访问上下文(Context)中的对象需要使用#符号标注命名空间,如#application、#session 
     2 另外OGNL会设定一个根对象(root对象),在struts2中根对象就是ValueStack(值栈)。
       如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。
     3 在root变量中处于第一位的对象叫栈顶对象。通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,
       搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有找到就从第三个对象寻找,
       依次往下访问,直到找到为止。
    • 如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀

    • application对象:用于访问ServletContext,例如#application.userName或者#application[‘userName’],相当于调用ServletContext的getAttribute(“username”)。

    • session对象:用来访问HttpSession,例如#session.userName或者#session[‘userName’],相当于调用session.getAttribute(“userName”)。

    • request对象:用来访问HttpServletRequest属性(attribute)的Map,例如#request.userName或者#request[‘userName’],相当于调用request.getAttribute(“userName”)。

    • parameters对象:用与访问HTTP的请求参数,例如#parameters.userName或者#parameters[‘userName’],相当于调用request.getParameter(“username”)。

    • attr对象:用于按page->request->session->application顺序访问其属性。

    操作集合对象

    Ognl有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext,下面是上下文(Context)的结构示意图


    常用标签:
    property:用于输出指定值
        <s:set name=“name” value=“kk”/>
        <s:property value=“#name”/>
        value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值。    
        default:可选属性,如果需要输出的属性值为null,则显示该属性指定的值
        escape:可选属性,指定是否格式化HTML代码
        id:可选属性,指定该元素的标识。(过时)
        
    Iterate:标签用于对集合进行迭代,这里的集合包含List、Set和数组。
        <s:set name=“list” value=“{‘a’,’b’,’c’}”/>
        <s:iterator value=“#list” status=“st”>
            <font color=<s:if test=“#st.odd”>red</s:if><s:else>blue</s:else>>
            <s:property/></font><br/>
        </s:iterator>
        Value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。
        id:可选属性,指定该元素的标识。(过时)
        status:可选属性,该属性指定迭代时的IterateStatus实例。该实例包含如下几个方法:
        int getCount(),返回当前迭代了几个元素。
        int getIndex(),返回当前迭代元素的索引。
        boolean isEven(),返回当前被迭代元素的索引是否是偶数。
        boolean isOdd(),返回当前被迭代元素的索引是否是奇数。
        boolean isFirst(),返回当前被迭代元素是否是第一个元素
        boolean isLast(),返回当前被迭代元素是否是最后一个元素

    实例:

      <body>
        <s:property value="username"/><br> <s:property /><!-- 默认取栈顶对象 --> <hr> <s:set var="list" value="{'a','b','c'}"></s:set> <s:iterator value="#list"> <s:property/> <!-- 遍历时,会将当前遍历的元素放到栈顶 --> </s:iterator> <hr> <s:set var="map" value="#{'a':'aa','b':'bb','c':'cc'}"></s:set> <s:iterator value="#map"> <s:property/> <s:property value="key"/>--<s:property value="value"/> <!-- 遍历时,会将当前遍历的元素放到栈顶 --> </s:iterator> <hr> <!-- 把一个字符串当成表达式,所以要再加一对引号表字符串 --> <%-- <s:set var="grade" value="'A'" /> --%> <s:set var="grade" value="'A'"></s:set> <s:if test="#grade=='A'">优秀</s:if> <s:elseif test="#grade==B">良好</s:elseif> <s:else>一般</s:else> <hr> <s:url action="a3" namespace="/test" var="url"> <s:param name="username" value="'liu'"/> <s:param name="age" value="'20'"/> </s:url> <s:property value="#url"/> <a href='<s:property value="#url"/>'>点击</a> <s:a href="%{url}">请点击</s:a> <hr> <!-- 把表达式当成字符串,如果使其当成表达式加 %{ } --> <s:set value="'addCustomer'" var= "addr"></s:set>      <%-- <s:url value="addr" /> --%> <s:url value="%{addr}"></s:url>   </body>

     <body>    <s:form action="aa" namespace="/test"> <s:textfield name="username" label="用户名"></s:textfield> <s:password name="password" label="密码"></s:password> <s:checkboxlist name="hobby" list="{'吃饭','睡觉','打豆豆'}" value="{'吃饭','睡觉'}"></s:checkboxlist> <s:checkboxlist list="#{'0531':'济南','青岛':'0532' }" name="pro" listKey="value" listValue="key"></s:checkboxlist> <s:radio list="#{'0':'男','1':'女' }" name="sex" value="0"></s:radio> <s:select list="#{'0':'男','1':'女' }" name="sex" value="1"></s:select> </s:form>
     </body>   <body>      <!-- 默认放置ActionContext 上下文中 scope="action" --> <s:set var="list1" value="{'a','b','c'}"></s:set> <s:set var="list2" value="{'aa','bb','cc'}" scope="session"></s:set> <s:set var="map1" value="#{'a':'valuea','b':'valueb' }" scope="session"></s:set> list1[1]: <s:property value="#list1[1]"/> <br> session.list2[1]: <s:property value="#session.list2[1]"/> <br> iterator(var)-list1: <s:iterator value="#list1" var="me"> <s:property value="#me"/> </s:iterator> <br> iterator-list1: <s:iterator value="#list1" > <s:property /> </s:iterator> <hr color="red"> iterator-session.map1: <s:iterator value="#session.map1" var="map"> <s:property value="#map.key"/>=<s:property value="#map.value"/> </s:iterator> <hr color="red"> if-lc in {}: <s:if test="'lc' in {'lc','wwg'}">lc存在</s:if> <s:else>lc不在</s:else> <br> if-lc not in {}: <s:if test="'lc' not in {'lc','wwg'}">lc存在</s:if> <s:else>lc不在</s:else>
      </body>

     Struts2 中 四大域

     1 public class UserAction extends ActionSupport{
     2     //类型为真实的web元素:HttpServletResponse,HttpServletRequest等..
     3     private HttpServletResponse resp;
     4     private HttpServletRequest req;
     5     private HttpSession session;
     6     private ServletContext app;
     7     
     8     public String execute() throws IOException{
     9         req = ServletActionContext.getRequest();     //得到request
    10         resp = ServletActionContext.getResponse();    //得到response
    11         app = ServletActionContext.getServletContext();   //得到application
    12         session = ServletActionContext.getRequest().getSession();  //得到session
    13         //操作
    14         req.setAttribute("req", "write req..");    //往request里存值
    15         session.setAttribute("session", "write session");    //住session里存值
    16         session.getAttribute("session");         //从session里取值
    17         resp.getWriter();      //得到response的 PrintWriter
    18         return "test";
    19     }
    20 }

     

    拦截器

     1 Struts2的预定义拦截器
     2 
     3     a:params拦截器
     4 
     5     把请求参数设置进Action的相应属性,并自动进行类型转换
     6 
     7  
     8 
     9     b:staticParams拦截器
    10 
    11     将struts.xml配置文件里定义的Action参数,设置到对应的Action实例中,Action参数使用<param>标签,是<action>标签的子元素。
    12 
    13     <action name="hello"  class="HelloAction">
    14 
    15             <param name="account">test</param>
    16 
    17     </action>
    18 
    19    这要求action中有一个account属性,并有相应的setter和getter方法,运行的时候,action的account属性在初始化过后,会接到这里的赋值test。
    20 
    21  
    22 
    23     c:prepare拦截器
    24 
    25      在action执行之前调用Action的prepare方法,这个方法是用来准备action之前要做的工作,它要求用户必须实现com.opensymphony.xwork2.Preparable接口。
    26 
    27      
    28 
    29     d:modelDriven拦截器
    30 
    31      如果action实现了ModelDriven接口,它将getModel方法取得的模型对象存入OgnlValueStack中。
    32 
    33  
    34 
    35     e:chain拦截器
    36 
    37      chain拦截器,将前一个执行结束的Action属性设置到当前的action中,它被用在ResultType为"chain"所指定的结果的Action中,该结果Action对象会从值栈获得前一个Action对应的属性,它实现Action链之间的数据传递。
    38 
    39  
    40 
    41      f:exception拦截器
    42 
    43     在抛出异常的时候,这个拦截器起作用,任何应用都应该引用这个拦截器,而且引用的时候,最好把它放在第一位,让它能捕获所有的异常。
    44 
    45  
    46 
    47     g:validation拦截器
    48 
    49      调用验证框架读取*-validation.xml文件,并且应用在这些文件中声明的校验。
    50 
    51  
    52 
    53     h:token拦截器
    54 
    55     核对当前Action请求(request)的有效标识,防止重复提交Action请求,使用标签<s:token>可以生成表单令牌,该标签会在Session中设置一个预期的值,并且在表单中创建一个隐藏的input字段,Token拦截器会检查这个令牌,如果不合法,将不会执行Action,这个拦截器是手工添加的,还需要一个invalide.token的result。
    56 
    57  
    58 
    59      i:conversionError拦截器
    60 
    61     用来处理框架进行类型转化(Type Conversion)时的出错信息,它将存储在ActionContext中的类型转化错误信息转化成相应的Action字段的错误信息,保存在堆栈中。根据需要,可以将这些错误信息在视图中显示出来。
    62 
    63  
    64 
    65      j:fileUpload拦截器
    66 
    67      用来处理上传文件
    68 
    69  
    70 
    71     k:workflow拦截器
    72 
    73     Action默认的工作流,如果Action实现了Validateable接口,那么interceptor会调用action的validate()方法,如果Action实现了ValidateAware接口,那么interceptor将会检查Action是否包含错误信息,如果包含错误信息,那么Interceptor将会返回input,而不让Action继续执行。
    74 
    75  
    76 
    77     l:servletConfig拦截器
    78 
    79    这个拦截器提供Action直接对Servlet API的调用,把Servlet API的对象注入到Action中,包括ServletRequestAware,ServletResponseAware,ParameterAware,SessionAware和ApplicationAware
    80 
    81  
    82 
    83    m:timer拦截器
    84 
    85     记录ActionInvocation剩余部分执行的时间,并作为日志信息记录下来,便于寻找性能瓶颈。
    86 
    87  
    88 
    89    n:logger拦截器
    90 
    91    在日志信息中输出要执行的Action信息,这样,在调试的时候,就能很快的定位到这个对应的Action中了。
    92 
    93  
    94 
    95    o:tokenSession拦截器
    96 
    97    扩展了token拦截器的功能,当提交无效的Action请求标识时,它会跳转到第一次成功后的页面
  • 相关阅读:
    jsp页面的基本语法
    servlet转发与重定向
    servlet配置及其生命周期
    Java--普通代码块静态代码块执行顺序
    Maven简述
    JDBCTemplate
    AOP--Aspect Oriented Programming
    SpringMVC---简单练手项目
    SpringMVC---进阶篇
    SpringMVC---基础篇(2)
  • 原文地址:https://www.cnblogs.com/liuyangv/p/8361959.html
Copyright © 2011-2022 走看看