简体   繁体   English

使用 AJAX 更改先前的选择值后动态更新选择

[英]Dynamically update select after changing previous select value using AJAX

I am aware that this is a recurring question, for all web programming languages.我知道这是一个反复出现的问题,适用于所有网络编程语言。 I have spent five hours trying to apply solutions found here without success, which is why I write this question.我花了五个小时试图应用这里找到的解决方案但没有成功,这就是我写这个问题的原因。

What I want:我想要的是:

  • I have two selectors, both when loading the page are filled with information directly from the database successfully.我有两个选择器,在加载页面时都成功填充了直接来自数据库的信息。

  • If I select an option from the first selector (selectSchraubfall) I want the second selector (selectWorkplace) to update, showing only those possible results for the first selector.如果我从第一个选择器 (selectSchraubfall) 中选择一个选项,我希望第二个选择器 (selectWorkplace) 更新,只显示第一个选择器的那些可能结果。

What I did:我做了什么:

  • Created the selectors inside the jsp getting the information from a servlet that executes a sql query ✔.在 jsp 中创建选择器,从执行 sql 查询的 servlet 获取信息✔。
  • Created the onChange event listener for the first selector ✔.为第一个选择器 ✔ 创建了 onChange 事件侦听器。
  • Created a js function with an Ajax call to make a new query from the controller and get a filtered list of options for the second select ✔.使用 Ajax 调用创建了一个 js 函数,以从控制器进行新查询,并为第二个选择 ✔ 获取过滤的选项列表。
  • Inside the success function I tried to inject the result of the Ajax call into the second select via .html(), it does not work.在成功函数中,我尝试通过 .html() 将 Ajax 调用的结果注入到第二个选择中,但它不起作用。 How can I inject JSTL?如何注入 JSTL? In other words, how can I inject the content of wpFilteredList in selectWorkplace?换句话说,如何在 selectWorkplace 中注入 wpFilteredList 的内容?

What I tried:我试过的:

  • Using JSON -> Didn't work ✕使用 JSON -> 没有用 ✕
  • Using JAVA scriplets inside the JSP -> Didn't work ✕在 JSP 中使用 JAVA 脚本 -> 没有用 ✕

JSP JSP

html: html:

<div class="row">
    <div class="col-md">
        <label style="font-size: 20px;">Schraubfall ID: </label>
        <select id="selectSchraubfall" name="selectSchraubfall" form="formResult" class="form-control" >
            <option>Select ID</option>
            <c:forEach items="${screwdriverlist}" var="screwdriverlist">
                <option><c:out value="${screwdriverlist.screwdriverid}" /></option>
            </c:forEach>
        </select>
    </div>
    <div class="col-md">
        <label style="font-size: 20px;">Workplace: </label>
        <select id="selectWorkplace" name="selectWorkplace" form="formResult" class="form-control">
            <option>Select workplace</option>
            <c:forEach items="${workplaceList}" var="workplaceList">
                <option><c:out value="${workplaceList.workplacename}" /></option>
            </c:forEach>
        </select>
    </div>
</div>

JS: JS:

var options="";
$("#selectSchraubfall").on('change',function(){
    var value=$(this).val();
    resultSelectValue('Schraubfall', value);
});



function resultSelectValue(columnName, value) {
    // Statements
    var params = {};
        params.colname = columnName;
        params.valuecol = value;

    $.ajax({
            type: "GET",
            url: 'ResultSelectValuesController',
            data: params,
            success: function (data) {
                var workplaceArray = [];
                $("#selectWorkplace").empty().html();

                <c:forEach items="${wpFilteredList}" var="wpFilteredList">
                    //<option value="${wpFilteredList.name}"></option>
                    workplaceArray.push('"${wpFilteredList.name}"');
                </c:forEach>

                $("#selectWorkplace").html(workplaceArray); //I know this is not correct but how can I do something similar using the wpFilteredList?

            },
            error : function(ex) {
                swal("Error", "Error loading workplace info " + ex.Message, "error");
            }
        });
}

Java (ResultSelectValuesController) Java (ResultSelectValuesController)

