如何在Struts2中使用if有两个条件

时间:2014-03-11 03:49:19

标签: jsp struts2

我遍历项目列表,如果元素的状态等于学生或教师,则需要显示特定的下拉列表。以下代码显示了所有字段,但未显示任何元素的下拉列表!

 <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 : []

2 个答案:

答案 0 :(得分:11)

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

还为字符串like described here

使用更合适的相等函数
<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. 属性中第一个大写字母为WRONG,因为如果变量名为foo且getter为getFoo(),则在页面中您将.foo,而不是{{1 }}。如果您的变量名为.Foo,则违反规范/最佳实践,让我们以小写字母开始变量名称。
  4. 然后,如果您有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>