• 三 级城市,部门,员工,列表联动的问题解决,获取列表的被选中option对象问题


    需求:建立3级列表联动 城市->部门->员工   点击员工弹出员工具体的信息表

    思路:

    1.首先因为是3级,所以需要在数据库内建立3张表格,而且注意要“级联”哦。因为要通过外键,来知道第一个表的所对应的部门
    2.建立每个表相对应的javaBean。
    3.写一个Dao类来完成城市数据的导入。
    具体代码如下
     
    public class SelectDao {
     
    private Connection conn=null;
    private Statement statement=null;
    public List getLocationds(String sql){
    Locations loca=null;
    List listLocations=null;
    try {
    conn=ConnectionUtil.getConnection();
    //sql语句查询出数据
    //String sql="select * from locations";
    //获得查询是否有结果得到的集合 
    statement=conn.createStatement();
    ResultSet rs=statement.executeQuery(sql);
    //创建一个用于存储数据locations的集合
    listLocations=new ArrayList();
    System.out.println("aa");
    while(rs.next()){
    //
    loca=new Locations();
    loca.setCity_name(rs.getString("city_name"));
    loca.setLocations_id((rs.getInt("locations_id")));
    System.out.println(loca.getLocations_id());
    System.out.println(loca.getCity_name());
    //将存储的对象加入集合当中
    listLocations.add(loca);
    }
    //释放此ReslutSet对象的数据库和jdbc资源
    rs.close();
    //释放PreparedStatement对象的数据库和jdbc资源
    statement.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }finally{
    //关闭数据库链接
    ConnectionUtil.closeConnection(conn);
    }
    return listLocations;
    }
    ConnectionUtil是我写的数据库链接工具类
    这个方法返回的是存储着城市对象的集合
     
    4.编写一个视图层 写一个jsp页面
    具体的代码如下,这里是我3级联动前端全部的代码我没有裁减
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>My JSP 'select.jsp' starting page</title>
    <script type="text/javascript" src="${pageContext.request.contextPath}/scripts/jquery-3.2.0.js"></script>
    <script type="text/javascript" src="${pageContext.request.contextPath}/scripts/jquery.blockUI.js"></script>
    <script type="text/javascript">
    $(document).ajaxStart(function(){$.blockUI({
    message:$('#loading'),
    css:{
    top: ($(window).height()-400)/2+'px',
    left:($(window).width()-400)/2+'px',
    '400px',
    border:'none'
    },
    overlayCSS:{
    backgroundColor:'#fff'
    }
    })}).ajaxStop($.unblockUI);
    /*
    1.导入jquery库
    2.获取选择框,给框添加onchange事件
    3.首先一开始要判断select里是否含有option,因为如果你已经选了其他的再进去选得时候原来选得不会没有,还会在那里,所以
    就要判断一开始那个省的选择框是否为空,如果为空说明选的是“请选择”,不发送ajax请求
    4.准备发送json请求,url,args
    5.服务器发回来的肯定是json数组,一开始还要进行判断,因为有可能没有部门。如果没有部门就进行弹出框 
    6.得到你要输出的select的id进行输出 
    */
    $(function(){
    /*sheng dao city start */
    $('#sheng').change(function(){
    //判断城市是否为空,清空城市的原来所选的
    $('#city option:not(:first)').remove();
    //alert("a");
    //this指代你所选的那个框
    var sheng=$(this).val();
    if(sheng!=""){
    var url="LocationsServlet?method=departmentslist";
    var args={"locations_id":sheng,"time":new Date()};
    $.getJSON(url,args,function(data){
    //判断是否有部门,由于返回的是数组所以有长度
    if(data.length==0){
    alert("这个省份没有城市");
    }
    //遍历这个数组咯
    for(var i=0;i<data.length;i++){
    var depart_name=data[i].depart_name;
    var depart_id=data[i].depart_id;
    $('#city').append("<option value='"+depart_id+"'>"+depart_name+"</option>")
    }
    });
    }
    });
    /* end sheng to city */
    
    /* city to area start */
    /* 
    1.给城市添加onchange事件
    2.去除出第一个以外的所有的,之前选的
    3.判断选择的是否为空如果为空则说明“请选择”,则不发送ajax请求;
    4.如果不为空则发送ajax请求
    5.url LocationsServlet?method=employeeslist
    6.args depart_id time
    7.返回的是一个json数组
    8.有可能没有地方所以进行判断
    9.给select添加option
    10.给地方添加onchange事件
    11.给表格添加选中的地方的数据 
    */
    $('#city').change(function(){
    //去除选中的数据除第一行外
    $('#area option:not(:first)').remove();
    //得到option对象的值
    var city=$(this).val();
    alert(this.innerHTML);
    //alert("aa")
    if(city!=""){
    var url="LocationsServlet?method=employeeslist";
    var args={"depart_id":city,"time":new Date()};
    $.getJSON(url,args,function(data){
    //判断是否有地方
    if(data.length==0){
    alert("这个城市没有这个地方");
    }
    else{
    //遍历这个数组
    for(var i=0;i<data.length;i++){
    var em_id=data[i].em_id;
    var em_name=data[i].em_name;
    var em_age=data[i].em_age;
    //为了实现下面通过id获取name和age等属性值
    
    //alert($(this).className);
    //得到你要输出的对象
    var opNode=document.createElement("option");
    //$('#area').append("<option value='"+em_id+"'>"+em_name+"</option>");
    //为当前对象设置属性值
    opNode.value=em_id;
    opNode.appendChild(document.createTextNode(em_name));
    //alert(opNode.className);
    var tableNode=document.getElementById("area");
    tableNode.appendChild(opNode);
    $(opNode).attr("em_id",em_id);
    $(opNode).attr("em_name",em_name);
    $(opNode).attr("em_age", em_age);
    //给地方添加change事件
    //alert($(opNode).attr("em_id"));
    
    }
    
    //通过option在select的角标和data的角标
    //获取#area节点
    /* var areaNode=document.getElementById("area");
    var optionNodes=areaNode.getElementsByTagName("option");
    //遍历这个数组
    alert("aa");
    for(var i;i<optionNodes.length;i++){
    $(function(){
    //给每一个option添加change事件
    $(optionNodes[i]).click(function(){
    alert("a");
    $('#table tr:not(:first)').remove();
    $('#table').append("<tr><td>" + $(optionNodes[i]).attr("em_id") + "</td><td>" + $(optionNodes[i]).attr("em_name") + "</td><td>" + $(optionNodes[i]).attr("em_age") + "</td></tr>");
    $('#table').show();
    });
    });
    } */
    $('#area').change(function() {
    //清空之前选的数据
    $('#table tr:not(:first)').remove();
    $('#table').show();
    alert($(this).val());
    alert(this.selectedIndex);
    //alert($(this).attr("em_id"));
    //alert((this.options[this.selectedIndex]).);
    alert(this.innerHTML);
    $('#table').append("<tr><td>" + $(this.options[this.selectedIndex]).attr("em_id") + "</td><td>" + $(this.options[this.selectedIndex]).attr("em_name") + "</td><td>" + $(this.options[this.selectedIndex]).attr("em_age") + "</td></tr>");
    });
    
    }
    });
    }
    });
    /* end city to area */
    });
    </script>
    </head>
    
    <body>
    <img alt="" src="images/1.gif" style="display:none" id="loading">
    <div>
    <%-- <jsp:useBean id="is" class="com.jdztc.ajax.javabean.Locations"></jsp:useBean> --%>
    <span>我大中国的省:</span>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <select id="sheng">
    <option value="">请选择...</option>
    <c:forEach items="${locations}" var="location">
    <option value="${location.locations_id}">${location.city_name}</option>
    </c:forEach>
    </select>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <span>城市名:</span>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <select id="city">
    <option value="">请选择...</option>
    </select>
    
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <span>地方:</span>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <select id="area">
    <option value="">请选择...</option>
    </select>
    <br/>
    <table style="display:none" id="table" border="1px solid" height="50px" width="150px" align="center">
    <th colspan="3">difang</th>
    
    </table>
    </div>
    </body>
    </html>

    5.编写一个导入城市数据的servlet控制层 

    这个servlet实现了一个servlet处理多个请求,发送多个响应的功能,通过在url后面添加数据的形式实现

    这里还用到了反射,思想和具体的代码如下

    package com.jdztc.ajax.servlet;
    
    import java.io.IOException;
    import java.lang.reflect.Method;
    import java.util.List;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.jdztc.ajax.dao.SelectDao;
    import com.jdztc.ajax.javabean.Departments;
    import com.jdztc.ajax.javabean.Employees;
    import com.jdztc.ajax.javabean.Locations;
    
    /**
    * 一个servlet处理多个请求不必要每个请求进行写一个servlet这样不能体现代码的复用性;
    *所以在servlet中建立处理的方法然后根据反射进行调用
    *对各个功能进行封装
    * @author 付鹏鹏
    *
    */
    public class LocationsServlet extends HttpServlet{
    
    private SelectDao sd=new SelectDao();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doPost(req,resp);
    }
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // TODO Auto-generated method stub
    /**
    * 通过反射进行调用locationlist方法;
    * 反射机制:首先的得得到方法名
    * 2.在通过类文件得到方法区,
    * 3.调用这个方法
    */
    //得到方法名
    String methodname=req.getParameter("method");
    //得到类文件中的方法区中的对象
    try {
    Method method=getClass().getDeclaredMethod(methodname,HttpServletRequest.class,HttpServletResponse.class);
    //这个方法o指代发送请求的那个请求想要调用哪个方法的对象,指当前进入这个post请求的对象(这个类的新实例)
    /*Object o=getClass().newInstance();
    method.invoke(o,req,resp);*/
    method.invoke(this,req,resp);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    protected void locationslist(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
    //设置req和resp的编码格式
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    //
    //获取存取数据的集合实例化Dao
    //sql语句
    String sql="select * from locations";
    List<Locations> locations=sd.getLocationds(sql);
    /*    for(int i=0;i<locations.size();i++){
    System.out.println("get"+locations.get(i).getCity_name());
    } */ 
    //设置locations属性
    req.getSession().setAttribute("locations", locations);
    //将消息转发送至select.jsp页面
    req.getRequestDispatcher("/app3/select.jsp").forward(req, resp);
    }
    protected void departmentslist(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
    // 设置req和resp的编码格式
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    //得到对应省份的id
    int locations_id=Integer.parseInt(req.getParameter("locations_id"));
    System.out.println(locations_id);
    String sql="select * from departments where location_id=?";
    List<Departments> listdepart=sd.getdepartments(sql,locations_id);
    System.out.println("listdepart集合:"+listdepart);
    //引用jackson插件使集合成json对象数组
    ObjectMapper mo=new ObjectMapper();
    String result=mo.writeValueAsString(listdepart);
    //将结果输出
    System.out.println(result);
    resp.getWriter().println(result);
    }
    protected void employeeslist(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
    // 设置req和resp的编码格式
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    //得到depart_id
    int depart_id=Integer.parseInt(req.getParameter("depart_id"));
    String sql="select * from employees where depart_id=?";
    //得到从数据库中返回的数据
    List<Employees> listemployee=sd.getemployees(sql,depart_id);
    //使用jackson插件使集合生成json对象数组
    ObjectMapper om=new ObjectMapper();
    String result=om.writeValueAsString(listemployee);
    //将结果发出
    resp.getWriter().println(result);
    }
    @Override
    public void init(ServletConfig config) throws ServletException {
    // TODO Auto-generated method stub
    super.init(config);
    }
    
    
    }

    7.城市到部门

    导入数据和方式一样,这里主要讲一下jsp脚本的思路

    .给城市添加onchange事件
    2.去除出第一个以外的所有的,之前选的
    3.判断选择的是否为空如果为空则说明“请选择”,则不发送ajax请求;
    4.如果不为空则发送ajax请求
    5.url LocationsServlet?method=employeeslist
    6.args depart_id time
    7.返回的是一个json数组
    8.有可能没有地方(这里指员工)所以进行判断
    9.给select添加option
    10.给地方添加onchange事件
    11.给表格添加选中的地方的数据 

    思路是一样的。

    实现功能

    点击option弹出员工的具体信息表

    给表添加onchange事件

    注意在onchange事件当中的当前对象不是你选中的option而是option的集合

    所以需要通过这样$(this.options[this.selectedIndex])才能得到你选中的option对象

    之前的“em_id”属性已经设置

    具体的代码如下

    $('#area').change(function() {
    //清空之前选的数据
    $('#table tr:not(:first)').remove();
    $('#table').show();
    alert($(this).val());
    alert(this.selectedIndex);
    //alert($(this).attr("em_id"));
    //alert((this.options[this.selectedIndex]).);
    alert(this.innerHTML);
    $('#table').append("<tr><td>" + $(this.options[this.selectedIndex]).attr("em_id") + "</td><td>" + $(this.options[this.selectedIndex]).attr("em_name") + "</td><td>" + $(this.options[this.selectedIndex]).attr("em_age") + "</td></tr>");
    });


  • 相关阅读:
    {C#}{GDI+}各种C#,GDI+的资料
    {Reship}{C#}{GDI+}GDI+画笔,线,区域类型
    {VS2010C#}{WinForm}{ActiveX}VS2010C#开发基于WinForm的ActiveX控件
    {matlab}取二值图像centroid几种方法性能比较
    {vlFeat}{Matlab}Linux中matlab的vlFeat配置
    {Links}{Matting}{Saliency Detection}{Superpixel}Source links
    {Reship}{Matting}Image Matting
    javascript中的装箱和拆箱操作
    javascript中的垃圾回收
    javascript中的类方法、构造方法、原型方法的对比
  • 原文地址:https://www.cnblogs.com/fupengpeng/p/6652756.html
Copyright © 2020-2023  润新知