jQuery autocomplete UI with servlet is not returning any data

I have been fiddling with this code fragment from past few hours but I am unable to understand how jQuery's autocomplete UI works. I followed this tutorial http://viralpatel.net/blogs/tutorial-create-autocomplete-feature-with-java-jsp-jquery/ I used same example but instead of sending request to a JSP, I used a servlet. The request reaches the servlet "Fetcher", it executes as well but nothing is returned to the page. Here's the code.

public class Fetcher extends HttpServlet {
    [...]

    List<String> countryList = new ArrayList<String>();
    String param = request.getParameter("term");

    countryList.add("USA");
    countryList.add("Pakistan");
    countryList.add("Britain");
    countryList.add("India");
    countryList.add("Italy");
    countryList.add("Ireland");
    countryList.add("Bangladesh");
    countryList.add("Brazil");
    countryList.add("United Arab Emirates");
    PrintWriter out = response.getWriter();
    response.setContentType("text/plain");
    response.setHeader("Cache-Control", "no-cache");
     for(String country : countryList){
        out.println(country);
    }

    [...]
}

Javascript fragment in HTML:

 <script>
       $(function() {

         $( "#tags" ).autocomplete({
          source: "Fetcher"

      });
 });
 </script>

HTML form:

 <label for="tags">Tags: </label>
 <input id="tags" />

The examples on the page seems written for a pro in jquery, http://jqueryui.com/autocomplete/#default . Please, could someone tell how exactly it works, so that I can use it in other places.


The servlet should return the autocomplete data as JSON. There a several options, I have opted for an array which contains an object with label/value properties:

@WebServlet("/autocomplete/*")
public class AutoCompleteServlet extends HttpServlet {
    @Override
    protected void doPost(final HttpServletRequest request,
            final HttpServletResponse response) throws ServletException,
            IOException {

        final List<String> countryList = new ArrayList<String>();
        countryList.add("USA");
        countryList.add("Pakistan");
        countryList.add("Britain");
        countryList.add("India");
        countryList.add("Italy");
        countryList.add("Ireland");
        countryList.add("Bangladesh");
        countryList.add("Brazil");
        countryList.add("United Arab Emirates");
        Collections.sort(countryList);

        // Map real data into JSON

        response.setContentType("application/json");

        final String param = request.getParameter("term");
        final List<AutoCompleteData> result = new ArrayList<AutoCompleteData>();
        for (final String country : countryList) {
            if (country.toLowerCase().startsWith(param.toLowerCase())) {
                result.add(new AutoCompleteData(country, country));
            }
        }
        response.getWriter().write(new Gson().toJson(result));
    }
}

to return the autocomplete data, you could use this helper class:

class AutoCompleteData {
    private final String label;
    private final String value;

    public AutoCompleteData(String _label, String _value) {
        super();
        this.label = _label;
        this.value = _value;
    }

    public final String getLabel() {
        return this.label;
    }

    public final String getValue() {
        return this.value;
    }
}

so in the servlet, the real data is mapped into a form suitable for jQuery's autocomplete. I have selected Google GSON to serialize the result as JSON.

Related:

  • Understanding and Implementing Jquery autocomplete with AJAX source and appendTo
  • How do you return a JSON object from a Java Servlet

  • As for the HTML document (implemented in a .jsp), pick the correct libraries, stylesheets and styles:

    <html>
        <head>
            <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.js"> </script>
            <script type="text/javascript" src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"> </script>
            <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" />
    
            <script type="text/javascript" src="autoComplete.js"> </script>
        </head>
    
        <body>
            <form>
                <div class="ui-widget">
                    <label for="country">Country: </label>
                    <input id="country" />
                </div>
            </form>
        </body>
    </html>
    

    Related: jQuery autocomplete demo


    I have put the Javascript functions in a separate file autoComplete.js :

    $(document).ready(function() {
        $(function() {
            $("#country").autocomplete({
                source: function(request, response) {
                    $.ajax({
                        url: "/your_webapp_context_here/autocomplete/",
                        type: "POST",
                        data: { term: request.term },
    
                        dataType: "json",
    
                        success: function(data) {
                            response(data);
                        }
                   });              
                }   
            });
        });
    });
    

    The autocomplete function uses an AJAX request to call the servlet. As the result of the servlet is suitable, it can be used as-is for the response.

    Related:

  • What are the “response” and “request” arguments in jQuery UI Autocomplete's “source” callback?
  • jQuery autocomplete widget
  • jQuery ajax function
  • 链接地址: http://www.djcxy.com/p/46068.html

    上一篇: 将数据从servlet发送到小程序:我如何实现这一点?

    下一篇: 使用servlet的jQuery自动完成UI不会返回任何数据