2014-10-23 1 views
1

У меня есть очень простой JSF 2/Facelets страницы, которая выглядит следующим образом:почему действие в <ч: commandLink> не работает внутри составного компонента

<ui:repeat value="#{myBean.names}" var="_name"> 
    <h:commandLink value="#{_name}" action="#{myBean.sayHello(_name)}"> 
    <f:ajax execute="@this"/> 
    </h:commandLink> 
    <br/> 
</ui:repeat> 

Подложка боб обеспечивает java.util.List<String> с именами и метод action просто печатает сообщение "hello <name>" на стандартный вывод.

Это прекрасно работает. Я получаю список имен в браузере, и щелчок запускает метод action, который приветствует указанное имя.

Проблема возникает, когда я хочу, чтобы поместить этот код в составной компонент, который делает итерации и делает фактическую связь через фаской:

<ui:component xmlns="http://www.w3.org/1999/xhtml" 
       xmlns:f="http://xmlns.jcp.org/jsf/core" 
       xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
       xmlns:cc="http://xmlns.jcp.org/jsf/composite"> 
    <cc:interface> 
    <cc:attribute name="value" type="java.util.List" required="true" /> 
    <cc:facet name="content" /> 
    </cc:interface> 
    <cc:implementation> 
    <ui:repeat value="#{cc.attrs.value}" var="_name"> 
    <cc:renderFacet name="content"/> 
    </ui:repeat> 
    </cc:implementation> 
</ui:component> 

я использую составной компонент, как это:

<my:myComp value="#{bean.names}"> 
    <f:facet name="content"> 
    <h:commandLink value="#{_name}" action="#{bean.sayHello(_name)}"> 
     <f:ajax execute="@this"/> 
    </h:commandLink> 
    <br/> 
    </f:facet> 
</my:myComp> 

В браузере я получаю список имен, которые выглядят точно так же, как раньше. Но нажатие ссылки теперь отображает сообщение "hello null". Таким образом, _name разрешен правильно в атрибуте value<h:commandLink>, но не в атрибуте action.

Я также попытался с помощью actionListener вместо action или атрибут listener из <f:ajax> теге без разницы.

Не могли бы кто-нибудь затмить свет по этому вопросу?

Моя среда:

  • WildFly 8,1 с
  • JSF 2.2.6 (Mojarra)

ответ

1

вопрос должен сделать с областью переменной в этом случае _name который оценивается один раз, когда обрабатывается <ui:repeat/>. В моем случае я запустил ваш код, и он произвел Hello John, хотя они были другими именами в моем списке. Чтобы обойти эту проблему, я представил <f:param/>, который будет содержать значение _name, и изменить свой код следующим образом:

<h:form> 
     <my:myComp value="#{bean.names}"> 
      <f:facet name="content"> 
       <h:commandLink value="#{_name}" action="#{bean.sayHello()}"> 
        <f:param name="name_" value="#{_name}"/> 
        <f:ajax execute="@this"/> 
       </h:commandLink> 
       <br/> 
      </f:facet> 
     </my:myComp> 
    </h:form> 

Я также изменил метод sayHello() следующим за @RequestScoped боба:

@ManagedProperty(value = "#{facesContext}") 
private FacesContext facesContext; 

public void setFacesContext(FacesContext facesContext) { 
    this.facesContext = facesContext; 
} 

public void sayHello() { 
    Map<String, String> params = facesContext.getExternalContext() 
       .getRequestParameterMap(); 
    String name = params.get("name_"); 
    System.out.println("Hello " + name); 
} 

Вы можете изменить это на что-то более короткий в @ViewScoped боба к:

public void sayHello() { 
    Map<String, String> params = FacesContext.getCurrentInstance() 
      .getExternalContext().getRequestParameterMap(); 
    String name = params.get("name_"); 
    System.out.println("Hello " + name); 
} 

Конечным результатом является то, что он правильно печатает имена.

+0

Спасибо за ваш ответ. Ваше обходное решение действительно, и это на самом деле то, как я его уже (хотел опубликовать это позже). К сожалению, вы не объясняете детали, почему переменная разрешается один раз (для значения), но не в другое время (для действия). И это то, что меня действительно интересует. Не могли бы вы также предоставить эту информацию, пожалуйста? –

+0

Существует очень хорошее объяснение с примерами здесь: [Значения h: inputText внутри ui: repeat не обрабатываются] (http: // stackoverflow.com/a/16550781/160361) –

+0

Я совершенно уверен, это что-то другое. Мой код работает вне составного компонента и не вызывает никакого сеттера. И переменная, кажется, установлена, так как я могу вывести ее значение. Кроме того, я попытался использовать обертку, как в вашей опубликованной ссылке, без различия в поведении. –

 Смежные вопросы

  • Нет связанных вопросов^_^