AJAX+JSON 实现省市县地名三级联动

AJAX+JSON  实现省市县地名三级联动

本案例运用到三层架构(表现层,服务层、持久层)表现层调用服务层的方法,服务层调用持久层的方法,使用数据库为Oracle数据库,在数据库中创建一张名为address的数据表。前前和后台数据传输使用json方式(引入第三方工具Jackson)具体字段和插入的数据如下

address.sql

[sql]  view plain  copy
  1. "font-family:Microsoft YaHei;font-size:18px;">CREATE TABLE address (  
  2.   id       NUMBER(5), --地名编码(唯一)  
  3.   name     VARCHAR2(45), --名字  
  4.   grade    NUMBER(1), --等级(0代表省,2代表市,3代表县)  
  5.   parentid NUMBER(5), --父级编码,默认为0(0是顶级没有父类)  
  6.   CONSTRAINT pk_address_id PRIMARY KEY (id)  
  7.   
  8. );  
  9.   
  10. INSERT INTO address (id, name, grade, parentid) VALUES (1,'北京',0,0);  
  11. INSERT INTO address (id, name, grade, parentid) VALUES (2, '广东', 0, 0);  
  12. INSERT INTO address (id, name, grade, parentid) VALUES (3, '深圳', 0, 2);  
  13. INSERT INTO address (id, name, grade, parentid) VALUES (4, '福田区', 0, 3);  
  14. INSERT INTO address (id, name, grade, parentid) VALUES (5, '广州', 0, 2);  
  15. INSERT INTO address (id, name, grade, parentid) VALUES (6, '四川', 0, 0);  


数据库数据如下:

创建一个js文件夹存放js文件(需要引入json.js):


项目结构如图:

AJAX+JSON 实现省市县地名三级联动_第1张图片


需要的包:

AJAX+JSON 实现省市县地名三级联动_第2张图片

具体代码如下:

1、adress.jsp(显示界面)

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>









	

省市县三级联动

省: 市: 县:


表现层:
2、AdressServlet.java
package cn.sz.hcq.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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

import org.codehaus.jackson.map.ObjectMapper;

import cn.sz.hcq.pojo.Adress;
import cn.sz.hcq.service.IAdressService;
import cn.sz.hcq.service.impl.AdressServiceImpl;

//用注解配置servlet
@WebServlet("/adress.do")
public class AdressServlet extends HttpServlet {

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

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		IAdressService adressService = new AdressServiceImpl();
		/* Post请求中文乱码处理 */
		request.setCharacterEncoding("utf-8");
		// 响应中文乱码处理
		response.setContentType("text/html;charset=UTF-8");
		// 获取到当前地址的id
		String id = request.getParameter("id");
		// 如果为空,则说明是第一次请求,则显示所有的省
		if (id == null || id.equals("")) {
			// 调用Service层方法获取所有的省
			List provinces = adressService.findAllProvinces();
			// 将数据绑定到request
			request.setAttribute("list", provinces);
			// 页面转发到adress.jsp
			request.getRequestDispatcher("adress.jsp").forward(request, response);
		} else {
			// 根据当前地址的id获取他的下级地址(当前地址的id也就是下级地址的parentid)
			List citys = adressService.findCitys(Integer.parseInt(id));
			
			// 创建实现转换的对象
			ObjectMapper mapper = new ObjectMapper();
			// 将list集合转换为json字符串
			String str = mapper.writeValueAsString(citys);
			PrintWriter out = response.getWriter();
			System.out.println(str);
			out.flush();
			out.close();
		}
	}
}

持久层:

3、IAdressDAO.java (对应操作数据库的方法)

[java]  view plain  copy
  1. "font-family:Microsoft YaHei;font-size:18px;">public interface IAdressDAO {  
  2.     // 查寻所有的省  
  3.     public List findAllProvinces();  
  4.   
  5.     // 根据当前选中地址的id查询出他的下级地址  
  6.     public List findCitys(Integer id);  
  7.   
  8. }  
  9.   

4、AdressDAOImpl.java (具体实现操作数据库的方法)

