AJAX call is not reaching Servlet

时间:2018-03-23 00:19:26

标签: java ajax jsp servlets

I am trying to make a simple textbox which initiate a suggestive feedback based on the characters entered by the user. I am trying to fetch a JSON object from a Servlet but my AJAX call is somehow not reaching the servlet. On checking the status of AJAX request using this.status I am getting error code 404. Can anyone suggest me a solution:

[![enter image description here][1]][1]

Here's my servlet: FetchServ.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        Connection con;
        ResultSet rs;
        java.sql.PreparedStatement pst;

        String ch = request.getParameter("q");
        String data;
        ArrayList<String> list = new ArrayList();

        response.setContentType("application/JSON");
        PrintWriter out = response.getWriter();
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("drivers registered");
            con = DriverManager.getConnection(con_url, userID, password);
            System.out.println("connection created");
            pst = con.prepareStatement("SELECT * FROM candidates where FirstName LIKE ?");
            pst.setString(1, ch + "%");
            rs = pst.executeQuery();
            System.out.println("query executed");
            while(rs.next())
            {
                data = rs.getString("FirstName");
                list.add(data);
            }
        String json = new Gson().toJson(list);
        response.setCharacterEncoding("UTF-8");
        response.getWriter().write(json);
        response.getWriter().append("Served at: ").append(request.getContextPath());
    } catch (SQLException | ClassNotFoundException e) {
        System.err.println(e.getMessage());
    }   
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
}

the jsp code:

    <script>
function suggest(str){
    if(str.length == 0){
        return;
    }else{
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function(){
            document.getElementById("sugg").innerHTML = this.status;
            if(this.readyState == 4 && this.status == 200){
                //var res = JSON.parse(this.responseText);
                document.getElementById("sugg").innerHTML = this.responseText;
            }

        };
        try{
        xmlhttp.open("GET", "com.test.java/FetchServ", true);
        xmlhttp.send();
        }catch(e)
        {
            alert("unable to connect ");
        }
    }
}
</script>
</head>
<body>
<form>
Search:<input type="text" onkeyup = "suggest(this.value)">
</form>
<p id = "sugg"></p>
</body>
</html>

and this is the result I am getting: [![enter image description here][2]][2]

     <display-name>ACtxtbox</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
 <servlet>
        <servlet-name>FetchServ</servlet-name>
        <servlet-class>com.test.java/FetchServ</servlet-class>
  </servlet>
  <servlet-mapping>
        <servlet-name>FetchServ</servlet-name>
        <url-pattern>/FetchServ</url-pattern>
  </servlet-mapping>
</web-app>

1 个答案:

答案 0 :(得分:0)

您的 Web.xml 条目不正确,请检查您在urlbar中使用的网址以及使用xmlhttp.open("GET", "fetch", true);提交的表单,您可以将作为请求传递的实际网址调试到服务器打开developer tools并导航到network tab,它将如下所示。enter image description here

您的<servlet-class>ACtxtbox/FetchServ</servlet-class>也不正确,它应该与包裹路径类似<servlet-class>sompackagepath.FetchServ</servlet-class>

修改

根据您的图片,我可以看到您已声明index.jsp,只需提供网址http://localhost:<port_number>/ACtxtbox/index.jsp即可访问。

现在您应该注意以下几点:

  1. 当您使用ajax调用调用servlet时,您已经给出了 您javascript fetch中此代码行中的 xmlhttp.open("GET", "fetch", true);参数因此现在正在更改您的 url to http://localhost:<port_number>/ACtxtbox/fetch
  2. 你的web.xml条目应该是这样的
  3. <servlet>
      <servlet-name>FetchServ</servlet-name>
      <servlet-class>com.rishal.test.FetchServ</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>FetchServ</servlet-name>
      <url-pattern>/fetch</url-pattern>
    </servlet-mapping>

    1. 你的网址模式是怎样的 http://localhost:<port_number>/ACtxtbox/com.test.java/fetch?是 你已经修改了web.xml条目。请阅读教程 谷歌关于Web应用程序,jsp,servlets和ajax调用。您 还应注意,您必须在下面创建servlet课程 我在web.xml条目中给出的一些package com.rishal.test其包路径和类位于此包中 路径。
    2. package com.rishal.test;
      public class FetchServ extends HttpServlet {
      ----------------------
      ---------------------------
      }