现在的位置: 首页 > 综合 > 正文

Struts标签和OGNL表达式

2011年02月16日 ⁄ 综合 ⁄ 共 2396字 ⁄ 字号 评论关闭

1.OGNL通过索引访问ValueStack中的对象。
[0].name
[1].name
上面使用的索引的方式并不是直接取得指定元素,而是从指定索引开始向下搜索。
访问ValueStack里的属性:${bar}
2.OGNL对非根对象属性的访问前要加#号
#foo.blash
Struts2的命名对象,他们与根对象无关,只是存在于Stack Context中,所以访问他们时需要使用#前缀来指明:
parameters对象:#parameters['foo'] 或 #parameters.foo
request对象:#request['foo'] 或 #request.foo
session对象:#session['foo'] 或 #session.foo
application对象
attr对象:按PageContext,request.session.ServletContext的顺序寻找对象
3.OGNL集合操作
生成List集合:{e1,e2,e2 ...}
生成Map集合:#{key1:value1,key2:value2 ...}
in 与 notin:
<s:if text="'foo' in {'foo','bar'}">...</s:if>
<s:if text="'foo' notin {'foo','bar'}">...</s:if>
获取集合子集:
person.relatives.{? #this.gender == 'male'} (问号可以替换为:^,$)
集合后紧跟.{}元素运算符用于取出集合的子集,而#this代表集合里的元素
4.如果为<s:iterator .../>标签指定status属性,即每次迭代时都会有一个IteratorStatus实例,该实例包含以下方法:getCount(),getIndex(),isEven(),isOdd(),isFirst(),isLast()
在OGNL表达式中可以通过 #st.odd, #st.count来访问,st为IteratorStatus的实例
5.使用iterator迭代Map对象:
<s:iterator value="集合对象" status="st">
    <s:property value="key"/><s:property value="value">
</s:iterator>
6.使用append标签将多个集合拼接成一个新集合,然后使用iterator进行迭代
<s:append id="newList">
    <s:param value="集合1"/>
    <s:param value="集合2"/>
</s:append>
<s:iterator value="#newList">...</s:iterator>
7.generator标签:分割字符串,生成的集合存放在ValueStack栈顶,在标签体中使用iterator迭代,不使用values属性(默认迭代ValueStack栈顶集合),标签结束,此集合即被删除。如果指定了此标签的id,则将临时生成的集合放置到pageContext属性中
<s:generator val="字符串">
    <s:iterator status="st">
        <s:property/> 个人理解:每次迭代都会把迭代元素放到ValueStack栈顶,使用完后即删除,<s:property/>默认去栈顶元素,去完删除,然后迭代下一个
    </s:iterator>
</s:generator>
8.做XXBean对象的编辑时,如医生编译,可以实例化一个医生对象,并设置相关属性,并将这个bean push到ValueStack中,跳转到相关页面。
9.struts2 token防止重复提交的原理:
首先,jsp页面在每次加载的时候都会生成一个新GUID,这个id会分别存放到页面隐藏域和Session中,当页面提交的时候,拦截器将对页面隐藏域中的id与session中的id进行对比,如果相同,则删除session中的id(等待再次请求页面时的再次创建),继续执行,完成后面的操作。但如果此时请求失败,用history.back(-1)返回时,页面中的id与session中已经不相同,再次提交就会出现重复提交的问题。这和F5刷新的道理一样,session中id被删除后,刷新页面,提交上来的id还是原来的id,而session中此时已没有id,判断提交失败!这才是token解决重复提交问题的原理。
10.struts2中ActionContext内置对象的作用(他们都是Map类型的集合):
parameters 包含当前Http请求参数的Map,也包含通过<s:param>标签传进的参数
#parameters.id[0]=request.getParameter("id")
request 包含当前HttpServletReqeust的属性(attribute)的Map
#reqeust.username=request.getAttribute("username");
session 包含当前HttpSession的属性的Map
#session.username=session.getAttribute("username");
application 包含当前ServletContext的属性的Map
#application.username=application.getAttribute("username");
attr 用于按request->session->application顺序访问其属性
11.在action中需要真正使用request,session,application对象是,action要实现ServletRequestAware, SessionAware, ServletContextAware接口

抱歉!评论已关闭.