您的位置:首页 > 编程语言 > Java开发

Struts2.0学习笔记---ognl表达式的常见用法

2016-09-18 09:42 344 查看
OGNL优点:

1.能够访问对象的方法,例如list.size()

2.能够访问静态属性和静态方法

3.支持赋值操作与表达式串联  如 #value=5;

4.访问OGNL上下文和ActionContext(所有的servlet资源)

5.操作集合类对象



注attr对象从小到大的范围寻找,一旦找到了属性值,便不会继续寻找下去。

比如你想获取request域中的内容,可以这样:

<%
request.setAttribute("name", "swk");
%>

<s:property  value="#request.name"/>

举个例子:

ognlSuccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="struts"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">

<style type="text/css">
body,td {
font-size: 12px;
}
</style>
</head>

<body>
<hr />
所有的ID:<struts:property value="#parameters.id"/> <br/>
第一个ID:<struts:property value="#parameters.id[0]"/> <br/>
request 中取属性:<struts:property value="#request.account"/> <br/>
session 中取属性:<struts:property value="#session.account"/> <br/>
application 中取属性:<struts:property value="#application.account"/> <br/>
attr 中取属性:<struts:property value="#attr.account"/> <br/>
<hr />
价格大于18元的杂志共有 <struts:property value="magazineList.{?#this.price>18}.size()" /> 本,分别是:<br/>
<struts:iterator value="magazineList.{?#this.price>18}">
<struts:property value="name" /> - ¥<struts:property value="price" />. <br/>
</struts:iterator>
<hr />
名称包含“时代”二字的杂志共有 <struts:property value="magazineList.{?#this.name.contains('时代')}.size()"/> 本,分别是:<br/>
<struts:iterator value="magazineList.{?#this.name.contains('时代')}">
<struts:property value="name" /> - ¥<struts:property value="price" />. <br/>
</struts:iterator>
<hr />
“足球之夜”的价格为 ¥<struts:property value="magazineList.{?#this.name.contains('足球之夜')}[0].price"/>。
<hr />

<!-- 一个标签内容既可以是文本,也可以是OGNL表达式时,这时标有 % 的被当作OGNL表达式,没有标 % 被当作普通字符串  -->
<struts:form>
<struts:label label="#request.account"></struts:label>
<struts:label label="%{#request.account}"></struts:label>
</struts:form>

</body>
</html>
OgnlAction.java

package com.haowan;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;

import com.javabean.Magazine;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;

//使用ServletContextAware便可以使用ServletContext对象,ServletRequestAware便可以使用request对象,SessionAware便可以使用Map<String,Object> session
public class OgnlAction extends ActionSupport implements ServletContextAware,
ServletRequestAware, SessionAware {

private static final long serialVersionUID = -6175904602786022346L;

private HttpServletRequest request;
private ServletContext application;
private Map<String, Object> session;

@SuppressWarnings("all")
private List<Magazine> magazineList = new ArrayList<Magazine>() {
{
add(new Magazine("时代周刊",10));
add(new Magazine("足球之夜", 19));
add(new Magazine("时尚", 20));
add(new Magazine("时代影视", 50));
}
};

public void setServletRequest(HttpServletRequest request) {
this.request = request;
}

public void setServletContext(ServletContext application) {
this.application = application;
}

@SuppressWarnings("all")
public void setSession(Map session) {
this.session = session;
}

public String execute() {

request.setAttribute("account", "account from request");
application.setAttribute("account", "account from response");
session.put("account", "account from session");

return Action.SUCCESS;
}

public List<Magazine> getMagazineList() {
return magazineList;
}

public void setMagazineList(List<Magazine> bookList) {
this.magazineList = bookList;
}

}
struts.xml

<action name="ognl" class="com.haowan.OgnlAction">
<result>ognlSuccess.jsp</result>
</action>






#有三种用途:

1.#paramters 代表request提交的所有参数,#request代表request所有属性,#session,#application,#attr同前

2.用于过滤或者筛选集合 books.{#?this.price<20}表示所有价格低于20的书

3.用于构造map,#{'foo1':'bar1' , 'foo2':'bar2' };

若是要创建一个list对象,

    <s:set var="list" value="{'第一个','第二个','第三个'}"/>
    <!-- s:iterator标签在迭代集合时有个特点:会把当前迭达的对象放在值栈的栈顶 -->
    <s:iterator value="#list" >
        <s:property/><br>
    </s:iterator>
若是要创建一个map对象,

<s:set var="maps" value="#{'key1':90, 'key2':35, 'key3':12}"/>
<!-- s:iterator标签在迭代集合时有个特点:会把当前迭达的对象放在值栈的栈顶 -->
<s:iterator value="#maps" >
<s:property value="key"/> = <s:property value="value"/><br>
</s:iterator>

判断元素是否在集合中:



<s:if test="'foo' not in {'xxx','bar'}">
不在
</s:if>
<s:else>
在
</s:else>

ognl的投影:



例如要获取书的价格大于60的。

public class PersonListAction {
private String name;
private List<Book> books;

public List<Book> getBooks() {
return books;
}

public void setBooks(List<Book> books) {
this.books = books;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String execute(){
books = new ArrayList<Book>();
books.add(new Book(56, "javaweb", 90));
books.add(new Book(80, "ejb", 78));
books.add(new Book(23, "spring", 50));
name = "小张";
return "list";
}
}

================会把Book 放在 stack top========= <br/>
<s:iterator value="books.{?#this.price>60}">
<s:property value="name"/>,价格:<s:property value="price"/><br/>
</s:iterator>
便会遍历书的价格大于60的图书。
注意这里容易出错的地方:

<s:set var="list"  value="books.{?this.price>60}"/>
不可以先把这个价格大于60的获取,再遍历这个list,这个道理不难,这里的this指的肯定是书,也就是说,你是一个一个遍历books中的元素,肯定只能遍历一个判断一个,输出一个,而不会是先获取并储存。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息