0

Я использую сервер JSF2 и Tomcat. Я запрограммировал простой пример, в котором:Значение <h: selectBooleanCheckbox> не обновляется в соответствии со значением being bean-компонента

  • пользователь выбирает факультет от «H: selectOneMenu»
  • После выбора, значение «ч: inputText» изменяется на «нечетное» или «даже» на основе facultyNo
  • Кроме того, при выборе, значение «ч: selectBooleanCheckBox» изменяется на «проверено», если facultyNo даже и «не проверено», если facultyNo нечетное

Все отлично для «ч работы: inputText ». С другой стороны, значение «h: selectBooleanCheckBox» не изменяется. Почему это происходит?

Кстати, использование логического значения внутри 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> 

Код для подкладочного боба ниже

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

Любая помощь очень ценится.

+0

сделал йо utry, чтобы обновить его из managedBean –

ответ

0

На самом деле ваша проблема не связана с JSF, это связано с EL. в вашем случае, Е.Л. относиться к вам карту ключи, как long не int, так что вы должны изменить свою карту:

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

и установить значение ключа следующим образом:

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

, чтобы заставить его быть авто-коробочный до длинного.

Примечание: проблема, описанная в детализированы в следующем вопросе: EL access a map value by Integer key

1

Чтобы отправлять обновления другому компоненту, вы можете использовать частичный рендеринг страниц, сделав вызовы Ajax для отправки параметров управляемому компоненту. В <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> 

Edit: Удалены вызов onSubmit() в selectOneMenu. ввел анонс ajax в selectBooleanCheckbox для частичного обновления страницы. См. Полное решение по адресу this.

+0

Я понимаю это Акаши. Однако мне нужен ответ на конкретный случай в моем вопросе. Спасибо, в любом случае. –

+0

Нет, нет. Дело в том, что когда я выбираю факультет из меню, флажок автоматически должен быть «проверен» или «не отмечен» на основе количества выбранных преподавателей –

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