需求:
在JavaScript中动态的从一个URL取得xml文件,然后,动态的更新数据。
问题的难点:
Javascript 不能实现从一个URL读取xml数据。
使用动态的参数的时候,如后使用GET方法,那么,参数有可能太长。
解决的办法:
这个办法使用AJAX可以实现。
因为AJAX可以从URL来动态的读取xml数据。
同时也可以很方便的分析和处理XML数据。
问题的关键点:
AJAX 不能从一个不同Context的服务器上来读入XML,所以要想读取xml数据的话,那就一定要在同一个Context中,如果不在,那么就使用一个Servlet来实现从一个远程的URL上读取数据,然后可以通过调用此Servlet来取得远程的数据。
我的实现:
写一个Servlet来实现从远程url上读取xml数据,这个url参数是用户根据自己的需要传递的。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(" -------------- Get ---------------- ");
response.setContentType("text/xml");
response.setCharacterEncoding("UTF-8");
// PrintWriter out = response.getWriter();
//doPost(request,response);
String url = request.getParameter("url");
//out.println(url);
//String url = "";
System.out.println("url is : " + url);
//response.setContentType("text/xml");
PrintWriter out = response.getWriter();
BufferedReader reader = new BufferedReader(new InputStreamReader(new URL(url).openStream()));
StringBuffer xmlData = new StringBuffer();
String tmp = "";
while((tmp = reader.readLine())!=null){
log.info(tmp);
out.print(tmp);
//System.out.println(" tmp : " + tmp);
xmlData.append(tmp);
}
try {
out.println(XMLUtil.format(xmlData.toString()));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
reader.close();
}
在AJAX来调用servlet取得此数据
< script type = "text/javascript" >
var xmlHttp= new ActiveXObject( "Msxml2.XMLHTTP" );
//alert(xmlHttp);
这个 url 是你的 servlet 的 uri, 只能是在同一个 context 内的,否则不能调用。所以,如果需要跨服务器的话,或者需要跨 context 的话,就需要使用在本 context 上使用一个 servlet 做跳转。
var sevUrl = "../servlet/PullXmlData?url=" ;
下面的那个 url 参数其实是我们的远程的 xml 的数据的 url, 因为在参数里面有等号,所以在调用之前就要通过一个处理和转换,这一步也是必须的。
var url = sevUrl + encodeURIComponent( "http://192.168.1.50:8080/remoteServer /XmlInvoke?aaa=aaa&bbb=bbb " );
alert( "url : " + url);
xmlHttp.open( "post" , url , false );
xmlHttp.onreadystatechange= function () {
if (xmlHttp.readyState==4) {
alert(xmlHttp.responseText);
document.write(xmlHttp.responseText);
}
}
xmlHttp.send();
</ script >
大家有好的解决办法,还请多多指教