我正在使用Struts2。请帮助我理解如何在不使用Struts迭代器标记的情况下使用Struts2标记检索HashSet
的元素。
<struts>
<constant name="struts.devMode" value="true" />
<package name="bundle" extends="struts-default" namespace="/">
<action name="fetchPage">
<interceptor-ref name="defaultStack" />
<result name="success">/jsp/page.jsp</result>
</action>
<action name="process"
class="sample.action.Process"
method="execute">
<interceptor-ref name="defaultStack" />
<result name="success">/jsp/result.jsp</result>
</action>
</package>
</struts>
package sample.action;
import java.util.HashSet;
import java.util.Set;
import sample.pojo.Customer;
import com.opensymphony.xwork2.ActionSupport;
public class Process extends ActionSupport
{
private Set<Customer> result = new HashSet<Customer>();
public String execute()
{
Customer cust1 = new Customer();
cust1.setAge(59);
cust1.setName("Subramanian");
result.add(cust1);
return SUCCESS;
}
public Set<Customer> getResult() {
return result;
}
public void setResult(Set<Customer> result) {
this.result = result;
}
}
package sample.pojo;
public class Customer{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
<!DOCTYPE html>
<html>
<head>
<%@ taglib prefix="s" uri="/struts-tags"%>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=8;" />
<title>Welcome Page</title>
</head>
<body>
Welcome!
<s:textfield id="custName" value="%{result[0].name}"/>
</body>
</html>
使用上述代码,我无法在HashSet
页面中阅读result.jsp
对象值。
答案 0 :(得分:2)
您可以使用()
表示法而不是[]
。最后一个是List
和数组,或Map
。因此,它不适用于Set
。
<s:textfield id="custName" value="%{result(0).name}"/>
您应该将id
属性添加到元素的类型中。 id
是映射集合的默认密钥。
public class Customer{
Integer id;
String name;
int age;
//getter and setter
}
将id
属性与其他人一起初始化
Customer cust1 = new Customer();
cust1.setId(0);
cust1.setAge(59);
cust1.setName("Subramanian");
result.add(cust1);
您可以在Indexing a collection by a property of that collection中了解有关类型转换的详情。
也是了解Indexing的OGNL开发指南。
答案 1 :(得分:1)
如何在不使用HashSet
的情况下使用Struts2标记检索<s:iterator>
的元素?
使用一些称为投影的OGNL魔法。
<s:textfield id="custName" value="%{result.{name}[0]}" />
result.{name}
将根据name
中的所有result
值创建一个列表,[0]
将检索该列表的第一个元素。
请注意,因为您使用HashSet
迭代顺序无法保证。使用LinkedHashSet
来实现可预测的迭代顺序。
答案 2 :(得分:0)
如果您想保留Set
,可以使用
<s:property value="%{result.iterator.next.name}"/>
或者
将Set
更改为List
,列表中有一个get
方法,但该方法没有。{/ p>
之后,以下两个都可以使用
<s:property value="%{result[0].name}"/>
<s:property value="%{result.get(0).name}"/>