<?xml version="1.0" encoding="UTF-8"?>
<root>
<item id="001">
<zip>021</zip>
<city>上海</city>
</item><item id="002">
<zip>010</zip>
<city>北京</city>
</item>
<item id="003">
<zip>020</zip>
<city>天津</city>
</item>
</root>
上面的代碼看上去比較復(fù)雜,其實(shí)就只是創(chuàng)建XMLHttpRequest對象而已,大部分代碼是為了考慮瀏覽器的兼容性而寫的,看不懂也沒有關(guān)系。
function getHTTPObject(){
var xmlhttp = false;
if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
if(xmlhttp.overrideMimeType){
xmlhttp.overrideMimeType('text/xml');
}
}
else{
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch(E){
xmlhttp = false;
}
}
}
return xmlhttp;
}
上面這段也可以說是通用的過程,因?yàn)樾枰萇pen一個(gè)請求,然后看它的狀態(tài)來決定接下來該怎么做??梢钥闯鑫覀兘酉聛硪?handleHttpResponse。
function updateCity(){
//var zipValue = document.getElementById("zip").value;
http.open("GET",url,true);
http.onreadystatechange = handleHttpResponse;
http.send(null);
}
這段就是我們通過取得的區(qū)號代碼去遍歷XML文件直到找到和我們給出的區(qū)號代碼相符的,顯示出其城市名。關(guān)于xml的遍歷資料中會提到。
function handleHttpResponse(){
if(http.readyState == 4){
if(http.status == 200){
var xmlDocument = http.responseXML;
var city = "未知城市";
var zipval = document.getElementById("zip").value;
var items = xmlDocument.getElementsByTagName('item');
for(var i = 0;i < items.length;i++){
var item = items[i];
if(item.getElementsByTagName('zip')[0].firstChild.data == zipval){
city = item.getElementsByTagName('city')[0].firstChild.data;
document.getElementById('city').value=city;
return;
}
}
document.getElementById('city').value=city;
}
else{
alert("你所請求的頁面發(fā)生異常,可能會影響你瀏覽該頁的信息!");
}
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Zip.html</title><meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
<SCRIPT language="JavaScript" type="text/javaScript">
var url = "zip.xml";
function handleHttpResponse(){
if(http.readyState == 4){
if(http.status == 200){
var xmlDocument = http.responseXML;
var city = "未知城市";
var zipval = document.getElementById("zip").value;
var items = xmlDocument.getElementsByTagName('item');
for(var i = 0;i < items.length;i++){
var item = items[i];
if(item.getElementsByTagName('zip')[0].firstChild.data == zipval){
city = item.getElementsByTagName('city')[0].firstChild.data;
document.getElementById('city').value=city;
return;
}
}
document.getElementById('city').value=city;
}
else{
alert("你所請求的頁面發(fā)生異常,可能會影響你瀏覽該頁的信息!");
}
}
}
function updateCity(){
var zipValue = document.getElementById("zip").value;
http.open("GET",url,true);
http.onreadystatechange = handleHttpResponse;
http.send(null);
}
//該函數(shù)可以創(chuàng)建我們需要的XMLHttpRequest對象
function getHTTPObject(){
var xmlhttp = false;
if(window.XMLHttpRequest){
xmlhttp = new XMLHttpRequest();
if(xmlhttp.overrideMimeType){
xmlhttp.overrideMimeType('text/xml');
}
}
else{
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch(E){
xmlhttp = false;
}
}
}
return xmlhttp;
}
var http = getHTTPObject();
</SCRIPT>
</head><body>
<form action="post">
<p>
區(qū)號:
<input type="text" size="6" name="zip" id="zip" onblur="updateCity();"/>
</p>
城市:
<input type="text" name="city" id="city" />
</form></body>
</html>
<servlet>
<display-name>DWR Servlet</display-name>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
這個(gè)應(yīng)該和我們其他的app配置沒什么兩樣的。
3、配置DWR專門的配置文件dwr.xml(放到和web.xml一個(gè)目錄下),這個(gè)文件就是部署你可以被調(diào)用的遠(yuǎn)程的方法和類。
<dwr>
<allow>
<create creator="new" javascript="Chat">
<param name="class" value="com.motel168.chat.Chat"></param>
</create>
<convert converter="bean" match="com.motel168.chat.Message"/>
</allow>
</dwr>
package com.motel168.chat;import java.util.LinkedList;
import java.util.List;public class Chat {
static LinkedList messages = new LinkedList();
public List addMessage(String text){
if(text != null && text.trim().length()>0){
messages.addFirst(new Message(text));
while(messages.size() > 10){
messages.removeLast();
}
}
return messages;
}
public List getMessages(){
return messages;
}
package com.motel168.chat;5、在前端頁面調(diào)用:public class Message {
long id = System.currentTimeMillis();
String text;
public Message(String newtext){
text = newtext;
if(text.length()>256){
text = text.substring(0,256);
}
text = text.replace('<','[');
text = text.replace('&','_');
}
public long getId(){
return id;
}
public String getText(){
return text;
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<script type='text/javascript' src='/DWR/dwr/interface/Chat.js'></script>
<script type='text/javascript' src='/DWR/dwr/engine.js'></script>
<script type='text/javascript' src='/DWR/dwr/util.js'></script><head>
<title>chat.html</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<P>聊天記錄:</P>
<DIV id="chatlog"></DIV>
<p>
請輸入信息:<INPUT id="text"/>
<INPUT type="button" value="發(fā)言" onclick="sendMessage()"/>
</body>
</html>
<script language="javascript">
function sendMessage(){
var text = DWRUtil.getValue("text");
DWRUtil.setValue("text","");
Chat.addMessage(gotMessages,text);
}
function gotMessages(messages)
{
var chatlog = "";
for (var data in messages)
{
chatlog = "<div>" + messages[data].text +
"</div>" + chatlog;
}
DWRUtil.setValue("chatlog", chatlog);
}
</script>
<script type='text/javascript' src='/DWR/dwr/interface/Chat.js'></script> 是動(dòng)態(tài)產(chǎn)生的js文件,另外兩個(gè)util.js,engine.js是兩個(gè)javascript庫文件。
后面有個(gè)DWRUtil類可以參考對應(yīng)的文檔。
最后應(yīng)該是類似下面這個(gè)效果:
今天碰到個(gè)簡單問題,但是找了半天資料才算解決,自動(dòng)關(guān)閉瀏覽器一直有對話框彈出。看了網(wǎng)上也有不少人有這個(gè)困惑,所以整理一下:
<script language="javascript">
function countdown()
{
window.opener=null;//沒有對話框,這句不可缺少
window.close();
}
setTimeout("countdown()",3000);
</script>
程序很簡單,就是3秒鐘自動(dòng)關(guān)閉瀏覽器,不用解釋^_^!