论坛首页 AJAX版 AJAX

使用dhtmlxGrid 1.3免费版,可以从本地loadXML,从服务器上却不行

浏览 1994 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-05-25
看了 daoger 写的 dhtmlXGrid应用简介,我也尝试使用dhtmlxGrid + Struts 2以表格的方式向用户展现数据

jsp页面代码如下:
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
<head>

<title>编辑商品</title>
</head>
<body>
	<link rel="STYLESHEET" type="text/css" href="../css/dhtmlXGrid.css">
	<script  src="../js/dhtmlXCommon.js"></script>
	<script  src="../js/dhtmlXGrid.js"></script>
	<script  src="../js/dhtmlXGridCell.js"></script>

<s:action name="getUnitsXMLString" id="unitAction" namespace="/unit"/>

<s:form name="editForm" action="save" validate="true">
	 <!-- 其它代码略 -->
	 <div id="gridbox" width="100%" height="250px" style="background-color:white"></div>
    <script type="text/javascript">
        mygrid = new dhtmlXGridObject('gridbox');
        mygrid.setImagePath("../images/");
        mygrid.loadXML("/unit/getUnitsXMLString.action?productId=${productId}");
    </script>

</s:form>
</body>
</html>


Action getUnitsXMLString在struts.xml中配置如下:
		<action name="getUnitsXMLString" class="unitAction" method="getUnitsXMLString">
			<result>/jsp/sysinfo/product.jsp</result>
		</action>


unitAction的代码如下:
public class UnitAction extends ActionSupport implements ServletResponseAware {

	private HttpServletResponse response;

	public void setServletResponse(HttpServletResponse response) {
		this. response = response;
	}

	public String doGetUnitsXMLString() {
		//其它代码略
		
		//dhtmlxGrid的loadXML方法所需要的字符串由gridMapper.getMappedXMLString()返回
		String mappedXMLString = gridMapper.getMappedXMLString();
		
		//将生成的XML字符串发往客户端
		response.setContentType("text/xml; charset=GBK");
		response.setHeader("Cache-Control", "no-cache");
		try {
			response.getWriter().write(mappedXMLString);
			response.getWriter().flush();
		}
		catch (IOException e) {
			//异常处理代码略
		}
		return SUCCESS;
	}
}


gridMapper.getMappedXMLString()返回的字符串内容如下:
<?xml version="1.0" encoding="GBK"?>
<rows>
<head>
<column type="ed" width="100" align="left" sort="str" >Code</column>
<column type="ed" width="100" align="left" sort="str" >Name</column>
<column type="price" width="80" align="right" sort="int" >Scale</column>
<column type="ch" width="80" align="center" sort="str" >Basic unit</column>
<settings>
<colwidth>px</colwidth>
</settings>
</head>
<row id="1" >
<cell>BOX</cell>
<cell>box</cell>
<cell>1.0</cell>
<cell>1</cell>
</row>
</rows>


运行我的jsp页面,浏览器报如下错误:
Error type: LoadXML
Description: Incorrect XML

将gridMapper.getMappedXMLString()返回的字符串保存到unit.xml中,保存在本地,并根据jsp页面改写一个html页面如下:
<%@page pageEncoding="GBK" contentType="text/html; charset=GBK" %>

<html>
<head>

<title>编辑商品</title>
</head>
<body>
	<link rel="STYLESHEET" type="text/css" href="../css/dhtmlXGrid.css">
	<script  src="../js/dhtmlXCommon.js"></script>
	<script  src="../js/dhtmlXGrid.js"></script>
	<script  src="../js/dhtmlXGridCell.js"></script>

<form name="editForm">
	 <!-- 其它代码略 -->
	 <div id="gridbox" width="100%" height="250px" style="background-color:white"></div>
    <script type="text/javascript">
        mygrid = new dhtmlXGridObject('gridbox');
        mygrid.setImagePath("../images/");
        mygrid.loadXML("unit.xml");
    </script>

<form>
</body>
</html>


运行该html页面,能正常loadXML并显示网格。这是为什么呢?
   
最后更新时间:2007-05-25
又阅读了源代码中出错的位置,在dhtmlXCommon.js中:

dtmlXMLLoaderObject.prototype.getXMLTopNode=function(tagName){
  if(this.xmlDoc.responseXML){
    var temp=this.xmlDoc.responseXML.getElementsByTagName(tagName);
    alert(this.xmlDoc.responseXML.xml); //这一行是我添加的
    var z=temp[0];
  }else {
    var z=this.xmlDoc.documentElement;
  }
  if(z){
    this._retry=false;
    return z;
  }
  if((_isIE)&&(!this._retry)){
    var xmlString=this.xmlDoc.responseText;
    alert(this.xmlDoc.responseText); //这一行是我添加的
    this._retry=true;
    this.xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    this.xmlDoc.async=false;
    this.xmlDoc.loadXML(xmlString);
    return this.getXMLTopNode(tagName);
  }
  dhtmlxError.throwError("LoadXML","Incorrect XML",[this.xmlDoc,this.mainObject]);
  return document.createElement("DIV");
};


执行时alert显示this.xmlDoc.responseXML.xml为空!而this.xmlDoc.responseText为输出的XML字符串的内容与/jsp/sysinfo/product.jsp的内容。为了说得更清楚一些,我截了张图片,请见附件
这样responseXML.xml为空,responseText也不正确,所以grid就无法初始化了。可是我应该怎样解决/避免这个问题呢?
  • A8d75d06-8ac4-4a99-aa59-4f185fa551c4-thumb
  • 大小: 113.9 KB
   
