propertyvalue="xxx"/>。
3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。
4.值栈(ValueStack):
可以在值栈中放入、删除、查询对象。
访问值栈中的对象不用“#”。
Struts2总是把当前Action实例放置在栈顶。
所以在OGNL中引用Action中的属性也可以省略“#”。
5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。
OGNL中重要的3个符号:
#、%、$:
#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……
1.#符号
#符号的用途一般有三种。
— 访问非根对象属性,例如#session.msg表达式,由于Struts2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。
实际上,#相当于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'}。
2.%符号
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。
3.$符号
$符号主要有两个方面的用途。
— 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:
reg.agerange=国际化资源信息:
年龄必须在${min}同${max}之间。
— 在Struts2框架的配置文件中引用OGNL表达式,例如:
1.
2.
3.
4. 10
5. 100
6. BAction-test校验:
数字必须为${min}为${max}之间!
7.
8.
9.
下面通过代码对OGNL有更深的了解:
action类OgnlAction.java:
1.package com.tjcyjd.test.action;
2.
3.import java.util.Date;
4.import java.util.LinkedList;
5.import java.util.List;
6.
7.import javax.servlet.http.HttpServletRequest;
8.
9.import org.apache.struts2.ServletActionContext;
10.import org.apache.struts2.convention.annotation.Action;
11.import org.apache.struts2.convention.annotation.Namespace;
12.import org.apache.struts2.convention.annotation.ParentPackage;
13.import org.apache.struts2.convention.annotation.Result;
14.import org.apache.struts2.convention.annotation.Results;
15.import org.springframework.stereotype.Controller;
16.
17.import com.opensymphony.xwork2.ActionContext;
18.import com.opensymphony.xwork2.ActionSupport;
19.
20.@Controller
21.@Namespace("/test")
22.@ParentPackage("struts-default")
23.@Results( { @Result(name = "success", location = "/other_test/showognl.jsp"),
24. @Result(name = "fail", location = "/bbs/admin_login.jsp"),
25. @Result(name = "input", location = "/bbs/admin_login.jsp") })
26.public class OgnlAction extends ActionSupport {
27. private static final long serialVersionUID = -1494290883433357310L;
28. private List persons;
29.
30. @Action("ognlTest")
31. public String ognlTest() throws Exception {
32. // 获得ActionContext实例,以便访问Servlet API
33. ActionContext ctx = ActionContext.getContext();
34. // 存入application
35. ctx.getApplication().put("msg", "application信息");
36. // 保存session
37. ctx.getSession().put("msg", "seesion信息");
38. // 保存request信息
39. HttpServletRequest request = ServletActionContext.getRequest();
40. request.setAttribute("msg", "request信息");
41. // 为persons赋值
42. persons = new LinkedList();
43. Person person1 = new Person();
44. person1.setName("pla1");
45. person1.setAge(26);
46. person1.setBirthday(new Date());
47. persons.add(person1);
48.
49. Person person2 = new Person();
50. person2.setName("pla2");
51. person2.setAge(36);
52. person2.setBirthday(new Date());
53. persons.add(person2);
54.
55. Person person3 = new Person();
56. person3.setName("pla3");
57. person3.setAge(16);
58. person3.setBirthday(new Date());
59. persons.add(person3);
60.
61. return SUCCESS;
62.
63. }
64.
65. public List getPersons() {
66. return persons;
67. }
68.
69. public void setPersons(List persons) {
70. this.persons = persons;
71. }
72.}
jsp页面showognl.jsp:
1.<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
2.
3.<%@ taglib prefix="s" uri="/struts-tags" %>
4.
DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:
//www.w3.org/TR/ xhtml1/DTD/xhtml1-transitional.dtd">
5.
6.
//www.w3.org/1999/xhtml">
7.
8.