如何在Struts 2中使用两个条件的<s:if>语句

6
我遍历一个项目列表,如果元素的状态等于学生或教师,则需要显示特定的下拉列表。以下代码显示所有字段,但不显示任何元素的下拉列表!
 <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: ${Status},结果将是:
value : []
value : []
value : []
value : []
value : []
value : []
value : []
value : []
               

1
@AleksandrM 因为这是一个需要遍历其所有元素的数组列表。[0],[1]等。 - AlexCartio1
1
还是不太清楚。也许您可以展示一下您的操作类和实体,以便我们更好地迭代。 - Aleksandr M
1
你为什么编辑了我的回答中的代码问题?未来的访问者将看不懂。你现在使用大写字母“S”的Status,这是错误的,程序会运行失败。 - Andrea Ligios
1
你显然做错了什么。请发布你正在尝试迭代的实体。 - Aleksandr M
@AlexCartio1:所以你的listOfPeople列表保存了People?请发布People类。 - Aleksandr M
显示剩余2条评论
2个回答

13

%{}放在整个表达式周围,而不是像其他标签的其他属性一样放在中间:

同时使用更适合字符串的等式函数,可以在这里找到描述

<s:if test='%{elements[#element.index].status.equalsIgnoreCase("Student") ||
              elements[#element.index].status.equalsIgnoreCase("Teacher")}'>

编辑:伙计,你做了很多奇怪的事情;

  1. ${Status}是JSP EL,你不需要使用它;
  2. 你正在迭代一个源,并检查另一个源:打印 <s:property value="elements[%{#element.index}].Status" /> 会得到一个空结果,而我在你的代码中看不到那个 elements 的东西;
  3. 属性名以大写字母开头是错误的,因为如果变量名为 foo 并且 getter 是 getFoo(),那么在页面中你将得到 .foo 而不是 .Foo。如果你的变量名为 Foo,那么这违反了规范/最佳实践,让我们从小写字母开始命名变量。

然后,如果你有 private Object Status,请将其更改为 private Object status;,并更改 getter 和 setter,在页面中使用:

<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")}'>

或者简单地说

<s:iterator value="listOfPeople" status="element">
    <s:if test='%{status.equalsIgnoreCase("Student") ||
                  status.equalsIgnoreCase("Teacher")}'>

奇怪的代码会产生奇怪的结果...所以直接使用它 :)


2
它不起作用,我删除了if语句以确保<s:select工作正常,但当我加上条件时它就不显示任何内容。我甚至删除了“or”以使它更简单,但仍然无效。 - AlexCartio1
@AleksandrM 你的意思是什么?不就是遍历listOfPeople吗? - AlexCartio1
@AndreaLigios 这不是这样的,所以很奇怪,无论如何,if条件不起作用的原因是神秘的! - AlexCartio1
1
@AlexCartio1:有时候是,有时候不是。为什么你不愿意展示你的模型? - Aleksandr M
@AleksandrM,因为我认为它正在向浏览器发送正确的信息,无论如何,我已经包含了我的控制器和模型代码。 - AlexCartio1
显示剩余4条评论

1
如果您需要将

感谢您的回复,但正如问题所示,某些条目可能具有其他类型的状态,例如“原则”等。这种情况下,“原则”状态的项目将显示为空状态,这会误导用户。此外,我想禁止用户更改除学生和教师状态以外任何类型状态的项目状态;这就是为什么我首先加入了if条件来避免显示选择这些项目。 - AlexCartio1
另一个问题是,当我复制你的代码时,它显示了一个错误,说在第1行第13列遇到了“:”,期望其中之一:"}" … "." …等等。我需要将其更改为{'Teacher','Student'},这是什么原因? - AlexCartio1
我不知道什么是错误,但使用输入文本字段来保持当前状态的选项如何?由于选择标签是原样的,并且正如您从此答案中看到的那样,无法处理除列出的状态之外的其他状态。 - Roman C
我能够通过结合你和安德里亚的答案来解决它。谢谢。 - AlexCartio1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接