Struts2:OGNL表达式,遍历List、Map集合;投影的使用

这里修改通过Servlet action传播到jsp。理解Servlet #。 理解Stack Context ,value stack 。username 传输不过来的原因—private了! 对于标签中valuestack(值栈) 和 stack context(sc):一些标签中的var=”0”只是当父类标签生命周期存的时候才放在值栈当中(即—放置在<>\[之间的这个地方\])。 然而生命周期结束就会被放置在,JavaEE的OGNL自己的“银行”(sc)当中去!(有利于值栈资源的利用.) 阅读文章时理解难点是:值栈和sc 标签的使用 和 Servlet Request、ActionContext对于Servlet访问的理解,前者是jsp、Http提供的方法类,而后者是Struts2提供的访问Servlet的方法。

OGNL中$、%、#、{}、^、$ 标签的使用简介

Struts2的ActionContext是来自于Ognl的上下文,是OGNL的一个增强,在Struts2的Context的根对象就是Action。因为只有根对象时可以直接访问的,不需要加任何标记,比如request,session,application这些对象在访问时都不需要加#号。

OGNL中$号的使用 1..在国际化资源文件中,引用OGNL表达式 2..在struts.xml文件中,引用OGNL表达式

OGNL中%号的使用

“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。

这个类似js中的eval,很暴力。

1..使用%{}可以取出保存在值堆栈中的Action对象,直接调用它的方法 2..如果Action继承了ActionSupport,那么在页面标签中可以使用%{getText(‘key’)}获取国际化信息

OGNL中#号的使用 OGNL中的#号可以取出堆栈上下文中存放的对象

名称

作用

例子

attr

用于按request>>session>>application顺序访问其属性

attr.userName相当于按顺序从三个范围读取userName属性直到找到为止

request

包含当前HttpServletRequest的属性的Map

request.userName相当于request.getAttribute(“userName”)

session

包含当前HttpSession的属性的Map

session.userName相当于session.getAttribute(“userName”)

application

包含当前应用的ServletContext的属性的Map

application.userName相当于application.getAttribute(“userName”)

parameters

包含当前HTTP请求参数的Map

parameters.id[0]相当于request.getParameter(“id”)

#符号的用途一般有三种: — 、访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute(“msg”) 。 二、用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name==’pla1’}.{age}[0]。 三、用来构造Map,例如示例中的#{‘foo1’:’bar1’, ‘foo2’:’bar2’}。

利用投影获取属性 利用投影获取List中对象的username属性时,其中{}表示的是一个集合 stus.{username}就表示将suts中所有的username属性取出组成一个新的列表

利用选择获取属性

OGNL表达式是很灵活的,可以同时使用选择技术与投影技术获取属性 使用选择技术时,#this代表当前元素,问号?是把所有满足条件的元素都取出来。 上箭头^是开始的意思,即取符合条件的数据索引中第一条数据,所以stus.{^#this.grade>=60}.{username}输出的是[张三] 注意,此时输出文本中包含中括号,这表示它是一个列表。 而stus.{?#this.grade>=60}.{username}[0]输出的是张三,是字符串,二者是不同的。 美元符号$是结束的意思,即取符合条件的数据索引中最后一条数据,所以stus.{$#this.grade>=60}.{username}输出的是[王五] 这三个符号:问号、上箭头、美元符所返回的都是List

另符两语法: 使用Top语法获取值栈中的第二个对象的属性: 使用 N 语法获取值栈中的第二个对象的属性:

OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

片头(ognl.jsp)

<%
request.setAttribute(“para”, “request scope attribute”);
request.getSession().setAttribute(“para”, “session scope attribute”);
request.getSession().getServletContext().setAttribute(“para”, “aplication scope attribute”);
List listStudent = new ArrayList();
listStudent.add(new Student(1, “张三”, new Date()));
listStudent.add(new Student(2, “李四”, new Date()));
listStudent.add(new Student(3, “赵五”, new Date()));
listStudent.add(new Student(4, “孙六”, new Date()));
listStudent.add(new Student(5, “钱七”, new Date()));
pageContext.setAttribute(“listStudent”, listStudent);
%>

调用

http://127.0.0.1:8080/st/ssh/demo6/ognl.jsp?para=hello

1. 通过OGNL表达式获取属性范围中的值

<br/>
HTTP parameters para = <s:property value="#parameters.para" />
<br/>
request attribute para = <s:property value="#request.para" />
<br/>
session attribute para = <s:property value="#session.para" />
<br/>
application attribute para = <s:property value="#application.para" />
<br/>
attr attribute para = <s:property value="#attr.para" />
<br/>
<hr>

输出:

HTTP parameters para = hello request attribute para = request scope attribute session attribute para = session scope attribute application attribute para = aplication scope attribute attr attribute para = request scope attribute

2. 通过OGNL表达式创建list集合,并且遍历出集合中的值

<br>
<s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"></s:set>
<s:iterator value="#list" var="o">
    ${o}<br/>
    <!--<s:property />-->
</s:iterator>
<br/>
<hr>

输出: eeeee ddddd ccccc bbbbb aaaaa

3. 通过OGNL表达式创建Map集合,并且遍历出集合中的值

<br>
<s:set name="map"
    value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}"></s:set>
<s:iterator value="#map" var="o">
    ${o.key}->${o.value}<br/>
    <!\-\-    <s:property value="#o.key"/>-><s:property value="#o.value"/><br/>   -->
    <!\-\-    <s:property value="key" />-><s:property value="value" /> -->
</s:iterator>
<br/>
<hr>

输出: 1->eeeee 2->ddddd 3->ccccc 4->bbbbb 5->aaaaa

4. 通过OGNL表达式,进行逻辑判断

