struts2的值栈的初步认识

Struts2


OGNL概述

  1. 在web阶段,用EL表达式在jsp页面获取域对象的值。
  2. 用OGNL功能更强大,效率更高。
  3. 使用一般在struts2里操作值栈数据,和struts2标签一起使用,需要jar包,struts2提供了。
  4. 并且需要引入struts2标签库,<%@ taglib uri = "/struts-tags" prefix = "s" %>
  5. 然后使用<s:property value = "OGNL表达式" />得到值,如:<s:property value = "'haha'.length()" /> 会得到4.

值栈

一、概述

  1. 之前是在servlet中把数据放入域对象再使用。
  2. struts2提供本身的存储机制,类似域对象。在action中把值存入值栈,在页面中获取。
  3. 存储位置:每个访问均创建一个action对象(servlet是只创建一次),每个action中拥有自己的唯一个值栈对象。

二、值栈内部结构

  1. 值栈主要分为两部分,root和context。
  2. root是一个List集合,一般的操作就是操作root。
  3. 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对应的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值