私は JSF2.0 を使用しており、ウィザードを構築しています。SelectBooleanCheckboxes で問題が発生しました。ワークフローは次のとおりです。
- チェックボックスを含むページをロードします (値はバッキング Bean の SortedMap にバインドされます)。
- それらにチェックを入れて、[次へ] をクリックします。これにより、どの PanelGroup をロードするかを決定するためにページが使用するカーソルがインクリメントされます。
- (正しい) 値が Bean に保持されます。
- クリックバック (カーソルがデクリメント) すると、編集可能なチェックボックスがページに表示されます。最初のチェックボックスはチェックされていません (バインドされた変数がそのボックスに対して true の値を保持している場合でも)。
このカーソルベースのアプローチ (すべてのウィザード画面を含む) は機能していないようです。ただし、これを少し変更して、前/次のボタンが別の 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>
どんな提案も大歓迎です!(これが二重の投稿である場合は申し訳ありません。ここで検索している間、同様のものを発見できませんでした)