Как получить доступ к вложенным элементам в struts2 с тегом foreach? - PullRequest
0 голосов
/ 10 июля 2009

У меня есть следующая проблема в Struts 2.

Давайте предположим, что у меня есть такой класс

 class User {
       private String name;
       private String address;
       public String getName() { return name;}
       public String getAddress() { return address;}
    }

и список пользователей, доступных на ValueStack, с именем: users и список пользовательских свойств, доступных также в ValueStack, как: userProps . В этом случае userProps будет {имя, адрес}.

Теперь я хочу перебрать список users и динамически получить доступ к свойствам одного пользователя через userProps .

Вот как:

 <s:iterator value="#users" var="user">
    <s:iterator value="#userProps" var="prop">    
      **<%--- HOW to get user.name, user.address ???%>**
       <s:property value="#user.%{#prop}"/>
    </s:iterator>
 </s:iterator>

Я не знаю, как оценить # user. # Data для получения значения # user.name или # user.address ??

Спасибо.

Ответы [ 4 ]

0 голосов
/ 23 марта 2011

Самое простое решение это:

Вам нужно обернуть ActionSupport и реализовать метод, т.е. eval

public class ActionSupportWrapper extends ActionSupport {
  ...
  public Object eval(String name) {
     return ActionContext.getContext().getValueStack().findValue(name);
  }
}

Затем вы можете делать то, что вы просили в своем JSP

<s:iterator value="#users" var="user">
    <s:iterator value="#userProps" var="prop">
       <s:property value="eval('#user.'+#prop)"/>
    </s:iterator>
 </s:iterator>

Другой способ - реализовать собственный тег с расширением ComponentTagSupport, присвоив ему имя в tld , чтобы вы могли вызывать его из своего jsp

<myPrefix:eval value="'#user.'+#prop" />
0 голосов
/ 13 июля 2009

Кажется, что Struts2 не поддерживает двойную оценку ... только то, что я пытался сделать.

Но вот мой обходной путь!

<% 
 ValueStack vs = ActionContext.getContext.getValueStack();
 %>
<s:iterator value="#users" var="user">
    <s:iterator value="#userProps" var="prop">    

       <%
        String userProp =(String) vs.findValue("#prop");
        Object userPropVal = vs.findValue("#users."+userProp);
        vs.getContext().put("userPropValKey", userPropVal);
       %>
       <s:property value="#userPropValKey"/>
    </s:iterator>
 </s:iterator>

Тадааа .. и все работает!

0 голосов
/ 12 мая 2010

Отлично, двойная оценка должна была быть предоставлена. В любом случае, что я сделал, это:

Создан метод, который принимает параметры в классе Action, действие Bec находится в Valustack, вы можете вызывать методы, напрямую передавая значения, для которых требуется двойная проверка.

А звонить можно откуда угодно ..

public Object findValueFromValueStack(String objectRef,String expression){

//get valuStack
//Get value for expression
//Then pass the value and scoped object reference to get the final value..

}
0 голосов
/ 12 июля 2009

Во-первых, правильна ли строка в вашем примере? Разве вы не должны пытаться:

<s:property value="#user.%{#prop}"/>

Во-вторых, вы пытались использовать парены? Что-то вроде:

<s:property value="#user.(#prop)"/>

Согласно документации OGNL, он может делать то, что вы хотите (я сам не пробовал).

http://www.opensymphony.com/ognl/html/LanguageGuide/paren.html

http://www.opensymphony.com/ognl/html/LanguageGuide/chainedSubexpressions.html

Если это не поможет, возможно, поможет поддержка индексированных свойств OGNL. См. Раздел «Индексированные свойства объекта OGNL» в конце.

http://www.opensymphony.com/ognl/html/LanguageGuide/indexing.html

...