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

29 篇文章 0 订阅

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中的元素,肯定只能遍历一个判断一个,输出一个,而不会是先获取并储存。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值