Struts2中JSP获取值栈(ValueStack)中的数据

JAVAEE 专栏收录该内容
4 篇文章 0 订阅

什么是值栈

值栈就是OGNL表达式存取数据的地方,Struts2是在有请求到达的时候为每个请求创建一个新的值栈,这也就是说值栈和请求是一一对应的,值栈封装了一次请求所需要的所有数据,这种一一对应的关系使值栈能够线程安全地为每个请求提供公共的数据存取服务。

值栈的生命周期

值栈可以作为一个数据的中转站,用于在前台-后台之间传递数据。ValueStack贯穿整个Action的生命周期,每个Action类的对象实例 都拥有一个ValueStack对象,在其中保存当前Action对象和其他相关对象。Struts2框架把ValueStack对象保存在名为”struts.valueStack”的request属性中,也就是说,ValueStack与Action的生命周期保持一致,ValueStack的生命周期是随着request的创建而创建,随着request的销毁而销毁。


在jsp中取Action中的数据

  1. 取普通属性:
    • 在Action中定义以下数据
      private String str;
      //setter 和 getter 方法
      //或者将str修饰符设为public
      public String execute()
      {
      this.str="str";
      }
    • 在jsp中使用EL表达式获取
      ${str}
      //或者用struts标签库
      <s:property value="str"/>
    • 部署运行后在jsp页面中显示 str
  2. 取对象数据
    • 先定义一个User类
      public class User {
      private int id;
      private String name;
      public User(int id, String name) {
      super();
      this.id = id;
      this.name = name;
      }
      //setter and getter
      }
    • 在Action中声明User对象并创建
      private User user;
      //setter and getter
      public String execute()
      {
      this.user = new User(1,"user1");
      return "success";
      }
    • 在jsp中获取user的属性
      <s:property value="user.id" />//${user.id}
      <s:property value="user.name"/><br/>//${user.name}
      ${user.id}${user.name}
    • 部署运行和在jsp页面显示
      1user1
      1user1
  3. 取List集合中的数据
    • Action中定义
      private List<User> list;
      //setter and getter
      public String execute(){
      this.list = new ArrayList<User>();
      //模拟存入数据
      for(int i=0; i<3; i++){
      list.add(new User(i,"username"+i));
      }
      return "success";
      }
    • Jsp页面中获取
      <s:iterator var="u" value="list">//value为Action集合List对象的名称
      <s:property value="#u.id"/>//${u.id}
      <s:property value="#u.name"/><br/>//${u.name}
      </s:iterator>
    • 部署运行后在jsp页面显示
      0 username0
      1 username1
      2 username2
  4. 取Map集合中的数据
    • 在Action中定义对象
      private Map<String, User> map;
      //setter and getter
      public String execute(){
      this.map = new HashMap<String, User>();
      for(int i=0; i<3; i++){
      map.put("user"+i,new User(i,"username"+i));
      }
      return "success";
      }
    • 在JSP中取数据
      <s:iterator var="u" value="map"><!-- u is a entry -->
      //EL取值
      <s:property value="#u.key"/>//${u.key}
      <s:property value="#u.value.id" />//${u.value.id}
      <s:property value="#u.value.name"/><br/>//${u.value.name}
      </s:iterator>
    • 部署运行后显示
      user0 0 username0
      user2 2 username2
      user1 1 username1

PS

  1. 在jsp页面导入struts2标签库
    <%@taglib prefix="s" uri="/struts-tags"%>
  2. EL表达式默认支持在四个作用域取值,分别为page、request、session和application,EL表达式能够访问值栈中数据的原因,就是因为Struts2对request进行了增强,如果在request作用域中没有查找到对应的值,就去值栈中查找,找到后台会将数据取出。在请求范围中找不到时,先作为属性在root中找,找不到会作为key到contextMap中找对应的value
  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

situliang

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值