<br>
<s:if test="'aaa' in {'aaa','bbb'}">
    aaa 在 集合{'aaa','bbb'}中;
</s:if>
<s:else>
    aaa 不在 集合{'aaa','bbb'}中;
</s:else>
<br/>
<s:if test="#request.req not in #list">
    不 在 集合list中;
</s:if>
<s:else>
    在 集合list中;
</s:else>
<br/>
<hr>

输出: aaa 在 集合{‘aaa’,’bbb’}中; 不 在 集合list中;

5. 通过OGNL表达式的投影功能进行数据筛选

<s:iterator value="#attr.listStudent.{?#this.id % 2 != 0}" var="cur">
    <s:property value="#cur.username"/>
</s:iterator>
<br/>
<s:iterator value="#attr.listStudent.{^#this.id % 2 != 0}" var="cur">
    <s:property value="#cur.username"/>
</s:iterator>
<br/>
<s:iterator value="#attr.listStudent.{$#this.id % 2 != 0}" var="cur">
    <s:property value="#cur.username"/>
</s:iterator>
<br/>
<s:property value="#attr.listStudent.{username}\[0\]"/>
<br/>
<s:property value="#attr.listStudent.{$#this.id == 3}.{username}\[0\]"/>
<br/>

输出: 张三 赵五 钱七 张三 钱七 张三 赵五

6. 通过OGNL表达式访问某个类的静态方法和值

<br>
<s:property value="@java.lang.Maths@floor(32.56)" />
<br/>
<hr>

输出: 32.0

7. OGNL表达式 迭代标签 详细

<br>
<s:set name="list2"
    value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"></s:set>
<table border="1">
    <tr>
        <td>
            索引
        </td>
        <td>
            值
        </td>
        <td>
            奇?
        </td>
        <td>
            偶?
        </td>
        <td>
            首?
        </td>
        <td>
            尾?
        </td>
        <td>
            当前迭代数量
        </td>
    </tr>
    <s:iterator value="#list2" var="o" status="s">
        <tr bgcolor="<s:if test="#s.even">pink</s:if>">
            <td>
                <s:property value="#s.getIndex()" />
            </td>
            <td>
                <s:property />
            </td>
            <td>
                <s:if test="#s.odd">Y</s:if>
                <s:else>N</s:else>
            </td>
            <td>
                <s:if test="#s.even">Y</s:if>
                <s:else>N</s:else>
            </td>
            <td>
                <s:if test="#s.first">Y</s:if>
                <s:else>N</s:else>
            </td>
            <td>
                <s:if test="#s.isLast()">Y</s:if>
                <s:else>N</s:else>
            </td>
            <td>
            <s:property value="#s.getCount()"/>
        </td>
        </tr>
    </s:iterator>
</table>

输出:

8. 完整代码(ognl.jsp)

<%@ page language=”java” import=”java.util.*,com.clzhang.ssh.demo6.Student” pageEncoding=”utf-8”%>
<%@ taglib uri=”/struts-tags” prefix=”s”%>
<%
request.setAttribute(“para”, “request scope attribute”);
request.getSession().setAttribute(“para”, “session scope attribute”);
request.getSession().getServletContext().setAttribute(“para”, “aplication scope attribute”);
List listStudent = new ArrayList();
listStudent.add(new Student(1, “张三”, new Date()));
listStudent.add(new Student(2, “李四”, new Date()));
listStudent.add(new Student(3, “赵五”, new Date()));
listStudent.add(new Student(4, “孙六”, new Date()));
listStudent.add(new Student(5, “钱七”, new Date()));
pageContext.setAttribute(“listStudent”, listStudent);
%>
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

1\. 通过OGNL表达式获取属性范围中的值
HTTP parameters para =
request attribute para =
session attribute para =
application attribute para =
attr attribute para =

2\. 通过OGNL表达式创建list集合,并且遍历出集合中的值
${o}


3\. 通过OGNL表达式创建Map集合,并且遍历出集合中的值
${o.key}->${o.value}
->
--> -> -->


4\. 通过OGNL表达式,进行逻辑判断
aaa 在 集合{'aaa','bbb'}中; aaa 不在 集合{'aaa','bbb'}中;
不 在 集合list中; 在 集合list中;

5\. 通过OGNL表达式的投影功能进行数据筛选






6\. 通过OGNL表达式访问某个类的静态方法和值


7\. OGNL表达式 迭代标签 详细
pink">
索引 奇? 偶? 首? 尾? 当前迭代数量
Y N Y N Y N Y N

Student.java(只用到部分方法)

package com.clzhang.ssh.demo6;
import java.util.*;
public class Student {
private int id;
private String username;
private int grade;
private Date birthday;
//只要是重写一个类的构造方法,就必须要为这个类保留空的构造方法
//因为框架默认的都会去调用无参的空的构造方法
public Student(){};
public Student(int id, String username, Date birthday) {
this.id = id;
this.username = username;
this.birthday = birthday;
}
public Student(String username,int grade){
this.username = username;
this.grade = grade;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
//如果不重写它的toString()方法的话,默认调用toString()将输出【类型+@+内存地址的哈希值】
return “{学生姓名:” + username + “,成绩:” + grade + “}”;
}
}

更多阅读参考:

struts2中的OGNL表达式(转) struts2:遍历自定义字符串数组,遍历Action实例所引用对象中的数组

(っ•̀ω•́)っ✎⁾⁾ 坚持技术学习、内容输出与分享,您的支持将鼓励我继续创作!(*/ω\*)
( • ̀ω•́ )✧如有疑问或需要技术讨论,请留言或发邮件到 aclearzhang@qq.com.(*・ω< ) 
  • 本文作者:: AClearZhang
  • 本文链接:: 1221.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!