@Override
public void processMethodGET(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        String colname = request.getParameter("colname");
        String valuecol = request.getParameter("valuecol");

        if(colname.contains("Schraubfall")) {
            //GET WORKPLACES
            workplacesfilteredlist = wcdao.workplacesListFilter(colname, valuecol);
            request.setAttribute("wpFilteredList", workplacesfilteredlist);
        }

        request.getRequestDispatcher("/Views/Results/ResultPage.jsp").forward(request, response);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        processError(e, request, response);
    }
}

Below block is JSTL server side interpolation.下面的块是 JSTL 服务器端插值。 Javascript can't process this syntax. Javascript 无法处理此语法。 You need to replace below JSTL code with javascript version which pushes the data from ajax requests response to workplaceArray.您需要将下面的 JSTL 代码替换为 javascript 版本,该版本将 ajax 请求响应中的数据推送到workplaceArray。

                <c:forEach items="${wpFilteredList}" var="wpFilteredList">
                    //<option value="${wpFilteredList.name}"></option>
                    workplaceArray.push('"${wpFilteredList.name}"');
                </c:forEach>

The code below is adds new data to the select element as option elements.下面的代码将新数据作为选项元素添加到 select 元素中。 You need to replace data as your response type.您需要将数据替换为您的响应类型。

data.forEach(workplace => {
    $('#selectWorkplace').append($('<option>', {
       value: workplace,
       text: workplace
    })
})

After the changes you don't need the below code anymore.更改后,您不再需要以下代码。

$("#selectWorkplace").html(workplaceArray);

Finally I solved the problem by myself, It worked using Gson.最后我自己解决了这个问题,它使用 Gson 工作。 Basically I am returning an Array of Arrays and I manipulate the data as I want in the JSP.基本上,我返回一个数组数组,并在 JSP 中根据需要操作数据。

The code now:现在的代码:

JSP JSP

function resultSelectValue(columnName, value) {
// Statements
var params = {};
    params.colname = columnName;
    params.valuecol = value;

$.ajax({
        type: "GET",
        url: 'ResultSelectValuesController',
        data: params,
        success: function (data) {
            $( "#selectWorkplace" ).empty();
            $( "#selectSchraubfall").empty();

            var htmlWorkplace = "<option>Seleccionar Workplace</option>";
            var htmlsf = "<option>Todos los Schraubfalls</option>";
            for (i = 0; i < data.length; i++) {
                for(j = 0; j < data[i].length; j++){
                    alert(data[i][j]);
                    if(i == 0) {
                        htmlWorkplace += "<option>"+data[i][j]+"</option>";
                    }
                    if(i == 1){
                        if(data[i][j] != 'null' &&  data[i][j] != null){
                            htmlsf += "<option>"+data[i][j]+"</option>";
                        }
                    }
                }
            }

            $( "#selectWorkplace" ).html(htmlWorkplace);
            $( "#selectSchraubfall").html(htmlsf);

JAVA爪哇

@Override
public void processMethodGET(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {

        response.setContentType("application/json");
        String colname = request.getParameter("colname");
        String valuecol = request.getParameter("valuecol");

        if(colname.contains("Atornillador")) {

            //GET WORKPLACES
            wpfilteredlist = wcdao.workplacesListFilter(colname, valuecol);

            //GET SF
            sffilteredlist = sfdao.SFListFiltered(colname, valuecol);


            ArrayList<ArrayList<String>> listGet = new ArrayList<ArrayList<String>>();

            ArrayList<String> wpList = new ArrayList<String>();
            ArrayList<String> sfLista = new ArrayList<String>();



            for (int i = 0; i < wpfilteredlist.size(); i++) {
                wpList.add(wpfilteredlist.get(i).getName());
            }

            for(int i = 0; i < sffilteredlist.size(); i++) {
                sfList.add(sffilteredlist.get(i).getSfname());
            }

            listGet.add(wpList);
            listGet.add(sfList);

            Gson gson = new Gson();
            JsonElement element = gson.toJsonTree(listGet);
            PrintWriter out = response.getWriter();
            out.print(element);

        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        processError(e, request, response);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM