| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3405 人关注过本帖
标题:JSF的ValueChangeListener出现空指针异常
只看楼主 加入收藏
marer
Rank: 2
等 级:新手上路
威 望:3
帖 子:928
专家分:0
注 册:2005-7-18
收藏
得分:0 
因为在Jsp页上时你的值并没有改变,所以新值和旧值是一样的,当你改变下拉框的值并提交窗体后,真正的服务器端才被启动,这样服务器才会“发现”某个组件的值发生了改变,这样当你在后台代码中用控制台输出时得到的新值与旧值就会不一样了。另外看看你的后台Bean是否在faces-config.xml中声明的是session范围的

[[it] 本帖最后由 marer 于 2008-1-31 10:36 编辑 [/it]]

public class 人生历程 extends Thread{public void run(){while(true){努力,努力,再努力!!;Thread.sleep(0);}}}
2008-01-31 10:35
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 
那么如何让页面能够显示出正常的旧值?

I'm here, as always...
2008-01-31 10:38
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 
是session

I'm here, as always...
2008-01-31 10:38
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 
当我改变下拉框后,新值变了,为何旧值也是新值?新值变了说明服务器端运行了啊,但是旧值为什么就不正常呢?

I'm here, as always...
2008-01-31 10:42
marer
Rank: 2
等 级:新手上路
威 望:3
帖 子:928
专家分:0
注 册:2005-7-18
收藏
得分:0 
实现在页面中显示新值与旧值:
1、index.jsp:
<body>
    <h:form>
        <h:selectOneMenu immediate="true" onchange="submit();" value="#{myBean.myValue}" valueChangeListener="#{myBean.valueChange}">
            <f:selectItems value="#{myBean.rage}"/>
        </h:selectOneMenu><br>
        New Value:<h:outputText value="#{myBean.myValue}"/><br>
        Old Value:<h:outputText value="#{myBean.myoldValue}"/>
    </h:form>
</body>
后台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")};
    private String myoldValue="";
    public String getMyoldValue()
    {
        return this.myoldValue;
    }
    public void setMyoldValue(String old)
    {
        this.myoldValue=old;
    }
    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)
    {
        setMyoldValue(e.getOldValue().toString());
        //System.out.println(e.getNewValue().toString());
        //System.out.println(e.getOldValue().toString());
    }
}

public class 人生历程 extends Thread{public void run(){while(true){努力,努力,再努力!!;Thread.sleep(0);}}}
2008-01-31 10:42
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 
厄...仍然无法正常显示旧值...还是和新值一样...控制台输出倒是正常...

I'm here, as always...
2008-01-31 10:46
marer
Rank: 2
等 级:新手上路
威 望:3
帖 子:928
专家分:0
注 册:2005-7-18
收藏
得分:0 
可我的真的没问题,你新建个工程,把我的代码贴进去试试,如果还有问题就是tomcat的问题了

public class 人生历程 extends Thread{public void run(){while(true){努力,努力,再努力!!;Thread.sleep(0);}}}
2008-01-31 10:49
marer
Rank: 2
等 级:新手上路
威 望:3
帖 子:928
专家分:0
注 册:2005-7-18
收藏
得分:0 
思路很简单:要想在页面上显示旧值,必须让outputText的value与后台的某个属性绑定,然后当值改变后将旧值赋给该属性,然后当页面刷新后outputText的值会显示该旧值,当然必须把后台Bean声明成session的

public class 人生历程 extends Thread{public void run(){while(true){努力,努力,再努力!!;Thread.sleep(0);}}}
2008-01-31 10:55
hwoarangzk
Rank: 4
来 自:冰封王座
等 级:贵宾
威 望:12
帖 子:1894
专家分:0
注 册:2007-7-17
收藏
得分:0 
十分感谢!问题已解决!原来在selectOneMenu中的value属性要设成新值而不是旧值,这样页面上的新值和旧值就都能正常显示了。同时,在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 = "";//要与selectOneMenu中的value对应,否则会出现空指针异常
    private String oldRace = "HUM";


    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();
    }
}
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://java. prefix="f" %>
<%@taglib uri="http://java. 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" value="#{vclt.selectedRace}" valueChangeListener="#{vclt.selectRace}" onchange="submit();">(value不能缺,同时要设置成新值才能正常显示旧值)
            <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>
再谢次!

I'm here, as always...
2008-01-31 11:06
marer
Rank: 2
等 级:新手上路
威 望:3
帖 子:928
专家分:0
注 册:2005-7-18
收藏
得分:0 
不客气,解决就好,共同学习吧,在看到你的问题前我对该问题也是一知半解,通过你的问题我也对该问题进行了相应的深入,我也要谢谢你

public class 人生历程 extends Thread{public void run(){while(true){努力,努力,再努力!!;Thread.sleep(0);}}}
2008-01-31 11:15
快速回复:JSF的ValueChangeListener出现空指针异常
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044565 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved