带有 servlet 的 jQuery 自动完成 UI 不返回任何数据
Posted
技术标签:
【中文标题】带有 servlet 的 jQuery 自动完成 UI 不返回任何数据【英文标题】:jQuery autocomplete UI with servlet is not returning any data 【发布时间】:2013-09-07 21:11:20 【问题描述】:过去几个小时以来,我一直在摆弄这段代码片段,但我无法理解 jQuery 的自动完成 UI 是如何工作的。我跟着这个教程http://viralpatel.net/blogs/tutorial-create-autocomplete-feature-with-java-jsp-jquery/ 我使用了相同的示例,但我没有向 JSP 发送请求,而是使用了 servlet。请求到达 servlet“Fetcher”,它也执行,但没有返回到页面。这是代码。
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);
[...]
html 中的 javascript 片段:
<script>
$(function()
$( "#tags" ).autocomplete(
source: "Fetcher"
);
);
</script>
HTML 表单:
<label for="tags">Tags: </label>
<input id="tags" />
页面上的示例似乎是为 jquery 中的专业人士编写的,http://jqueryui.com/autocomplete/#default。拜托,有人能告诉我它是如何工作的,以便我可以在其他地方使用它。
【问题讨论】:
您找到的教程显示使用$("#tags").autocomplete("url")
,但您将其用作$("#tags").autocomplete(source:"url")
。如果由于某种原因您的操作与教程不同,您为什么抱怨它不起作用?你应该使用$("#tags").autocomplete("Fetcher")
【参考方案1】:
servlet 应该以 JSON 格式返回自动完成数据。有几个选项,我选择了一个包含具有标签/值属性的对象的数组:
@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));
要返回自动完成数据,您可以使用这个帮助类:
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;
所以在servlet中,真正的数据被映射成适合jQuery自动完成的形式。我已选择 Google GSON 将结果序列化为 JSON。
相关:
Understanding and Implementing Jquery autocomplete with AJAX source and appendTo How do you return a JSON object from a Java Servlet对于 HTML 文档(在 .jsp 中实现),选择正确的库、样式表和样式:
<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>
相关:jQuery autocomplete demo
我已将 Javascript 函数 放在单独的文件中 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);
);
);
);
);
自动完成功能使用 AJAX 请求来调用 servlet。由于 servlet 的结果是合适的,它可以直接用于响应。
相关:
What are the “response” and “request” arguments in jQuery UI Autocomplete's “source” callback? jQuery autocomplete widget jQuery ajax function【讨论】:
谢谢。这对我有帮助:)以上是关于带有 servlet 的 jQuery 自动完成 UI 不返回任何数据的主要内容,如果未能解决你的问题,请参考以下文章