使用ajax从servlet填充下拉列表

时间:2013-05-13 10:52:52

标签: java javascript html ajax jsp

我需要使用ajax从数据库填充下拉,Iam使用两个下拉列表,如果第一个下拉值被选中第二个下拉值(必须根据第一个下拉列表中选择的值从DB中检索) )必须要显示。 DAO(数据访问层)返回4个结果作为arraylist对象,但在http responsetext中它打印为对象而不是值。我尝试使用for循环迭代它但我无法实现它。请帮助我。

HTML代码:

    // First Drop Down
    Question Field :<select name="ddlAddQuestionField" id='ddlAddQuestionField' onchange="getFieldPosition()">
        <option value=''>Select Question Field</option>
        <option value='Security Question'>Security Question</option>
        <option value='Personal Info'>Personal Info</option>
    </select>

    // Second DropDown

    User Field Position:<select name="userFieldPosition" id="userFieldPosition" disabled="disabled"> </select>

Javascript代码

function getFieldPosition(){

                    var fieldName =$("#ddlAddQuestionField").val();

                    if(window.XMLHttpRequest){
                        xmlhttp=new XMLHttpRequest();
                    } else {
                        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    xmlhttp.onreadystatechange=function() {

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

                            document.getElementById("userFieldPosition").disabled=false;                            
                            alert(xmlhttp.responseText);
                            var response =xmlhttp.responseText;

                            for(var i=0;i<response.length;i++) {
                                var elements = "<option value='"+response[i]+"'>"+response[i]+"</option>";
                                $("#userFieldPosition").append(elements);
                            }
                        }
                      }
                        xmlhttp.open("POST","ApplicationController",true);
                        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
                        xmlhttp.send("fieldAction=fieldPosition&fieldName="+fieldName);
                }

服务代码

fieldPositionObj = fieldPositionDaoObj.getFieldPosition(fieldName);   //Hitting the Dao

              // In dao it returns arraylist object.     

            response.setContentType("text/plain");  
                response.setCharacterEncoding("UTF-8"); 
                response.getWriter().write(fieldPositionDaoObj);

3 个答案:

答案 0 :(得分:2)

你的问题是行

 response.getWriter().write(fieldPositionDaoObj);

你正在直接在响应上编写java Obejct ..我认为fieldPositionDaoObj是list或aray ..所以toString Representation是

(com.bean.QuestionInfoBean@23d275, com.bean.QuestionInfoBean@1ce15f6, com.bean.QuestionInfoBean@103fcaa, com.bean.QuestionInfoBean@c135d6) 

其中com.bean.QuestionInfoBean@c135d6是Java对象的字符串表示。

我认为你需要返回那里有 JSON 代表Java对象/列表/数组,你的代码才能运行

  

JSON(JavaScript Object Notation),是一种简单易读的数据交换格式。它在全球无数项目中很受欢迎并且实现,对于那些不喜欢XML的人来说,JSON是一个非常好的替代解决方案。

您的JSON表示应该看起来像

  

[First,Middle,Full,Last]

  

[{首先},{中东},{全},{最后}]

您可以编写自己的方法,例如public String getJSOnRepresentation();

然后再做

response.getWriter().write(fieldPositionDaoObj.getJSOnRepresentation());

<强> Sample example on What and how to code

另见

http://json.org/java/ https://github.com/douglascrockford/JSON-java/blob/master/JSONString.java https://github.com/douglascrockford/JSON-java/blob/master/JSONArray.java https://github.com/douglascrockford/JSON-java/blob/master/JSONObject.java

答案 1 :(得分:0)

我尝试了下面提到的代码,现在工作正常。

JAVA SCRIPT:

  if(xmlhttp.readyState==4 && xmlhttp.status==200){
        document.getElementById("userFieldPosition").disabled=false;                            
        var response = JSON.parse(xmlhttp.responseText);
        for(var i=0;i<response.length;i++){
            elements  += "<option value='"+response[i].fieldPosition+"'>"+response[i].fieldPosition+"</option>";
        }
        $("#userFieldPosition").append(elements);
        }
}

<强>小服务程序:

 Gson gson = new Gson();
 String json = new Gson().toJson(fieldPositionObj);
 response.getWriter().print(json);

答案 2 :(得分:-1)

某些框架(例如ExtJs)允许您使用大量代码执行此操作。我能想到这样做的唯一方法是将第二个下拉框放在div标记内。在选择第一个下拉框时,调用一个将发出ajax请求的函数。获得success回复后,通过创建包含这些值的新下拉框,重写div的内容。