使用dom4j+jquery的一个省份级联市的demo


在客户端与服务器端交互时,通常使用的数据格式有xml和json,网上也溜达了一些,很多都说json更适合用作数据交互的格式。

这个demo是很久以前写的,稍后在贴一个json的简单例子。

在java web开发中,如果使用jdk 中的xml api 进行数据的解析,很是麻烦。而一些好的解析xml的框架有jdom 、dom4j等。这里就使用dom4j进行演示。


1、最开始当然是扎好架子了,从网上找到dom4j的jar包,加入到lib文件中,并下载jquery的源文件加入到WebContent中。

2、完成服务器端的Servlet程序:

package net.hnspi.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import net.hnspi.util.DBManager;


public class MenuServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    DBManager db = null;
    PreparedStatement pstmt = null;


    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        String type = request.getParameter("type");
        response.setContentType("text/xml;charset=gb2312");
        if (type.equals("province")) {
            try {
                responseProvince(response);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (type.equals("city")) {
            String provinceId = request.getParameter("provinceId");
            try {
                responseCity(response, provinceId);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 取得所有省份的数据返回给客户端
     * 
     * @param response
     * @throws SQLException
     * @throws IOException
     */
    private void responseProvince(HttpServletResponse response)
            throws SQLException, IOException {
        db = new DBManager();
        String sql = "select provinceId,provinceName from province";
        pstmt = db.getDataBaseConnection().prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        writeXML(rs, "provinces", "province", response);
        db.realse();
    }

    /**
     * 根据省份id取得城市列表信息返回给客户端
     * 
     * @param response
     * @param provinceId 省份id
     * @throws SQLException
     * @throws IOException
     */
    private void responseCity(HttpServletResponse response, String provinceId)
            throws SQLException, IOException {
        db = new DBManager();
        String sql = "select cityId,cityName from city where provinceId=?";
        pstmt = db.getDataBaseConnection().prepareStatement(sql);
        pstmt.setString(1, provinceId);
        ResultSet rs = pstmt.executeQuery();
        writeXML(rs, "citys", "city", response);
        db.realse();
    }

    /**
     * 将数据库取得的数据使用dom4j转换为xml格式数据返回给客户端
     * 
     * @param rs 数据库中取得的结果集
     * @param root 根标签
     * @param child 子标签
     * @param response
     * @throws SQLException
     * @throws IOException
     */
    private void writeXML(ResultSet rs, String root, String child,
            HttpServletResponse response) throws SQLException, IOException {
        Document doc = DocumentHelper.createDocument();
        String provinceId = "";
        String provinceName = "";
        Element rootElement = doc.addElement(root);
        while (rs.next()) {
            provinceId = rs.getString(1);
            provinceName = rs.getString(2);
            Element childElement = rootElement.addElement(child);
            childElement.addAttribute("id", provinceId);
            childElement.setText(provinceName);
        }
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("gb2312");
        PrintWriter out = response.getWriter();
        XMLWriter xmlWriter = new XMLWriter(out, format);
        xmlWriter.write(doc);
        out.close();
        xmlWriter.close();
    }


    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

}


不要忘了对Servlet在web.xml中进行配置(Eclipse中自动完成)web.xml

  <servlet>
    <description></description>
    <display-name>MenuServlet</display-name>
    <servlet-name>MenuServlet</servlet-name>
    <servlet-class>net.hnspi.servlet.MenuServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MenuServlet</servlet-name>
    <url-pattern>/menuServlet.do</url-pattern>
  </servlet-mapping>

3、完成与服务端进行交互的js文件(注意要先导入jquery.js) menu.js

$(document).ready(function(){
	$.ajax({
		type:"post" ,
		url:"menuServlet.do",
		data:"type=province",
		dataType:"xml",
		success:getProvince ,
	}) ;
}) ;

function getProvince(data){
	var xml = $(data) ;
	var nodes = xml.find("province") ;
	var selPro = $("#province") ;
	selPro.change(getCityByProvince) ;
	selPro.html("") ;
	$('<option value=0>==选择省份==</option>').appendTo(selPro) ;
	nodes.each(function(){
		var node = $(this) ;
		var opt = $("<option>") ;
		opt.attr('value',node.attr("id")) ;		
		opt.html(node.text()).appendTo(selPro) ;
//		$('<option>').attr('value',attribute).html(node.text()).appendTo(selPro) ;
	}) ;
}

function getCityByProvince(){
	$.post("menuServlet.do","type=city&provinceId="+$(this).val(),getCity,"xml") ;	
}

function getCity(data){
	var xml = $(data) ;
	var nodes = xml.find("city") ;
	var selCity = $("#city") ;
	selCity.html("") ;
	$('<option value=0>==请选择市==</option>').appendTo(selCity) ;
	nodes.each(function(){
		var node = $(this) ;
		var opt = $("<option>") ;
		opt.attr('value',node.attr()) ;
		opt.html(node.text()).appendTo(selCity) ;
	}) ;
}

ok,总体的程序已经完成,其中的一些路劲之类的自己调一下就可以正常运行了,小弟,也是初学者,欢迎各位大虾拍砖,多多指教!! 吐舌头


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值