Подтвердить что ты не робот

Struts 2 итерация перечисления

Возможно ли в Struts 2 повторить переименование с использованием тега <s:iterator>? Прямо сейчас я делаю это, используя список String, но можно ли напрямую использовать перечисление?

Спасибо заранее.

4b9b3361

Ответ 1

Да. Это немного уродливо, ответ - это доступ к статическому методу, использование внутреннего синтаксиса класса для выражения OGNL (использует "$" ), и вместе они позволят вам получить метод значений, как уже упоминалось Стивеном. Вот пример:

Пример действия:

package com.action.test;
import com.opensymphony.xwork2.ActionSupport;

public class EnumTest extends ActionSupport{
    enum Numbers{ONE, TWO, THREE};
}

Пример JSP:

<%@taglib prefix="s" uri="/struts-tags"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <body>
        <h1>Enum Test</h1>
        //NOTE THE USE OF THE $ character to access the inner class on the following two lines.
        length: <s:property value="@[email protected]().length"/><br/>
        <s:iterator value="@[email protected]()">
            <s:property/><br/>
        </s:iterator> 
    </body>
</html>

Выход


Тест Enum

длина: 3

ONE

ДВА

ТРИ


Примечание. Убедитесь, что включен доступ к статическому методу. Простой способ сделать это - добавить следующее после тега <struts> в struts.xml.
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

Ответ 2

Сорт. Вы не можете перебирать перечисление напрямую, потому что его не набор значений (ссылка enum просто представляет собой одну из констант перечисления). Однако вы можете повторить метод values() перечисления, который является массивом, или вы можете создать EnumSet в своем действии и повторить его.

Пример Enum

package example;

public enum SomeEnum {
  ONE, TWO, THREE;

  /* I don't recall if/how you can refer to non-getters in OGNL. */
  public String getName() {
    return name();
  }
}

Пример JSP

<s:iterator value="@[email protected]()">
  <s:property value="name"/>
</s:iterator>