如何在Struts 2中制作具有两个条件的<s:if>标签?

问题描述 投票:0回答:2

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

 <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 : []
               
java jsp struts2 ognl struts-tags
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")}'>

或使用 var

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

奇怪的代码会导致奇怪的结果......然后直接使用它:)


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>
© www.soinside.com 2019 - 2024. All rights reserved.