2017-06-02 2 views
0

ビューがBeanからすべての値を取得できる間に、チェックボックス(h:selectBooleanCheckbox)がトグルされると、Beanは更新されません。 のsetSelected()メソッドはビューから呼び出されません。JSFチェックボックスの値がBeanに送信されない

私は、選択されたプロパティの値の代わりにマップを使用し、私自身のajax javascript関数を書く愚かな試みを使用して、beanのスコープをapplicationに変更しようとしました。

私が扱っているアプリケーションはちょっと残念ですので、Tomcat 6、JSF 1.2、Richfaces 3.3.3を使用しています。

私は何かが分かりにくいと思うが、私は2日間これをしていて、なぜBeanが更新されないのか分からない。

私の見解は次のとおりです。

<!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/jstl/core" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich"> 
<head> 
<title>JSF</title> 
</head> 
    <body> 
     <h:form id="tableForm"> 
      <rich:dataTable id="table" value="#{managedBean}" var="item" width="100%"> 
       <rich:column label="Select" align="center" width="40px" > 
        <f:facet name="header"> 
         <h:outputText value="Select" /> 
        </f:facet> 
        <h:selectBooleanCheckbox value="#{item.selected}" > 
         <a4j:support execute="@this" event="onclick" ajaxSingle="true"/> 
        </h:selectBooleanCheckbox> 
       </rich:column> 
       <rich:column label="Name" align="center" width="40px"> 
        <f:facet name="header"> 
         <h:outputText value="Name" /> 
        </f:facet> 
        <h:outputText value="#{item.name}" /> 
       </rich:column> 
      </rich:dataTable> 
     </h:form> 
    </body> 
</html> 

私はセッションスコープに管理Bean ItemBeanを持っている:

import org.richfaces.model.ExtendedTableDataModel; 
public class ItemBean extends ExtendedTableDataModel<Item>{ 
    public ItemBean() {super(new ItemProvider());} 
} 

ItemProviderインは次のとおりです。

import org.richfaces.model.DataProvider; 

public class ItemProvider implements DataProvider<Item>{ 

    private List<Item> items = new ArrayList<Item>(); 

    public ItemProvider(){ 
     for(int i = 0; i < 10; i++){ 
      items.add(new Item(i, "Item "+i)); 
     } 
    } 

    public Item getItemByKey(Object key) {return items.get((Integer)key);} 

    public List<Item> getItemsByRange(int fromIndex, int toIndex) { 
     return new ArrayList<Item>(items.subList(fromIndex, toIndex)); 
    } 

    public Object getKey(Item arg0) {return arg0.getId();} 

    public int getRowCount() {return items.size();} 
} 

と項目は以下のとおりです。

public class Item { 
    private final int id; 
    private final String name; 
    private boolean selected; 

    public Item(int id, String name) { 
     this.id = id; 
     this.name = name; 
     selected = false; 
    } 

    public int getId(){ 
     return id; 
    } 

    public String getName(){ 
     return name; 
    } 

    public boolean isSelected(){ 
     return selected; 
    } 

    public void setSelected(boolean selected){ 
     this.selected = selected; 
    } 
} 

答えて

0

問題は、web.xmlを正しく設定していないことでした。 、残念ながら問題は、私は、web.xmlの設定を逃したのだということでしたあなたの応答のための

<filter> 
    <display-name>RichFaces Filter</display-name> 
    <filter-name>richfaces</filter-name> 
    <filter-class>org.ajax4jsf.Filter</filter-class> 
    </filter> 
    <filter-mapping> 
    <filter-name>richfaces</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
    </filter-mapping> 
1

あなたのバニラhtmlheadおよびbodyタグがこれを引き起こす可能性があります。

Ajax-stuff(javascript)は、(必要なスクリプトの参照とともに)ページの<head>セクションに入ることがあります。 JSFはコンポーネントを使用しているため、コンポーネントがアンダーレイオブジェクトモデルに追加される時点で、特定のコンポーネントに必要なjavascriptを挿入する必要があります。

したがって、JSF自体でhtml,headおよびbodyというタグを管理する必要があります。

したがって、vanilla-htmlとして作成する代わりに、適切な<h:html>,<h:body><h:head>というタグを使用して、このタスクをJSFに引き渡します。この方法では、onclick-eventハンドラに必要なjavascriptコードを生成し、チェックボックスが期待どおりに動作するはずです。

+0

ありがとう:

私はルートRichFacesのに要求を次のように欠けていました。 JSFで作業する場合、答えにタグを使用するのがベストプラクティスですか?それはそうであるようです。 – Sam

関連する問題