dwr框架实现三级联动问题

djl520 2008-10-14 05:01:51
在网上搜了许多例子看,都没有得到解决,我的错误Log如下:

HCClass01ID:==========BC
2008-10-14 16:05:45 org.directwebremoting.util.CommonsLoggingOutput info
信息: Exec: channel.getHCClass02sByHCClass01Id()
2008-10-14 16:05:45 org.directwebremoting.util.CommonsLoggingOutput warn
警告: Method execution failed:
java.lang.NullPointerException
at com.healthcare.controller.Channel.getHCClass02sByHCClass01Id(Channel.java:72)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
2008-10-14 16:05:45 org.directwebremoting.util.CommonsLoggingOutput warn
警告: --Erroring: batchId[5] message[java.lang.NullPointerException]
...全文
908 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobinghuangting 2011-05-31
  • 打赏
  • 举报
回复
我也遇到痛样的问题了!
luocb1980 2009-12-22
  • 打赏
  • 举报
回复
我也遇到同样的问题了
djl520 2008-10-16
  • 打赏
  • 举报
回复
就是spring与dwr的配置问题,这是解决方法
http://lam.javaeye.com/blog/253380
多谢各位的关注与回复
Jarvis-Li 2008-10-16
  • 打赏
  • 举报
回复
你还没解决啊!晕不行就想个别的方法吧
tondayong1981 2008-10-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 djl520 的回复:]
引用 14 楼 tondayong1981 的回复:
那你打印下这个对象hCClass02Dao 看是不是null,或者没有正确的注入


刚测试过,hCClass02Dao确实是null,怎么才可以使用hCClass02Dao呢?
[/Quote]

很简单,那就是你spring主入的配置不对.

对于spring bean和dwr配置,请查阅官方相关的文档,最重要的是配置一个dwrController拦截dwr请求
我以前做的是spring mvc ,请参考这篇文章http://www.oreillynet.com/onjava/blog/2005/12/spring_and_dwr_revisited.html
djl520 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tondayong1981 的回复:]
很简单,你可以写testcode,很容易看出来,我对你的数据库不清楚,很可能有脏数据
for (int i = 0; i < hCClass02s.size(); i++)
这样写很容易nullpointer的
[/Quote]

它是在这一句中出错了
hCClass02s = hCClass02Dao.getHCClass02ByHCClass01Id(id);
我在其他地方有用过hCClass02Dao.getHCClass02ByHCClass01Id(id)这个方法是OK的.
djl520 2008-10-15
  • 打赏
  • 举报
回复
其实问题出在访问数据库的时候,因为我试过这个方法是OK

public Map getALLs() {
Map map = new HashMap();
map.put("1", "AA");
map.put("2", "BB");
map.put("3", "CC");
return map;
}

是不是Channel.java中不能使用Dao呢,或者是怎样配置才能访问Dao呢?求解?
djl520 2008-10-15
  • 打赏
  • 举报
回复
解决,稍后放上解决方法
yeah920 2008-10-15
  • 打赏
  • 举报
回复
帮顶起来。顺便学习。
tondayong1981 2008-10-15
  • 打赏
  • 举报
回复
dwr有个debug的功能,它自动产生js文件,都打开看看
tondayong1981 2008-10-15
  • 打赏
  • 举报
回复
那你看看id传入的事不是正确,然后往底层debug一下,看看有什么问题,我相信这种还是很容易解决的,一般都是程序编写的问题
djl520 2008-10-15
  • 打赏
  • 举报
回复
或者有哪位知道,怎么配置dwr与spring,比如:web.xml,dwr.xml等
感谢!
djl520 2008-10-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tondayong1981 的回复:]
那你打印下这个对象hCClass02Dao 看是不是null,或者没有正确的注入
[/Quote]

刚测试过,hCClass02Dao确实是null,怎么才可以使用hCClass02Dao呢?
tondayong1981 2008-10-15
  • 打赏
  • 举报
回复
那你打印下这个对象hCClass02Dao 看是不是null,或者没有正确的注入
mjjzg 2008-10-14
  • 打赏
  • 举报
