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=""></s:radio>
<s:select list="#{'0':'男','1':'女' }" name="sex" value=""></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[]:
<s:property value="#list1[1]"/> <br>
session.list2[]:
<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 中 四大域

 public class UserAction extends ActionSupport{
//类型为真实的web元素:HttpServletResponse,HttpServletRequest等..
private HttpServletResponse resp;
private HttpServletRequest req;
private HttpSession session;
private ServletContext app; public String execute() throws IOException{
req = ServletActionContext.getRequest(); //得到request
resp = ServletActionContext.getResponse(); //得到response
app = ServletActionContext.getServletContext(); //得到application
session = ServletActionContext.getRequest().getSession(); //得到session
//操作
req.setAttribute("req", "write req.."); //往request里存值
session.setAttribute("session", "write session"); //住session里存值
session.getAttribute("session"); //从session里取值
resp.getWriter(); //得到response的 PrintWriter
return "test";
}
}

拦截器

 Struts2的预定义拦截器

     a:params拦截器

     把请求参数设置进Action的相应属性,并自动进行类型转换

     b:staticParams拦截器

     将struts.xml配置文件里定义的Action参数,设置到对应的Action实例中,Action参数使用<param>标签,是<action>标签的子元素。

     <action name="hello"  class="HelloAction">

             <param name="account">test</param>

     </action>

    这要求action中有一个account属性,并有相应的setter和getter方法,运行的时候,action的account属性在初始化过后,会接到这里的赋值test。

     c:prepare拦截器

      在action执行之前调用Action的prepare方法,这个方法是用来准备action之前要做的工作,它要求用户必须实现com.opensymphony.xwork2.Preparable接口。

     d:modelDriven拦截器

      如果action实现了ModelDriven接口,它将getModel方法取得的模型对象存入OgnlValueStack中。

     e:chain拦截器

      chain拦截器,将前一个执行结束的Action属性设置到当前的action中,它被用在ResultType为"chain"所指定的结果的Action中,该结果Action对象会从值栈获得前一个Action对应的属性,它实现Action链之间的数据传递。

      f:exception拦截器

     在抛出异常的时候,这个拦截器起作用,任何应用都应该引用这个拦截器,而且引用的时候,最好把它放在第一位,让它能捕获所有的异常。

     g:validation拦截器

      调用验证框架读取*-validation.xml文件,并且应用在这些文件中声明的校验。

     h:token拦截器

     核对当前Action请求(request)的有效标识,防止重复提交Action请求,使用标签<s:token>可以生成表单令牌,该标签会在Session中设置一个预期的值,并且在表单中创建一个隐藏的input字段,Token拦截器会检查这个令牌,如果不合法,将不会执行Action,这个拦截器是手工添加的,还需要一个invalide.token的result。

      i:conversionError拦截器

     用来处理框架进行类型转化(Type Conversion)时的出错信息,它将存储在ActionContext中的类型转化错误信息转化成相应的Action字段的错误信息,保存在堆栈中。根据需要,可以将这些错误信息在视图中显示出来。

      j:fileUpload拦截器

      用来处理上传文件

     k:workflow拦截器

     Action默认的工作流,如果Action实现了Validateable接口,那么interceptor会调用action的validate()方法,如果Action实现了ValidateAware接口,那么interceptor将会检查Action是否包含错误信息,如果包含错误信息,那么Interceptor将会返回input,而不让Action继续执行。

     l:servletConfig拦截器

    这个拦截器提供Action直接对Servlet API的调用,把Servlet API的对象注入到Action中,包括ServletRequestAware,ServletResponseAware,ParameterAware,SessionAware和ApplicationAware

    m:timer拦截器

     记录ActionInvocation剩余部分执行的时间,并作为日志信息记录下来,便于寻找性能瓶颈。

    n:logger拦截器

    在日志信息中输出要执行的Action信息,这样,在调试的时候,就能很快的定位到这个对应的Action中了。

    o:tokenSession拦截器

    扩展了token拦截器的功能,当提交无效的Action请求标识时,它会跳转到第一次成功后的页面

