Struts2
OGNL概述
- 在web阶段,用EL表达式在jsp页面获取域对象的值。
- 用OGNL功能更强大,效率更高。
- 使用一般在struts2里操作值栈数据,和struts2标签一起使用,需要jar包,struts2提供了。
- 并且需要引入struts2标签库,
<%@ taglib uri = "/struts-tags" prefix = "s" %>
- 然后使用
<s:property value = "OGNL表达式" />得到值
,如:<s:property value = "'haha'.length()" />
会得到4.
值栈
一、概述
- 之前是在servlet中把数据放入域对象再使用。
- struts2提供本身的存储机制,类似域对象。在action中把值存入值栈,在页面中获取。
- 存储位置:每个访问均创建一个action对象(servlet是只创建一次),每个action中拥有自己的唯一个值栈对象。
二、值栈内部结构
- 值栈主要分为两部分,root和context。
- root是一个List集合,一般的操作就是操作root。
- context是一个Map集合,一般不会手动操作。并且key值是固定的,有request,session,application,paramters,attrs。
三、获取值栈对象
使用ActionContext类的方法
ActionContext actionContext = ActionContext.getContext();
ValueStack stack = actionContext.getValueStack();
注意:要在jsp页面过去值栈,首先要通过action转发到jsp,不能直接访问jsp
四、向值栈中存数据
1:通过push方法(一般不用)
stack.push(Object);
如:stack.push("ABCD");
2:通过set方法(很少使用)
stack.set(key,Object);
如:stack.set("username","lalalalala");
3:通过action的属性存入
注意!此种方法是存入action中,比前两种更省空间。
(1)定义变量和get()方法。在action的成员变量的位置,
private String name; //存入一个字符串
public String getName() {
return name;
}
private User user; //存入一个对象
public User getUser() {
return user;
}
private List<User> list; //存入一个list集合,集合的泛型是一个类
public List<User> getList() {
return list;
}
(2)设置值。一般在execute()方法中
name = "This is my name";
user = new User(); //注意在这里要new
user.setUsername("李"); //设置值
user.setPassword("123");
user.setAddress("美gui");
list = new ArrayList<User>();
list.add(user); //添加值
list.add(user);
五、在jsp页面从值栈中获取数据
1:使用debug标签查看值栈结构
<s:debug></s:debug>
2:获取字符串
<s:property value = "name"/> //This is my name
3:获取对象
<s:property value = "user.username"/> //李
<s:property value = "user.password"/> //123
<s:property value = "user.address"/> //美gui
4:获取list集合
//第一种,知道下标
<s:property value = "list[0].username"/>
<s:property value = "list[0].password"/>
<s:property value = "list[0].address"/>
//第二种,循环
<s:iterator value = "list">
<s:property value = "username"/> //在这里可以直接写放入的对象的属性
<s:property value = "password"/>
<s:property value = "address"/>
<br/>
</s:iterator>
//第三种,高性能
<s:iterator value = "list" var = "user">
<s:property value = "#user.username"/>
<s:property value = "#user.password"/>
<s:property value = "#user.address"/>
<br/>
</s:iterator>
因为这种是从root临时放到了context,有一个临时空间,那么要访问context需要'#'。
5:若使用set方法存入的值栈
<s:property value = "对应key"/>
6:若使用push存入的值栈(真的基本不用)
7:不是放入值栈,而是放入request等域
因为request,session,application等都是在context中,那么也可以获得。
<s:property value = "#request.key" />
如:
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("req","reqValue");
<s:property value = "#request.req" /> 既可以获取到 reqValue
8:在表单中,想设置初始值用OGNL
需要用到 %
<s:textfield name = "...." value = "%{#request.req}" />
那么初始值就是context中的request的req对应的值。