JSF的ValueChangeListener出现空指针异常
编了一个很简单的jsf例子,就是选择一个下拉框中的选项,然后当前页面同时显示出新值和旧值。新值没问题,但是把旧值那一行代码打上去就出现空指针异常,请问是怎么回事?ValueChangeListenerTest.java:
package src;
import javax.faces.model.*;
import javax.faces.event.*;
public class ValueChangeListenerTest {
private SelectItem[] races = {new SelectItem("HUM"), new SelectItem("ORC"), new SelectItem("UD"), new SelectItem("NE")};
private String selectedRace;
private String oldRace;
public String getOldRace() {
return oldRace;
}
public void setOldRace(String oldRace) {
this.oldRace = oldRace;
}
public SelectItem[] getRaces() {
return races;
}
public void setRaces(SelectItem[] races) {
this.races = races;
}
public String getSelectedRace() {
return selectedRace;
}
public void setSelectedRace(String selectedRace) {
this.selectedRace = selectedRace;
}
public void selectRace(ValueChangeEvent e) {
selectedRace = e.getNewValue().toString();
oldRace = e.getOldValue().toString();
}
}
页面显示文件:valueChangeListener.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Value Change Listener Test</title>
</head>
<body>
<f:view>
<h:form>
Select a race:
<h:selectOneMenu immediate="true" valueChangeListener="#{vclt.selectRace}" onchange="submit();">
<f:selectItems value="#{vclt.races}"/>
</h:selectOneMenu><br/>
This is the race you selected:
<h:outputText value="#{vclt.selectedRace}"></h:outputText><br/>
This is your last race:
<h:outputText value="#{vclt.oldRace}"></h:outputText>
</h:form>
</f:view>
</body>
</html>
红色那行提示空指针。我试过在ValueChangeListenerTest.java中设置一个初始值,不行;在faces-config.xml也设置过初始值,还是不行,应该怎么解决?
搜索更多相关主题的帖子:
空指针 JSF SelectItem new
----------------解决方案--------------------------------------------------------
顶起来,getOldValue()什么情况下可以用啊?
----------------解决方案--------------------------------------------------------
在你的<h:selectOneMenu>中加上value属性,并在后台Bean中加入相应的属性就可以了,例:
<h:form>
<h:selectOneMenu immediate="true" onchange="submit();" value="#{myBean.myValue}" valueChangeListener="#{myBean.valueChange}">
<f:selectItem itemLabel="a" itemValue="a"/>
<f:selectItem itemLabel="b" itemValue="b"/>
<f:selectItem itemLabel="c" itemValue="c"/>
</h:selectOneMenu>
</h:form>
后台:
public class MyBean
{
private String myValue="";
public String getMyValue()
{
return this.myValue;
}
public void setMyValue(String value)
{
this.myValue=value;
}
public void valueChange(ValueChangeEvent e)
{
System.out.println(e.getNewValue().toString());
System.out.println(e.getOldValue().toString());
}
}
----------------解决方案--------------------------------------------------------
<h:selectOneMenu immediate="true" value="#{vclt.oldRace}" valueChangeListener="#{vclt.selectRace}" onchange="submit();">
我加了红色的部分,其他代码没有改动,而且原来的java文件里面也有这个oldRace,但是还是同样的异常啊...
----------------解决方案--------------------------------------------------------
不会吧,我的代码没有任何问题,下面是我的代码:
1、index.jsp:
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<f:view>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title><h:outputText value="JSF ValueChangeListenerDemo"/></title>
</head>
<body>
<h:form>
<h:selectOneMenu immediate="true" onchange="submit();" value="#{myBean.myValue}" valueChangeListener="#{myBean.valueChange}">
<f:selectItems value="#{myBean.rage}"/>
</h:selectOneMenu>
</h:form>
</body>
</html>
</f:view>
2、后台MyBean.java:
package com.liz;
import javax.faces.event.*;
import javax.faces.model.*;
public class MyBean
{
private String myValue="";
private SelectItem[] rage=new SelectItem[]{new SelectItem("a"),new SelectItem("b"),new SelectItem("c")};
public SelectItem[] getRage()
{
return this.rage;
}
public void setRage(SelectItem[] item)
{
this.rage=item;
}
public String getMyValue()
{
return this.myValue;
}
public void setMyValue(String value)
{
this.myValue=value;
}
public void valueChange(ValueChangeEvent e)
{
System.out.println(e.getNewValue().toString());
System.out.println(e.getOldValue().toString());
}
}
把代码粘贴一下试试看看有没有问题,如果有问题的话,看看你的服务器是什么版本的?我用的是Tomcat6.0.10
----------------解决方案--------------------------------------------------------
你的没问题,我的Tomcat是5.0的,会是这个问题?
----------------解决方案--------------------------------------------------------
public void selectRace(ValueChangeEvent e) {
//selectedRace = e.getNewValue().toString();
//oldRace = e.getOldValue().toString();
System.out.println(e.getNewValue());
System.out.println(e.getOldValue());
}
我把我的改成这样了,就用System.out来输出,第一次输出的旧值的确是null,但是以后的就没问题了。能否设置刚开始的旧值?我试过两个方法都不行
----------------解决方案--------------------------------------------------------
我简单看了一下版主的代码,发现当你读e.getNewValue()和e.getOldValue()时是把值赋给类中的属性字段,我想你提供的这个属性字段:selectedRage,JSF在运行中会自动调用并把值赋给它,当你在代码中又手动给它赋了一次值时应该就不会再读出旧值了,你可以试试改用控制台输出一下试试,如果没问题了,在类中用别的字段接收应该没有问题了
[[it] 本帖最后由 marer 于 2008-1-31 10:32 编辑 [/it]]
----------------解决方案--------------------------------------------------------
例如:
<h:selectOneMenu value="#{vclt.selectedRage}".....>
...
</h:selectOneMenu>
代码:
private String selectedRage;
....
private String newValue;
...
public void selectRage(ValueChangeEvent e)
{
newValue=e.getNewValue();
oldValue=e.getOldValue();
}
----------------解决方案--------------------------------------------------------
问题发现了,就是你说的selectOneMenu中的value属性,我添加好这个属性就没有异常,去掉这个属性又出现空指针异常了。但是现在的问题是在我的jsp页面上,旧值总是与新值相同,但是控制台的输出却是正常的...
public void selectRace(ValueChangeEvent e) {
selectedRace = e.getNewValue().toString();
oldRace = e.getOldValue().toString();
System.out.println(e.getNewValue());
System.out.println(e.getOldValue());
System.out.println();
}
下面是jsp页面的部分:
This is the race you selected:
<h:outputText value="#{vclt.selectedRace}"></h:outputText><br/>
This is your last race:
<h:outputText value="#{vclt.oldRace}"></h:outputText>
明显selectedRace和oldRace是不一样的,但是输出总是和新值一样...
----------------解决方案--------------------------------------------------------