0

私はjsfが初めてです。食堂アプリケーションに「valueChangeListener」を実装しています。バッキング Bean には、文字列のマップがあります。

jsp ページにドロップダウンがあり、ドロップダウンから値を選択すると、listner が起動します。テキストボックスに対応する値を表示したい。しかし、「ヌルコンバーターの値==を設定する」というエラーが表示されます。

コンバーターを実装すると、エラーが変化し、「Bean プロパティは書き込み可能ではありません」というエラーが表示されるようになりました。

私はjsf 1.2を使用しています。これに関する多くの投稿を見てきましたが、何も機能しませんでした。

みんな助けてください.....よろしくお願いします。

//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>

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

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());
    }
}
4

1 に答える 1

1

問題は、:の選択された値を保持するためにを使用していることですMap<String, String><h:selectOneMenu>

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

これを解決するには、valueタグ属性をStringマネージドBeanの属性にバインドする必要があります。

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>、リクエストで送信される要素のみを含む必要があります。これ以上の要素は含まないでください。これは、繰り返されるときに管理対象Beanの値と混同するためです。

このコードの修正:

<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>
于 2013-02-15T07:06:47.437 に答える