<h:selectbooleancheckbox>的值不会根据辅助bean值更新

时间:2016-09-10 07:05:56

标签: jsf selectonemenu valuechangelistener selectbooleancheckbox

我正在使用JSF2和Tomcat服务器。我编写了一个简单的例子,其中:

  • 用户从&#34; h选择教师:selectOneMenu&#34;
  • 选择后,&#34; h:inputText&#34;改为&#34;奇怪&#34;或者&#34;甚至&#34;基于facultyNo
  • 此外,在选择时,&#34; h的值:selectBooleanCheckBox&#34;更改为&#34;已检查&#34;如果教师没有,并且没有检查&#34;如果facultyNo是奇数

对于&#34; h:inputText&#34;,一切正常。另一方面,&#34; h的值:selectBooleanCheckBox&#34;不会改变。为什么会这样?

顺便说一下,在HashMap中使用布尔值是 故意 ,因为我正在处理的项目在HashMap中有很多布尔值。因此,用一个简单的布尔属性替换Hashmap并使用getter和setter对我来说绝对不是一个解决方案。

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";
    }
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

为了将更新发送到其他组件,您可以通过进行Ajax调用将参数发送到Managed bean来利用部分页面呈现。 在<h:selectBooleanCheckBox>

 <h:selectOneMenu id="faculty" value="#{test.selectedFaculty}" converter="faccon" valueChangeListener="#{test.facultyChange}">
                <f:selectItems value="#{start.app.faculties}"/>                      
   </h:selectOneMenu>   

  <h:selectBooleanCheckbox id="mycheck" valueChangeListener="#{test.facultyChange}" value="#{test.x.get(0)}">
           <f:ajax event="change" execute="@form" render="faculty"/>
    </h:selectBooleanCheckbox>

修改:已删除onSubmit()selectOneMenu的来电。在selectBooleanCheckbox中引入了一个用于部分页面刷新的ajax调用。 请参阅this发布的完整解决方案。

答案 1 :(得分:0)

实际上你的问题与JSF无关,它与EL有关。在您的情况下,EL会将您的地图密钥视为int而不是HashMap<Long, Boolean> map = new HashMap<>(); ,因此您应将地图更改为:

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

并设置键值如下:

{{1}}

强制将其自动装箱为长。

注意:以下问题中详述的问题: EL access a map value by Integer key