我遍历项目列表,如果元素的状态等于学生或教师,则需要显示特定的下拉列表。以下代码显示了所有字段,但未显示任何元素的下拉列表!
<s:iterator value="listOfPeople" status="element">
.....
<s:if test='%{elements[#element.index].Status.equalsIgnoreCase("Student") ||
elements[#element.index].Status.equalsIgnoreCase("Teacher")}'>
<s:select name="elements[%{#element.index}].Status"
id="elements[%{#element.index}].Status"
label="Status"
list="#{'Student':'Student','Teacher':'Teacher'}"
headerKey = "-1"
headerValue=" "
value="%{Status}"
/>
</s:if>
在控制器中:
PeopleModel peopleModel = new PeopleModel();
listOfPeople = peopleModel.findPeople();
System.out.println("size is:" + listOfPeople.size()); //returns 8
return "listPeople";
我的模特:
List<People> people = new ArrayList();
final Session session = HibernateUtil.getSession();
try {
final Transaction tx = session.beginTransaction();
try {
Criteria criteria = session.createCriteria(People.class, "People")
people.addAll((List<People>) criteria.list());
if (!tx.wasCommitted()) {
tx.commit();
}
if (session.isOpen()) {
session.close();
}
System.out.println("size is ::: " + people.size()); //returns 8
return people;
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
}
} finally {
HibernateUtil.closeSession();
}
return null;
}
以下代码的结果是自爆
Status: ${Status}
<br/>value : [<s:property value="elements[%{#element.index}].Status" />]
Status : Principle
value : [] Status : Student
value : [] Status : Teacher
value : [] Status : Teacher
value : [] Status : Teacher
value : [] Status : Teacher
value : [] Status : Teacher
value : [] Status : Teacher
value : []
上述结果显示第一个人的状态与其他人分开,这就是为什么最后一个值:[]没有显示任何状态。
如果我取出状态:$ {Status},结果将是
value : []
value : []
value : []
value : []
value : []
value : []
value : []
value : []
答案 0 :(得分:11)
将%{}
放在整个表达式周围,而不是像其他标记的其他属性一样放在中间位置:
还为字符串like described here
使用更合适的相等函数<s:if test='%{elements[#element.index].status.equalsIgnoreCase("Student") ||
elements[#element.index].status.equalsIgnoreCase("Teacher")}'>
编辑:伙计,你做了很多奇怪的事情;
${Status}
是JSP EL,您无需使用它; <s:property value="elements[%{#element.index}].Status" />
会给您一个空结果,我在您的代码中的任何地方都看不到elements
; foo
且getter为getFoo()
,则在页面中您将.foo
,而不是{{1 }}。如果您的变量名为.Foo
,则违反规范/最佳实践,让我们以小写字母开始变量名称。然后,如果您有Foo
,请将其更改为private Object Status
,以及getter和setter,以及页面使用:
private Object status;
或使用var
<s:iterator value="listOfPeople" status="element">
<s:if test='%{listOfPeople[#element.index].status.equalsIgnoreCase("Student") ||
listOfPeople[#element.index].status.equalsIgnoreCase("Teacher")}'>
或只是
<s:iterator value="listOfPeople" status="element" var="row">
<s:if test='%{row.status.equalsIgnoreCase("Student") ||
row.status.equalsIgnoreCase("Teacher")}'>
奇怪的代码导致奇怪的结果......然后直接使用它:)
答案 1 :(得分:1)
如果您需要在if
上预先选择select
标记,则不需要具备这些条件和Status
标记,您应提供有效密钥。 headerKey = "-1"
无效,因为它不是String
。试试headerKey = " "
,密钥不应为空。如果预选值与密钥不匹配,则会显示headerValue
。例如
<s:iterator value="listOfPeople" status="element">
<s:select name="elements[%{#element.index}].Status"
id="elements[%{#element.index}].Status"
label="Status"
list="#{'Student':'Student','Teacher':'Teacher'}"
headerKey=" "
headerValue=" "
value="%{Status}"/>
</s:iterator>