struts2 基础5 OGNL、标签、四大域、默认拦截器说明的更多相关文章

  1. Struts2框架05 result标签的类型、拦截器

    1 result标签是干什么的 就是结果,服务器处理完返回给浏览器的结果:是一个输出结果数据的组件 2 什么时候需要指定result标签的类型 把要输出的结果数据按照我们指定的数据类型进行处理 3 常 ...

  2. Struts2默认拦截器栈及内建拦截器使用具体解释

    Struts2内建拦截器介绍:   alias (别名拦截器):同意參数在跨越多个请求时使用不同别名,该拦截器可将多个Action採用不同名字链接起来,然后用于处理同一信息.  autowiring  ...

  3. struts2拦截器配置;拦截器栈;配置默认拦截器;拦截方法的拦截器MethodFilterInterceptor;完成登录验证

    struts2.xml 内容 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  4. Struts2的默认拦截器执行顺序

    我们在写Struts2的时候package属性默认都是差不多这样吧 <package name="packageName" namespace="/" e ...

  5. struts2从浅至深(三)拦截器

    一:拦截器概述 Struts2中的很多功能都是由拦截器完成的. 是AOP编程思想的一种应用形式. 二:拦截器执行时机                             interceptor表示 ...

  6. Struts2- 设置默认拦截器

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...

  7. 【Autofac打标签模式】Aspect拦截器

    [ Autofac打标签模式]开源DI框架扩展地址: https://github.com/yuzd/Autofac.Annotation/wiki 前提条件 自己new一个对象不能实现拦截器功能,必 ...

  8. 【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式

    背景: 在做前后端分离时,牵扯到跨域,但是已经设置了跨域 前端设置了允许携带Cookie axios.defaults.withCredentials = true; 后端也配置了跨域 浏览器端查看发 ...

  9. struts2默认拦截器defaultStack

    第一次使用Struts2.3.20,前台页面向后台传值,怎么总是提示值为null,查找半天原来是struts配置文件的action中忘记引入defaultStack拦截器了,所以即使Action中万事 ...

随机推荐

  1. 什么是CPC,CPA,CVR,CTR,ROI

    合格的网络营销人员都应该熟悉下面的常见英文缩写,这些都是我们必须知道的名词解释:CVR (Click Value Rate): 转化率,衡量CPA广告效果的指标CTR (Click Through R ...

  2. 33. Search in Rotated Sorted Array (JAVA)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  3. SPSS 23下载安装和激活

    目录 1. 其他版本 2. 安装教程 3. 下载地址 1. 其他版本 参考:https://www.cnblogs.com/coco56/p/11648399.html 2. 安装教程 SPSS 23 ...

  4. vue无线滚动组件封装

    <template> <div class="scroll-wapper" :style="{height: scrollHeight + 'px'}& ...

  5. Centos7.X新安装linux系统基础配置

    普通Linux分区方式: /根分区 Linux系统必须要有的,相当于 Windows的C盘,系统程序相关的. /boot分区 存放内核相关程序 是可选的 5 6给200M,7给256M(工作中1-2G ...

  6. STM32 JTAG接口SWD下载接线图

  7. Django【第24篇】:JS实现的ajax和同源策略

    JS实现的ajax和同源策略 一.回顾jQuery实现的ajax 首先说一下ajax的优缺点 优点: AJAX使用Javascript技术向服务器发送异步请求: AJAX无须刷新整个页面: 因为服务器 ...

  8. 安卓手机通过有线连接PC上网

    因手机wifi坏了,速度上限为2.5m/s.无法发挥出100m带宽的威力. 这里探索各大神的指导,记录下其中一种方式. :链接       主题:使用openvpn和手机的USB共享网络 通过mico ...

  9. 前端面试题常考&必考之--http中的post和get的区别

    从字面上看,post是发送,则是提交数据,get是获得,则是获取数据,没毛病,我们可以就按字面来理解 具体就看图吧 吐槽:插入的表格不好用,不知道是自己不会用还是真不好用,变成了截图,修饰了下子

  10. 进阶:python3实现 插入排序

    一图胜千言,插入排序的核心逻辑如下: 将数据分成两半,前一半是已排好序的,后一半是待排序的 每次取后一半中的第一个数,在已排序的一半中,逆序依次比较,找到要插入的位置 记录插入的位置,在最后判断是否需 ...