📅  最后修改于: 2023-12-03 15:05:23.435000             🧑  作者: Mango
ValueStack是Struts 2框架中一个非常核心且强大的组件,它可以让我们方便地管理页面上的数据和对象,并且支持从多个源(如Action类、Session、Request等)获取数据和对象。
在Struts 2框架中,ValueStack是自动创建的,并且它会在每个请求执行期间持续存在。它可以通过以下几种方式获取:
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
public class MyAction extends ActionSupport {
@Inject
private ValueStack valueStack;
}
在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开发者必须掌握的知识点。