JavaWeb笔记-24-json省市联动

版权声明:转载请联系作者本人!!! https://blog.csdn.net/qq_41307491/article/details/82633897

问题:为什么需要把查询结果转换为json(未解决)


数据库中:一行记录对应多个对象时,需要使用Map对应多个对象

json的省市联动

dao:
    1)查询所有省
    2)通过省查询指定市
servlet:
    1)把所有省转换成json,发送给客户端
    2)通过获取省名称,查询该省内所有市,显示在<select id="province">
ajax1.jsp
    1)页面加载完后:访问servlet,得到所有省,显示在<select id="province">
    2)页面加载完后:给<select id="province">添加onchange事件监听.
                         监听内容:获取选择省名称,访问servlet得到所有市,显示在<select id="city">


导文件:连接数据库的配置文件  c3p0-config.xml (src下)

导包:

导包:

代码:


dao

public class Dao {
    private QueryRunner qr = new TxQueryRunner();

    /**
     * 查询所有的省
     * @return 
     * @return
     */
    @Test
    public List<Province> findAllProvince(){
        try {

            String sql = "select * from t_province";
            return qr.query(sql, new BeanListHandler<Province>(Province.class));

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /** 
     * 根据省名查询所有城市
     * @param proname
     * @return
     */
    public List<City> findAllCity(int pid){ //根据省名查询

        try{
            String sql = "select * from t_city where pid=? ";
            return qr.query(sql, new BeanListHandler<City>(City.class),pid);
        }catch(SQLException e){
            throw new RuntimeException(e);
        }
    }
}

Servelt

//CityServlet 
public class CityServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        /*
         * 1.获取省名称对应的pid参数     request.getParameter("pid");
         * 2.使用省id查询数据库,得到List<City>
         * 3.转换为json
         * 4.发送给客户端
         */

        //1.获取省名称对应的pid参数   并将字符串转换成int型  
        //request.getParameter("pid")  获取参数
        //Integer.parseInt()  转换字符串为int
        int pid = Integer.parseInt(request.getParameter("pid"));

        //2.使用省id查询数据库,得到List<City>
        Dao dao = new Dao();
        List<City> cityList = dao.findAllCity(pid);

        //3.转换为json
        String json = JSONArray.fromObject(cityList).toString();

        response.getWriter().print(json);
    }
}
//ProvinceServlet 

public class ProvinceServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");

        /*
         * 1.通过dao得到所有的省
         * 2.把List<Province>转换成json
         * 3.发送给客户端
         */

        //1.通过dao得到所有的省
        Dao dao = new Dao();
        List<Province> provinceList = dao.findAllProvince();

        //2.把List<Province>转换成json  便于在js中输出
        String json = JSONArray.fromObject(provinceList).toString();

        response.getWriter().print(json);//3.发送给客户端
    }
}

jsp

<script type="text/javascript">
    function createXMLHttpRequest() {
        try {
            return new XMLHttpRequest();
        } catch (e) {
            try {
                return new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    return new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {
                    alert("哥们儿,你用的是什么浏览器啊?");
                    throw e;
                }
            }
        }
    }

    /*
1.得到所有省:
    a> 在文档加载完毕时发送请求,
    b> 使用ajax请求ProvinceServlet,得到所有省份名称。
    c> 显示在<select id="pro"/>中
      */
    window.onload = function() {
        var xmlHttp = createXMLHttpRequest();
        xmlHttp.open("GET" , "<c:url value='/ProvinceServlet'/>",true);
        xmlHttp.send(null);
        xmlHttp.onreadystatechange = function() {

            if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {

                //执行服务器发送过来的json字符串,得到js对象数组
                var proArray = eval("(" + xmlHttp.responseText + ")");

                //遍历数组,使用每一个对象,创建并添加到opion中
                for(var i = 0; i < proArray.length; i++){
                    //得到数组内对象
                    var pro = proArray[i];

                    //创建option元素
                    var option = document.createElement("option");

                    //为option设置实际值、显示值
                    option.value = pro.pid;   //对<option>实际值赋为pid
                        //对TextNode赋值为pro.name,并创建文本节点
                    option.appendChild(document.createTextNode(pro.name)); 

                    //把option添加到select中
                    document.getElementById("pro").appendChild(option);
                }
            }
        };

        /*
2.  给<select name="province">注册改变监听。
    监听内容:
        //先清空city中原有的option
        a>获取当前省id
        b>使用省id访问CityServlet,得到省内所有市
        c>使用市名生成<option>,插入到<select id="city">元素中
        */
        var proSelect = document.getElementById("pro")
        proSelect.onchange = function(){
            /*
            异步操作,发送pid。
            需要先清空city中原有的option
            */
            var xmlHttp = createXMLHttpRequest();

            //打开
            xmlHttp.open("POST","<c:url value='/CityServlet'/>", true);
            xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

            //发送     option的value就是select的value   
            xmlHttp.send("pid=" + proSelect.value); //该省的value就是pid(在添加option时设置的)   

            //监听
            xmlHttp.onreadystatechange = function(){
                 if(xmlHttp.readyState == 4 && xmlHttp.status ==200){

                //清空select中所有option(除了当前选择)         

                    var citySelect = document.getElementById("c");
                    // 获取其所有子元素
                    var optionEleList = citySelect.getElementsByTagName("option");
                    // 循环遍历每个option元素,然后在citySelect中移除
                    while(optionEleList.length > 1) { //子元素的个数如果大于1就循环,等于1就不循环了!
                        citySelect.removeChild(optionEleList[1]);  //总是删除1下标,因为1删除了,2就变成1了!
                    }


                    //执行服务器发送过来的json字符串,得到js对象数组
                     var cityArray = eval("("+ xmlHttp.responseText +")");

                    for(var i = 0; i< cityArray.length; i++){
                        //得到数组内对象
                        var c = cityArray[i]; 

                        //创建option
                        var cityoption = document.createElement("option");

                        //为cityoption赋 显示值、实际值
                        cityoption.value = c.cid;
                        cityoption.appendChild(document.createTextNode(c.name));

                        //将cityoption添加到select中
                        citySelect.appendChild(cityoption);
                    }
                 }
             };     
        };
    };
</script>

</head>
<body>
<h1>省市联动</h1>
    <select name=province id="pro">
        <option value="">===请选择===</option>
    </select>
    <select name=city id="c">
        <option value="">===请选择===</option>
    </select>
</body>

domain

public class City {
    private int cid;
    private String name;
    private Province province;  //多方关联一方
}

public class Province {
    private int pid;
    private String name;
    private List<City> cityList;  //一方关联多方
}   


猜你喜欢

转载自blog.csdn.net/qq_41307491/article/details/82633897