0 请登录后投票
最后更新时间:2007-05-26
客户端接收到的responseText的内容错误的问题用如下偏方解决了:

将getUnitsXMLString.action在struts.xml中配置修改为如下:

<action name="getUnitsXMLString" class="unitAction" method="getUnitsXMLString">     
    <result>/jsp/sysinfo/dummy.txt</result>     
</action>


其中dummy.txt是一个无内容(0字节)的文件。这样客户端仅会收到XML字符串的内容了

重新运行jsp页面,表格显示仍不正确。浏览器状态栏左下角的黄色三角形图标显示页面执行过程中出错了。双击该图标,错误如下:

引用
行: 1743
字符:7
错误:未知的运行时错误
代码:0
URL:http://localhost:8080/PowerMedical/unit/getUnitsXMLString.action?productId=1


查看dhtmlXGrid.js中出错的代码:

  this.setHeaderCol=function(col,label){
    var z=this.hdr.rows[1];
    var col=(z._childIndexes?z._childIndexes[col]:col);
    if(!this.useImagesInHeader){
      var hdrHTML="<div class='hdrcell'>";
      if(label.indexOf("img:[")!=-1){
        var imUrl=label.replace(/.*\[([^>]+)\].*/,"$1");
        label=label.substr(label.indexOf("]")+1,label.length);
        hdrHTML+="<img width='18px' height='18px' align='absmiddle' src='"+imUrl+"' hspace='2'>";
      }
      hdrHTML+=label;
      hdrHTML+="</div>";
      alert(hdrHTML); <!-- 这一行是我调试时加入的 -->
      z.cells[col].innerHTML=hdrHTML; <!-- 第1742行 -->
      alert(hdrHTML); <!-- 这一行是我调试时加入的 -->
      if(this._hstyles[col]){ <!-- 第1743行 -->
        z.cells[col].style.cssText=this._hstyles[col];
      }
    }else {
      z.cells[col].style.textAlign="left";
      z.cells[col].innerHTML="<img src='"+this.imgURL+""+label+"' onerror='this.src = \""+this.imgURL+"imageloaderror.gif\"'>";
      var a=new Image();
      a.src=this.imgURL+""+label.replace(/(\.[a-z]+)/,".desc$1");
      this.preloadImagesAr[this.preloadImagesAr.length]=a;
      var b=new Image();
      b.src=this.imgURL+""+label.replace(/(\.[a-z]+)/,".asc$1");
      this.preloadImagesAr[this.preloadImagesAr.length]=b;
    }
  };


经过跟踪,发现出错的实际上是第1742行,因为加入的两条alert语句只有第一条执行了。在第1742行前加入alert调试,发现:

z.cells.length的值为1
col的值为0
z.cells[col].innerHTML为空
hdrHTML的内容为 <div class='hdrcell'>Code</div>

看起来这几个变量都很正常,第1742行应该不会出错啊~~~我又迷惑了~~~
   
0 请登录后投票
最后更新时间:2007-05-28
查看jsp页面解析后生成的客户端页面源码,大致如下:

<html>
<head>
<title>编辑商品</title>
</head>
<body>
	<link rel="STYLESHEET" type="text/css" href="/PowerMedical/css/dhtmlXGrid.css">
	<script language=javascript src="/PowerMedical/js/dhtmlXCommon.js"></script>
	<script language=javascript src="/PowerMedical/js/dhtmlXGrid.js"></script>
	<script language=javascript src="/PowerMedical/js/dhtmlXGridCell.js"></script>
	<h2>
            编辑
	</h2>

	<script src="/PowerMedical/struts/xhtml/validation.js"></script>
		
<form namespace="/product" id="save" name="editForm" onsubmit="return validateForm_save();" action="/PowerMedical/product/save.action" method="POST">
<table class="wwFormTable"> <!-- 第17行 -->
	<div id="gridbox" width="100%" height="250px" style="background-color:white"></div>
    <script type="text/javascript">
        mygrid = new dhtmlXGridObject('gridbox');
        mygrid.setImagePath("../../images/");
        mygrid.loadXML("/PowerMedical/unit/getUnitsXMLString.action?productId=1");
    </script>
</table> <!-- 第24行 -->
</form>

<script type="text/javascript">
    function validateForm_save() {
        form = document.getElementById("save");
        clearErrorMessages(form);
        clearErrorLabels(form);

        var errors = false;

        return !errors;
    }
</script>

</body>
</html>


gridbox的父元素是一个table(第17行、第24行)。而顶楼的帖子里根据jsp页面改写的html页面没有这两行。尝试将这两行加入到改写的html页面中,运行,果然也出错了!再次编辑顶楼的jsp页面,将<s:form></s:form>中的内容移到外面,重新运行,这次表格终于正常显示出来了!

看来,结论就是:dhtmlxGrid不能放在一个table中。由于Struts 2的<s:form>标签会自动生成一个table,所以它不能包含dhtmlxGrid。

至此问题的原因算是找到了,我还得花些功夫修改我的jsp页面。。。
   
0 请登录后投票
论坛首页 AJAX版 AJAX

跳转论坛:
JavaEye推荐