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. 【玩转Eclipse】——eclipse实现代码块折叠-类似于VS中的#region……#endregion

    [玩转Eclipse]——eclipse实现代码块折叠-类似于VS中的#region……#endregion http://www.cnblogs.com/Micheal-G/articles/507 ...

  2. Python 中Semaphore 信号量对象、Event事件、Condition

    Semaphore 信号量对象 信号量是一个更高级的锁机制.信号量内部有一个计数器而不像锁对象内部有锁标识,而且只有当占用信号量的线程数超过信号量时线程才阻塞.这允许了多个线程可以同时访问相同的代码区 ...

  3. Linux--用户与用户组--03

    用户管理: 1.useradd 创建用户 -c 指定用户描述 -d 指定家目录 -g 指定主组 -G 指定附加组 附加组可以有多个 -s 指定shell程序 特殊的/sbin/nologin--> ...

  4. 【转】linux 查看哪些进程用了swap

    转自:http://blog.csdn.net/xiangliangyu/article/details/8213127 如果系统的物理内存用光了,则会用到swap.系统就会跑得很慢,但仍能运行;如果 ...

  5. AtCoder Beginner Contest 088 D Grid Repainting

    Problem statement We have an H×W grid whose squares are painted black or white. The square at the i- ...

  6. maven 查找依赖的办法

    maven 你需的jar包名称 repository 比如我要做EJB,我要找jboss-j2ee.jar的Dependency 就在GOOGLE里输入 maven jboss-j2ee reposi ...

  7. Linux为程序员添加了行为准则

    假如你是开发人员,如果您密切关注Linux开发,您就会知道Linux内核讨论会非常热烈.最近,LinusTorvalds承认Linux内核邮件列表(LKML)和其他Linux开发空间对许多人都是敌对的 ...

  8. Git版本控制工具初识

    Git使用教程 0 Git下载安装 下载网址:https://www.git-scm.com/download/ 安装时,一路next就可以了,如果遇到下载很慢时,可以选择换个浏览器试试,实在不行就找 ...

  9. 【bzoj2821】作诗(Poetize)

    *题目描述: 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗 之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次,每次只阅 ...

  10. APK文件结构和安装过程

    APK文件结构Android应用是用Java编写的,利用Android SDK编译代码,并且把所有的数据和资源文件打包成一个APK (Android Package)文件,这是一个后缀名为.apk的压 ...