回复
太长了,只能飘过了
顺手帮你顶下
tondayong1981 2008-10-14
  • 打赏
  • 举报
回复
很简单,你可以写testcode,很容易看出来,我对你的数据库不清楚,很可能有脏数据
for (int i = 0; i < hCClass02s.size(); i++)
这样写很容易nullpointer的
djl520 2008-10-14
  • 打赏
  • 举报
回复
其实dwr使用以下的方法是OK的

public String sayHello(String name) {
return "Hello, " + name;
}


就是
channel.getHCClass02sByHCClass01Id(class01_Value,class02Return);

调用的时候出错,而Channel.java的这个方法是执行到
hCClass02s = hCClass02Dao.getHCClass02ByHCClass01Id(id); 这句就出错,所以是否是访问数据库的问题呢?

/**
* 根据一階编号获取二階
* @param id
* 一階编号
* @return List <HCClass02> <br>
*/
public Map getHCClass02sByHCClass01Id(String id) {
List <HCClass02> hCClass02s = null;
Map map = new HashMap();
System.out.println("HCClass01ID:=========="+ id);
if (!StringUtils.isEmpty(id)) {
hCClass02s = hCClass02Dao.getHCClass02ByHCClass01Id(id);
}
for (int i = 0; i < hCClass02s.size(); i++)
{
HCClass02 class02 = (HCClass02)hCClass02s.get(i);
map.put(class02.getId(), class02.getName());
}
return map;
}

tondayong1981 2008-10-14
  • 打赏
  • 举报
回复
建议把dwr的原码倒入,debug一下,就可以看出来了

我原来也做过,不过是spring dwr的
你可以测试你这段代码有没有问题
public Map getHCClass03sByHCClass02Id(String id) {
List <HCClass03> hCClass03s = null;
Map map = new HashMap();
System.out.println("HCClass02ID:=========="+ id);
if (!StringUtils.isEmpty(id)) {
hCClass03s = hCClass03Dao.getHCClass03ByHCClass02Id(id);
}
for (int i = 0; i < hCClass03s.size(); i++)
{
HCClass03 class03 = (HCClass03)hCClass03s.get(i);
map.put(class03.getId(), class03.getName());
}
return map;
}
我看了一下hCClass03s对象如果id为null,那么 hCClass03s.size()就会nullpointerexception
Jarvis-Li 2008-10-14
  • 打赏
  • 举报
回复
我给你一个三级联动的例子 ,参考参考

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>多级联动菜单</title>

<script type="text/javascript">
var xmlHttp; //用于保存XMLHttpRequest对象的全局变量
var targetSelId; //用于保存要更新选项的列表id
var selArray; //用于保存级联菜单id的数组

//用于创建XMLHttpRequest对象
function createXmlHttp() {
//根据window.XMLHttpRequest对象是否存在使用不同的创建方式
if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest(); //FireFox、Opera等浏览器支持的创建方式
} else {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");//IE浏览器支持的创建方式
}
}

//获取列表选项的调用函数
function buildSelect(selectedId, targetId) {
if (selectedId == "") { //selectedId为空串表示选中了默认项
clearSubSel(targetId); //清除目标列表及下级列表中的选项
return; //直接结束函数调用,不必向服务器请求信息
}
targetSelId = targetId; //将传入的目标列表id赋值给targetSelId变量
createXmlHttp(); //创建XmlHttpRequest对象
xmlHttp.onreadystatechange = buildSelectCallBack; //设置回调函数
xmlHttp.open("GET", "select_menu.jsp?selectedId=" + selectedId, true);
xmlHttp.send(null);
}

//获取列表选项的回调函数
function buildSelectCallBack() {
if (xmlHttp.readyState == 4) {
var optionsInfo = eval("("+xmlHttp.responseText+")"); //将从服务器获得的文本转为对象直接量
var targetSelNode = document.getElementById(targetSelId);
clearSubSel(targetSelId); //清除目标列表中的选项
//遍历对象直接量中的成员
for (var o in optionsInfo) {
targetSelNode.appendChild(createOption(o, optionsInfo[o])); //在目标列表追加新的选项
}
}
}

