2012-01-18 3 views
0

Я использую JSF2.0 и создаю мастер. Я столкнулся с проблемой с SelectBooleanCheckboxes. Вот рабочий процесс:Выбранное состояние SelectBooleanCheckbox не соответствует бэк-файлу

  • Загрузить страницу с помощью флажков (значения привязаны к SortedMap в бэкэнде).
  • Отметьте их и нажмите кнопку «Далее». Это увеличивает курсор, который использует страница, для определения нагрузки PanelGroup.
  • Значения (правильные) сохраняются в компоненте.
  • Щелкните обратно (курсор уменьшен), а страница отображает редактируемые флажки. Первый флажок не отмечен (хотя связанная переменная содержит значение true для этого поля).

Этот подход на основе курсора (который содержит все экраны мастера), похоже, не работает. Однако, если я немного изменю это, чтобы кнопки prev/next отображали разные страницы xhtml, этот вопрос исчезает.

К сожалению, я не могу этого сделать. Мы собираемся подключить этот мастер к модальному диалоговому окну, поэтому посещение новой страницы в предыдущем/следующем не будет работать

Я написал небольшой пример этого (вместо того, чтобы просить вас пробраться через весь мастер) ,

Вот класс Java:

@ConversationScoped 
@Named("hashBool") 
public class HashBoolTest2 implements Serializable { 

    private static final long serialVersionUID = 1962031429874426411L; 

    @Inject private Conversation conversation; 

    private List<RestrictionItem> list; 
    private SortedMap<String, Boolean> values; 

    private int cursor; 

    public HashBoolTest2() { 
     List<String> none = new ArrayList<String>(); 
     none.add(""); 

     this.setList(new ArrayList<RestrictionItem>()); 
     this.getList().add(new RestrictionItem("a", "a", none)); 
     ... 
     this.getList().add(new RestrictionItem("e", "e", none)); 

     this.setValues(new TreeMap< String, Boolean >()); 

     this.setCursor(0); 
    } 

    @PostConstruct 
    public void andThis() { 
     this.conversation.begin(); 
    } 

    // getters and setters for instance variables 

    @Override 
    public String toString() { 
     return "Values : " + this.values.toString() + " List: " + this.list.toString(); 
    } 

    public void kill() { 
     this.conversation.end(); 
    } 

    public void doNext(ActionEvent e) { 
     this.cursor++; 
    } 

    public void doPrev(ActionEvent e) { 
     this.cursor--; 
    } 
} 

Вот фрагмент XHTML:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:c="http://java.sun.com/jsp/jstl/core"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 
<title>IGNORED</title> 
</head> 
<body> 
    <ui:composition> 
    <h:panelGroup id="container"> 
     <h:form> 
     <!-- edit state --> 
     <h:panelGroup id="edit" rendered="#{hashBool.cursor eq 0}"> 
      <code> 
       <h:outputText value="#{hashBool.toString()}" escape="false"/> 
      </code> 

      <ul> 
       <ui:repeat value="#{hashBool.list}" var="elem"> 
       <li> 
        <h:selectBooleanCheckbox id="elem" value="#{hashBool.values[elem.id]}" title="#{elem.displayName}" /> 
        <h:outputLabel for="elem" value="#{elem.displayName}"/> 
       </li> 
       </ui:repeat> 
      </ul> 
     </h:panelGroup> 

     <!-- view state --> 
     <h:panelGroup id="view" rendered="#{hashBool.cursor eq 1}"> 
      <code> 
      <h:outputText value="#{hashBool.toString()}" escape="false"/> 
      </code> 
     </h:panelGroup> 

     <br/> 

     <!-- buttons --> 
     <h:panelGroup id="buttons"> 
      <f:ajax render=":container"> 
      <h:commandButton value="Prev" actionListener="#{hashBool.doPrev}"/> 
      <h:commandButton value="Next" actionListener="#{hashBool.doNext}"/> 
      </f:ajax> 
      <h:commandButton value="Kill" actionListener="#{hashBool.kill()}"/> 
     </h:panelGroup> 

     </h:form> 
    </h:panelGroup> 
    </ui:composition> 
</body> 
</html> 

Любые предложения приветствуются! (И жаль, если это двойной пост, я havnt смог вскрыть что-нибудь подобное при поиске здесь)

ответ

0

Главным образом, чтобы Мудрость Древних оставалась должным образом задокументирована (http://xkcd.com/979/) : Оказывается, это ошибка в JSF 2.0.2 (которая поставляется вместе с Liferay 6.0 GA 4). См. Здесь для получения дополнительной информации: http://java.net/jira/browse/JAVASERVERFACES-1561

+0

Если вам нужно использовать Liferay/Glassfish, используйте комплект 6.1 GA 1. – asellitt

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