📜  Struts 2 ValueStack教程(1)

📅  最后修改于: 2023-12-03 15:05:23.435000             🧑  作者: Mango

Struts 2 ValueStack教程

什么是ValueStack?

ValueStack是Struts 2框架中一个非常核心且强大的组件,它可以让我们方便地管理页面上的数据和对象,并且支持从多个源(如Action类、Session、Request等)获取数据和对象。

如何使用ValueStack?

在Struts 2框架中,ValueStack是自动创建的,并且它会在每个请求执行期间持续存在。它可以通过以下几种方式获取:

  1. 调用ActionContext类的get方法,获取当前ActionContext对象,然后通过它的getValueStack方法获取ValueStack对象。
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
  1. 直接在Action类中注入ValueStack对象
public class MyAction extends ActionSupport {

    @Inject
    private ValueStack valueStack;
}

在ValueStack中,可以使用以下方法来获取和设置数据:

  • push(Object obj):将一个对象压入栈中
  • pop():弹出栈顶对象
  • peek():获取栈顶对象,但不弹出
  • get(int index):获取指定下标位置的对象
  • findValue(String expr):根据表达式获取对应的对象
  • setValue(String expr, Object value):设置表达式对应的值
ValueStack的用途

在Struts 2框架中,ValueStack的使用非常广泛,以下是一些常见的使用场景:

关于表单的数据绑定

在使用Struts 2框架进行表单数据绑定时,如果一个表单字段的名称与Action属性的名称相同,那么这个字段的值会自动使用ValueStack从Action中获取。例如:

public class MyAction extends ActionSupport {
    private String name;
    
    // setter and getter here...
}

此时如果在表单中添加一个名为"name"的字段,那么在Action中可以直接使用name属性获取到该字段的值。这是因为ValueStack会优先从栈顶查找属性值,如果没有找到,则会继续查找Action类中对应的属性。

动态属性访问

ValueStack可以使用表达式来访问对象的属性,而这个表达式可以包含对象的方法调用、集合访问等,非常灵活。例如:

public class MyAction extends ActionSupport {
    private Person person;
    
    // setter and getter here...
}

public class Person {
    private String name;
    
    // setter and getter here...
}

在JSP页面中,可以通过如下表达式获取Person对象的name属性:

<s:property value="'person.name'"/>

这个表达式包含了一个“person”字符串和一个“.name”字符串,其中点号表示属性的访问。

集合访问

使用ValueStack可以非常方便地访问集合类型的数据,例如List、Map等。例如:

public class MyAction extends ActionSupport {
    private List<String> names;
    private Map<String, String> infos;
    
    // setter and getter here...
}

那么在JSP页面中,可以通过如下表达式访问这些集合的数据:

<s:iterator value="names">
    <s:property/>
</s:iterator>

<s:iterator value="infos">
    <s:property/>
</s:iterator>

其中<s:iterator>标签表示集合遍历,value属性表示要遍历的集合对象,而<s:property>标签表示属性访问。需要注意的是,当要访问Map类型的集合时,需要使用<s:property>标签的“key”属性指定键名称。

总结

ValueStack是Struts 2框架中非常重要的一部分,它可以让我们非常方便地管理页面上的数据和对象,具有广泛的应用场景,是每个Struts 2开发者必须掌握的知识点。