看了你的代码,能不能交流一下,我目前在用Ajax,想体验一下Ajax的好处,请不吝赐教

[复制链接]
查看11 | 回复1 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
实现一个省市联动菜单,断断续续研究了好长时间,现在终于通过自己的努力实现了.
过程详解:
准备工作:
一个XML文件:

xml 代码
xml version="1.0" encoding="GBK"?>


北京city>
上海city>
天津city>
重庆city>
province>

广州city>
珠海city>
深圳city>
东莞city>
province>

桂林city>
柳州city>
北海city>
南宁city>
province>

海口city>
三亚city>
province>

武汉city>
鄂州city>
荆州city>
十堰city>
province>

长沙city>
岳阳city>
常德city>
张家界city>
province>

杭州city>
绍兴city>
宁波city>
台州city>
province>

沈阳city>
大连city>
抚顺city>
铁岭city>
province>
china>
用一个Java类来解析这个XML文件,我用的是JDOM,实现的功能为能够获取所有省份,和传入省份的集合(用于Jsp页面显示),可以获取相应的城市集合.

java 代码
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
public class ReadXml {
private Element root = null;


public ReadXml() throws FileNotFoundException, JDOMException, IOException {
super();
SAXBuilder sb = new SAXBuilder();//解析器对象
Document doc = sb.build(this.getClass().getResourceAsStream("/city.xml&quot

);//绑定文件
root = doc.getRootElement();//获取根元素
}

public List getProvince(){//获取省份

ArrayList provinceList = new ArrayList();
List tempList = root.getChildren();//获取所有省份节点
for(int i=0; i

Element province=(Element)tempList.get(i);//子节点转型

provinceList.add(province.getAttributeValue("name&quot

);//获取省份节点属性内容
}
return provinceList;

}

public List getCity(String province){
ArrayList cityList = new ArrayList();
List provincetemplist = root.getChildren();//省份集合
for(int i=0; i

Element provinceElement = (Element)provincetemplist.get(i);

if((provinceElement.getAttributeValue("name&quot

).equals(province)){//如果属性为传进来的名称

List cityTempList = provinceElement.getChildren();//获取子节点集合

for(int j=0; j//循环

Element cityElement = (Element)cityTempList.get(j);//当前城市节点

cityList.add(cityElement.getTextTrim());//增加城市到集合


}

}
}
return cityList;
}
}
准备工作完毕,建一个Struts工程
写一个Action,用来获取省份集合
java 代码
public class GetProvinceAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) throws FileNotFoundException, JDOMException, IOException {
ReadXml rx = new ReadXml();
List provinces = rx.getProvince();//获取省份
request.setAttribute("provinces", provinces);//放入request中
return mapping.findForward("success&quot

;
}
}
先通过此Action,然后再显示首页,这样省的下拉框里就有值了.
我先把Struts-Config.XML文件贴出来

xml 代码


form-beans>




action>



action>
然后是显示的JSP页面

xml 代码









Insert title heretitle>
head>

var xmlHttp;
// 创建xmlHttp;
function createXMLHttpRequest(){
if(window.ActiveXObject){
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP&quot

;
}else if(window.XMLHttpRequest){
xmlHttp = new XMLHttpRequest();
}
}

// 删除城市选项
function clearCityList(){
var citys = document.getElementById("city&quot

;
while(citys.childNodes.length > 0){
citys.removeChild(citys.childNodes[0]);
}
}

//选项省份时
function selectProvince(){
var province = document.getElementById("province&quot

.value;//获取省份值

if(province == "&quot

{ //如果为空,则清空城市选项
clearCityList();
var citySelect = document.getElementById("city&quot

; //获取城市select组件
var option = document.createElement("option&quot

;
option.appendChild(document.createTextNode("请选择城市"));
citySelect.appendChild(option);
return ; //返回
}
//服务器处理地址,是一个Servlet
var url = "http://localhost:8080/SelelctDemo/servlet/Linkage?province=" + encodeURIComponent(province) + "&ts=" + new Date().getTime();
createXMLHttpRequest();//创建xmlHttp对象;
xmlHttp.onreadystatechange = handleStateChange; //回调函数
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
}

//回调函数
function handleStateChange(){
if(xmlHttp.readyState == 4){
if(xmlHttp.status == 200){

updateCitysList();
}
}
}

//页面更新城市集合函数
function updateCitysList(){
clearCityList();//首先删除先前的城市选项
var citySelect = document.getElementById("city"); //获取城市select组件
var results = xmlHttp.responseXML.getElementsByTagName("city");//获取Ajax返回的结果,city为返回的XML里的节点
var option = null;
for(var i=0; i






请选择省份html

ption>



html:select>




请选择城市html

ption>

html:select>
logic

resent>
html:submit>
html:form>

省份:


logic

resent>

城市:


logic

resent>
body>
html:html>

下面是按处理Ajax的Servlet

java 代码
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jdom.JDOMException;
import com.selectdemo.tool.ReadXml;
public class Linkage extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
String province = request.getParameter("province"); //获取参数中的值
System.out.println(province);
ReadXml rx;
List citys = null;
try {

rx = new ReadXml();

citys = rx.getCity(province);
} catch (JDOMException e) {


e.printStackTrace();
}
System.out.println(citys.size());
//组装城市选项
StringBuffer results = new StringBuffer("");
for(int i=0; i");

results.append(citys.get(i));

results.append("");
}
results.append("");
response.setContentType("text/xml;");
PrintWriter pw = response.getWriter();
System.out.println(results.toString());
pw.print(results.toString());
pw.flush();
pw.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {
doGet(request, response);
}
}
Servlet处理完后,返回到JSP页面,会传给JSP页面一个XML文档,以字符串的形式传过去的,JSP页面解析这个String,从而增加城市选项的下拉列表
点击submit后,用一个Action接收,看值传进来没有

java 代码
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.selectdemo.struts.form.SelectForm;

public class SelectAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html;charset=UTF-8");
SelectForm sf = (SelectForm)form;
String province = sf.getProvince();
System.out.println(province);
String city = sf.getCity();
System.out.println(city);
request.setAttribute("province", province);
request.setAttribute("city", city);
return mapping.findForward("success");
}
}
这里,你会发现,传进来的值会是乱码,解决乱码我写了一个MyActionServlet

java 代码
import org.apache.struts.action.ActionServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyActionServlet extends org.apache.struts.action.ActionServlet
{
protected void process(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException
{
request.setCharacterEncoding("UTF-8");
super.process(request, response);
}
}

好了,到这里后,就大功告成了.
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
看了你的代码,能不能交流一下,我目前在用Ajax,想体验一下Ajax的好处,请不吝赐教
谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行