//根据传入的value和text创建选项
function createOption(value, text) {
var opt = document.createElement("option"); //创建一个option节点
opt.setAttribute("value", value); //设置value
opt.appendChild(document.createTextNode(text)); //给节点加入文本信息
return opt;
}

//清除传入的列表节点内所有选项
function clearOptions(selNode) {
selNode.length = 1; //设置列表长度为1,仅保留默认选项
selNode.options[0].selected = true; //选中默认选项
}

//初始化列表数组(按等级)
function initSelArray() {
selArray = arguments; //arguments对象包含了传入的所有参数
}

//清除下级子列表选项
function clearSubSel(targetId) {
var canClear = false; //设置清除开关,初始值为假
for (var i=0; i<selArray.length; i++) { //遍历列表数组
if (selArray[i]==targetId) { //当遍历至目标列表时,打开清除开关
canClear = true;
}
if (canClear) { //从目标列表开始到最下级列表结束,开关始终保持打开
clearOptions(document.getElementById(selArray[i])); //清除该级列表选项
}
}
}
</script>
</head>

<!-- 页面加载完毕做两件事:1.初始化列表数组 2.为第一个列表赋值 -->
<body onload="initSelArray('selA','selB','selC');buildSelect('INIT', 'selA')">
<h1>多级联动菜单</h1>
<table>
<tr>
<td>列表A</td>
<td>
<select name="selA" id="selA" onchange="buildSelect(this.value, 'selB')">
<option value="" selected>------请选择------</option>
</select>
</td>
</tr>
<tr>
<td>列表B</td>
<td>
<select name="selB" id="selB" onchange="buildSelect(this.value, 'selC')">
<option value="" selected>------请选择------</option>
</select>
</td>
</tr>
<tr>
<td>列表C</td>
<td>
<select name="selC" id="selC">
<option value="" selected>------请选择------</option>
</select>
</td>
</tr>
</table>
</body>
</html>





<%@ page contentType="text/plain; charset=UTF-8"%>
<%@ page language="java"%>
<%@ page import="java.sql.*,ajax.db.DBUtils"%>
<%!
//访问数据库取得下级选项信息
String getOptions(String selectedId) {
int counter = 0; //计数器
StringBuffer opts = new StringBuffer("{"); //保存选项信息
String sql = "select * from select_menu where pid = ? order by seq asc";//定义查询数据库的SQL语句
Connection conn = null; //声明Connection对象
PreparedStatement pstmt = null; //声明PreparedStatement对象
ResultSet rs = null; //声明ResultSet对象
try {
conn = DBUtils.getConnection(); //获取数据库连接
pstmt = conn.prepareStatement(sql); //根据sql创建PreparedStatement
pstmt.setString(1, selectedId); //设置参数
rs = pstmt.executeQuery(); //执行查询,返回结果集
while (rs.next()) { //遍历结果集
//如果不是第一项,追加一个“,”用于分隔选项
if (counter > 0) {
opts.append(",");
}
opts.append("'");
opts.append(rs.getString("id"));
opts.append("':'");
opts.append(rs.getString("text"));
opts.append("'");
counter++; //计数器加1
}
} catch (SQLException e) {
System.out.println(e.toString());
} finally {
DBUtils.close(rs); //关闭结果集
DBUtils.close(pstmt); //关闭PreparedStatement
DBUtils.close(conn); //关闭连接
}
opts.append("}");
return opts.toString();
}
%>
<%
out.clear(); //清空当前的输出内容(空格和换行符)

String selectedId = request.getParameter("selectedId"); //获取selectedId参数
String optionsInfo = getOptions(selectedId); //调用getOptions方法取得下级选项信息

out.print(optionsInfo); //输出下级选项信息
%>
Jarvis-Li 2008-10-14
  • 打赏
  • 举报
回复
你先调一下页回页能不能返回数据
和数据的格式

找找问题是在哪个页面这样没人会帮你看的
加载更多回复(2)

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