[java]  view plain  copy
  1. "font-family:Microsoft YaHei;font-size:18px;">public class AdressDAOImpl implements IAdressDAO {  
  2.   
  3.     public List findAllProvinces() {  
  4.         List list = null;  
  5.         Connection conn = null;  
  6.         PreparedStatement ps = null;  
  7.         ResultSet rs = null;  
  8.         try {  
  9.             list = new ArrayList();  
  10.             conn = DBUtils.getConn();  
  11.             String sql = "select id,name,grade,parentid from address where grade=?";  
  12.             ps = conn.prepareStatement(sql);  
  13.             ps.setInt(10);  
  14.             rs = ps.executeQuery();  
  15.             while (rs.next()) {  
  16.                 Adress a = new Adress();  
  17.                 a.setId(rs.getInt(1));  
  18.                 a.setName(rs.getString(2));  
  19.                 a.setGrade(rs.getInt(3));  
  20.                 a.setParentid(rs.getInt(4));  
  21.                 list.add(a);  
  22.             }  
  23.         } catch (SQLException e) {  
  24.             e.printStackTrace();  
  25.         } finally {  
  26.             DBUtils.close(conn, ps, rs);  
  27.         }  
  28.         return list;  
  29.     }  
  30.   
  31.     public List findCitys(Integer id) {  
  32.         List list = null;  
  33.         Connection conn = null;  
  34.         PreparedStatement ps = null;  
  35.         ResultSet rs = null;  
  36.         try {  
  37.             conn = DBUtils.getConn();  
  38.             list = new ArrayList();  
  39.             String sql = "select id,name,grade,parentid from address where parentid=?";  
  40.             ps = conn.prepareStatement(sql);  
  41.             ps.setInt(1, id);  
  42.             rs = ps.executeQuery();  
  43.             while (rs.next()) {  
  44.                 Adress a = new Adress();  
  45.                 a.setId(rs.getInt(1));  
  46.                 a.setName(rs.getString(2));  
  47.                 a.setGrade(rs.getInt(3));  
  48.                 a.setParentid(rs.getInt(4));  
  49.                 list.add(a);  
  50.             }  
  51.         } catch (SQLException e) {  
  52.             e.printStackTrace();  
  53.         } finally {  
  54.             DBUtils.close(conn, ps, rs);  
  55.         }  
  56.         return list;  
  57.     }}  


服务层:

5、IAdressService.java (服务层接口 定义方法)

[java]  view plain  copy
  1. "font-family:Microsoft YaHei;font-size:18px;">public interface IAdressService {  
  2.     public List findAllProvinces();  
  3.   
  4.     public List findCitys(Integer id);  
  5. }  


6、AdressServiceImpl.java  (服务层接口 定义方法实现类)

[java]  view plain  copy
  1. "font-family:Microsoft YaHei;font-size:18px;">public class AdressServiceImpl implements IAdressService {  
  2.     private IAdressDAO adressDao = new AdressDAOImpl();  
  3.   
  4.     @Override  
  5.     public List findAllProvinces() {  
  6.         return adressDao.findAllProvinces();  
  7.     }  
  8.   
  9.     @Override  
  10.     public List findCitys(Integer id) {  
  11.         return adressDao.findCitys(id);  
  12.     }  
  13.   
  14. }  


实体:

7、Adress.java

[java]  view plain  copy
  1. "font-family:Microsoft YaHei;font-size:18px;">  
  2. public class Adress implements Serializable {  
  3.     private Integer id;  
  4.     private String name;  
  5.     private Integer grade;  
  6.     private Integer parentid;  
  7.   
  8.   
  9.     public Adress() {  
  10.     }  
  11.   
  12.   
  13.     public Adress(Integer id, String name, Integer grade, Integer parentid) {  
  14.         this.id = id;  
  15.         this.name = name;  
  16.         this.grade = grade;  
  17.         this.parentid = parentid;  
  18.     }  
  19.   
  20.   
  21.     public Integer getId() {  
  22.         return id;  
  23.     }  
  24.   
  25.   
  26.     public void setId(Integer id) {  
  27.         this.id = id;  
  28.     }  
  29.   
  30.   
  31.     public String getName() {  
  32.         return name;  
  33.     }  
  34.   
  35.   
  36.     public void setName(String name) {  
  37.         this.name = name;  
  38.     }  
  39.   
  40.   
  41.     public Integer getGrade() {  
  42.         return grade;  
  43.     }  
  44.   
  45.   
  46.     public void setGrade(Integer grade) {  
  47.         this.grade = grade;  
  48.     }  
  49.   
  50.   
  51.     public Integer getParentid() {  
  52.         return parentid;  
  53.     }  
  54.   
  55.   
  56.     public void setParentid(Integer parentid) {  
  57.         this.parentid = parentid;  
  58.     }  
  59.   
  60. }  


数据库连接:

8、DBUtils.java (数据库连接工具类)

[java]  view plain  copy
  1. "font-family:Microsoft YaHei;font-size:18px;">public class DBUtils {  
  2.     public static Connection getConn() {  
  3.         Connection conn = null;  
  4.         try {  
  5.             // 加载数据库驱动  
  6.             DriverManager.registerDriver(new OracleDriver());  
  7.             // 获得连接  
  8.             conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:yztc""scott""tiger");  
  9.         } catch (SQLException e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.         return conn;  
  13.     }  
  14.   
  15.     public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {  
  16.         try {  
  17.             if (rs != null)  
  18.                 rs.close();  
  19.             if (ps != null)  
  20.                 ps.close();  
  21.             if (conn != null)  
  22.                 conn.close();  
  23.         } catch (SQLException e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27. }  

结果截图:

项目部署成功后,在游览器输入如下地址即可

你可能感兴趣的:(JSON,Ajax)