2013-02-15 4 views
0

Я новичок в jsf. Я использую «valueChangeListener» в своем приложении для столовой. В backing bean у меня есть карта строк.valueChnageListner не работает в jsf

У меня есть выпадающее меню на странице jsp, и когда я выбираю значение из раскрывающегося списка, у него запускается listner. Я хочу показать соответствующее значение в текстовом поле. но это дает мне ошибку «set value == for null converter».

Когда я внедрил конвертер, ошибка изменилась и теперь отображается ошибка, что «свойство Bean не доступно для записи».

Я использую jsf 1.2. Я видел много сообщений об этом, но ничего не работало.

plz ребята помогают мне ..... Спасибо заранее.

// код JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> 
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> 


<f:view> 
    <h:form id="myform"> 
     <html> 
     <head> 
        <body> 
<h:outputText value="select chinese" /><h:selectOneMenu id="chinese" value="#{mychinese.chineseName}" onchange="submit()"> 
      <f:valueChangeListener type="backing_Bean.ChineseValueListner" />  
<f:selectItems value="#{mychinese.chineseName}" /> 
     </h:selectOneMenu> 

<br> 
<h:outputText value="Message from server" /><h:inputText value="#{mychinese.chinesemessage}" /> 
<h:message for="chinese"/> 
<body> 
<head> 
<html> 
</h:form> 
<f:view> 

// резервного кода боб выглядит следующим образом

package backing_Bean; 

import java.util.LinkedHashMap; 
import java.util.Map; 
public class MyChinese { 
     private static Map<String, String> chineseName; 
     private String chinesemessage="Select-Chinese"; 


    static { 
     chineseName = new LinkedHashMap<String, String>(); 
     chineseName.put("Select-Chinese", "Chinese"); 
     chineseName.put("Manchurian", "Manchurian"); 
     chineseName.put("Hakka", "Hakka"); 
     chineseName.put("Sezvan", "Sezvan"); 
     chineseName.put("Singapori", "Singapori"); 
     } 


    public String getChinesemessage() { 
     return chinesemessage.toString(); 
    } 
    public void setChinesemessage(String chinesemessage) { 
     this.chinesemessage = chinesemessage; 
    } 
    public Map<String, String> getChineseName() { 
     return chineseName; 
    } 
    public void setChineseName(Map<String, String> chineseName) { 
     MyChinese.chineseName = chineseName; 
    } 
} 

//Listener code 

package backing_Bean; 

import javax.faces.application.FacesMessage; 
import javax.faces.context.FacesContext; 
import javax.faces.event.AbortProcessingException; 
import javax.faces.event.ValueChangeEvent; 
import javax.faces.event.ValueChangeListener; 

public class ChineseValueListner implements ValueChangeListener{ 

public void processValueChange(ValueChangeEvent event) 
     throws AbortProcessingException { 
    MyChinese chinese = (MyChinese) FacesContext.getCurrentInstance() 
      .getExternalContext().getSessionMap().get("mychinese"); 
    chinese.setChinesemessage(event.getNewValue().toString()); 
    FacesMessage fm = new FacesMessage(); 
    fm.setDetail(chinese.getChinesemessage()); 
    } 
} 
+0

Если предложенное решение работает для вас, не забудьте [пометить его как ответ] (http://meta.stackexchange.com/a/5235/182862) –

ответ

1

Проблема это, что вы используете Map<String, String> удерживать выбранное значение вашей <h:selectOneMenu>:

<h:selectOneMenu id="chinese" value="#{mychinese.chineseName}" onchange="submit()"> 
    ... 
</h:selectOneMenu> 

Для этого необходимо привязать value атрибут атрибута String в управляемом компоненте.

модификация MyChinese класс:

public class MyChinese { 
    private static Map<String, String> chineseName; 
    private String chinesemessage="Select-Chinese"; 
    private String selectedChineseName; 

    //the getter/setter functions for the new selectedChineseName attribute 
    //the rest of your code 
} 

JSP модификация:

<h:selectOneMenu id="chinese" value="#{mychinese.selectedChineseName}" 
    onchange="submit()"> 
    ... 
</h:selectOneMenu> 

Обратите внимание, что при наличии этого, возможно, вам будет не нужна valueChangeListener.


Обратите внимание, что у вас есть проблемы в вашем HTML:

  • <head> элемент не должен обернуть <body> элемент, первый вы пишете <head>, закройте его, а затем он приходит <body> и это, ммм , корпус.
  • <h:form> будет генерировать простой HTML <form>, так он должен быть внутри тега <body>, а не снаружи.
  • <h:form> должен содержать только элементы, которые будут отправлены в запросе, не более элементов, чтобы вызвать путаницу со значениями в управляемом компоненте при повторении.

Закрепление этот код:

<f:view> 
    <html> 
     <head> 
     </head> 
     <body> 
      <h:form id="myform"> 
       <h:outputText value="select chinese" /> 
       <h:selectOneMenu id="chinese" value="#{mychinese.selectedChineseName}" onchange="submit()"> 
        <f:valueChangeListener type="backing_Bean.ChineseValueListner" />  
        <f:selectItems value="#{mychinese.chineseName}" /> 
       </h:selectOneMenu> 
      </h:form> 
      <br> 
      <h:outputText value="Message from server" /> 
      <h:inputText value="#{mychinese.chinesemessage}" /> 
      <h:message for="chinese"/> 
     </body> 
    </html> 
<f:view> 
+0

Спасибо за помощь ...... – rishi

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