1

JSF2 と Tomcat サーバーを使用しています。次のような簡単な例をプログラムしました。

  • ユーザーが「h:selectOneMenu」から学部を選択
  • 選択すると、"h:inputText" の値は、facilityNo に基づいて "odd" または "even" に変更されます。
  • また、選択時に「h:selectBooleanCheckBox」の値は、facilityNo が偶数の場合は「checked」に、facilityNo が奇数の場合は「notchecked」に変更されます。

「h:inputText」ではすべて正常に動作します。一方、「h:selectBooleanCheckBox」の値は変化しません。なぜこうなった?

ちなみに、私が取り組んでいるプロジェクトには HashMap にブール値がたくさんあるので、 HashMap 内でのブール値の使用は意図的なものです。したがって、ハッシュマップを単純なブール値のプロパティに置き換えて、ゲッターとセッターを使用することは、私の場合の解決策ではありません。

xhtml ページのコードは次のとおりです。

<!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">
     <head>       
        <title>Dummy Title</title>        
     </head>    
     <body>
        <h:form>
            <label for="faculty">Faculty</label>
            <h:selectOneMenu id="faculty" value="#{test.selectedFaculty}" converter="faccon" valueChangeListener="#{test.facultyChange}" onchange="submit()">
                <f:selectItems value="#{start.app.faculties}"/>                      
            </h:selectOneMenu>                                  
            <h:selectBooleanCheckbox id="mycheck" value="#{test.x.get(0)}"></h:selectBooleanCheckbox>
            <h:outputText value="#{test.res}"></h:outputText>
            <h:commandButton value="Save" action="#{test.saveChoices}" />
        </h:form>           
    </body>
</html>

バッキング Bean のコードは次のとおりです。

import java.io.Serializable;
import java.util.HashMap;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ValueChangeEvent;
import com.myWork.Application;
import com.myWork.Faculty;

@ManagedBean(name="test")
@RequestScoped
public class TestBean implements Serializable
{
    private HashMap<Integer,Boolean> x;
    private String res;
    private Faculty selectedFaculty;

    @PostConstruct
    public void init(){
        Application app = Application.getInstance();
        selectedFaculty = app.getFaculties()[0];
        x = new HashMap<Integer, Boolean>();
        if (selectedFaculty.getFacultyNo()%2==0)
        {
            x.put(0, true);
            res = "even";
        }
        else
        {
            x.put(0, false);
            res = "odd";
        }
    }

    public HashMap<Integer,Boolean> getX() {
        return x;
    }


    public void setX(HashMap<Integer,Boolean> x) {
        this.x = x;
    }

    public Faculty getSelectedFaculty() {
        return selectedFaculty;
    }

    public void setSelectedFaculty(Faculty selectedFaculty) {
        this.selectedFaculty = selectedFaculty;
    }   

    public String getRes() {
        return res;
    }

    public void setRes(String res) {
        this.res = res;
    }

    public void facultyChange(ValueChangeEvent e){
        Faculty fac = (Faculty) e.getNewValue();
        if (fac.getFacultyNo()%2==0)
        {           
            x.put(0, true);
            res = "even";
        }
        else
        {
            x.put(0, false);
            res = "odd";
        }
    }   

    public String saveChoices(){        
        return "test";
    }
}

どんな助けでも大歓迎です。

4

2 に答える 2

2

実際、あなたの問題は JSF とは関係がなく、EL と関係があります。あなたの場合、EL はマップ キーをlongnotとして扱うintので、マップを次のように変更する必要があります。

HashMap<Long, Boolean> map = new HashMap<>();

キー値を次のように設定します。

    map.put(0L, false);
    map.put(1L, true);

自動ボックス化を強制的にロングにします。

注: この問題については、次の質問で詳しく説明します: EL 整数キーによるマップ値へのアクセス

于 2016-09-11T10:26:51.707 に答える