【问题标题】:Autocompletion using Html tags and servlets使用 Html 标签和 servlet 自动完成
【发布时间】:2015-03-27 13:10:51
【问题描述】:

我正在尝试通过从文件中读取文本来进行自动完成。它在波动中运行良好。我想在服务器上运行它。已经使用了 Html 标记和 servlets 它的工作,但是当我按 enter 后输入查询时,它向我显示匹配列表 如果我使用线程或任何 Html 标签进行自动完成,我怎样才能让它自动完成。我对编码没有太多了解。请帮助我 这是我的 servlet 代码

NewServlet.java

public class NewServlet extends HttpServlet {

 public NewServlet() {

    }
 String json;

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

   protected void doGet(HttpServletRequest request, HttpServletResponse  response)
        throws ServletException, IOException {
    response.setContentType("text/html");

    //  response.setContentType("application/json");
    AutoTest1 t = new AutoTest1();
    ArrayList<String> words = new ArrayList<>();
    Trie suggestions = new Trie();
    String fileName =  "C:/Users/USER/Documents/NetBeansProjects/HelloWorld/web/WEB-INF/aol.txt";
    words = t.readWordsFromFile(fileName);
    Trie trie = new Trie();

    for (String word : words) {
        trie.insert(word);
    }
    suggestions = trie;
    try (PrintWriter out = response.getWriter()) {

        Gson gson = new Gson();

        String prefix = request.getParameter("term");

        ArrayList<String> matchingSuggestions = suggestions.getAllPrefixMatches(prefix);

        //final List<AutoCompleteData> result = new ArrayList<AutoCompleteData>();
        for (String suggestion : matchingSuggestions) {
            json = gson.toJson(suggestion);
            // result.add(new AutoCompleteData(suggestion,suggestion));

        }
          response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        //  response.getWriter().write("<option>"+new Gson().toJson(result)+"<option>");      // Write response body.

        response.getWriter().write(json);
       }

    }

  }

自动完成.jsp

<html>
<head>
<script      src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">
 </script>
<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
<script type="text/javascript" src="js/jquery.autocomplete.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$(function() {
        $("#search").autocomplete({     
        source : function(request, response) {
        $.ajax({
                url : "NewServlet",
                type : "GET",
                data : {
                        term : request.term
                },
                dataType : "json",
                success : function(data) {
                        response(data);
                }
             });
            }
          });
       });
    });
    </script>
  </head>
<body>
      <div class="search-container">
            <div class="ui-widget">
            <input type="text" id="search" name="search" class="search" />
            </div>
      </div>
 </body>
 </html>

【问题讨论】:

  • 最好使用 JSP,然后在按键上触发一些 Ajax 调用以获取建议,而不是每次都提交表单。您可以在 JSP 和 JavaScript 中编写所有 HTML 代码来绑定一些事件处理程序来触发调用。
  • 你不必从你的jsp调用java类和方法,你的表单有一些动作NewServlet,所以做一个表单提交将来到同一个servlet或者你可以配置一个不同的url 去不同的一个。你在println() 转义引号中编写你的html代码,而不是费力地在你的jsp中编写你的html,然后使用你的servlet将控制权转发给那个jsp :)
  • 是的,我可以编写单独的 html 并在请求后转到 servlet。只是为了显示我包含在 println() 中的 1 块代码。如果我使用用于自动完成的 datalist 标签,我如何将列表放入 datalist 的选项中。
  • 现在我们正在谈论.. 我想向你建议 datalist :-).. 配置另一个 servlet 并在文本框中按下按键触发 ajax 调用以获取选项标签并替换数据列表内部 html..
  • 您能否提供有关此链接或任何链接或教程的示例代码。

标签: java html servlets autocomplete


【解决方案1】:

您始终可以在 web.xml 中定义一个新的 servlet,并在 AJAX 调用中调用它以返回建议。

如果你使用的是 jQuery,你可以这样做

ma​​in.jsp

<input type="text" list="suggestions" class="inputBox"/>

<datalist id="suggestions">
  <option value=" Loading...">
</datalist>

<script>
    $(document).ready(function(){
      $('.inputBox').on('keyup',function(){
         $.ajax({
            url : 'yourServletAction'
            data : {'query' : $(this).val()}
         }).done(function(data,jqXHR){
             $('#suggestions').html(data);
         });
      }); 
    )};
</script>

doGet() 的服务器端,基于query 参数,您将在 ArrayList 中填充建议并将其保存为这样的请求属性

protected void doGet(HttpServletRequest request, HttpServletResponse   response) throws ServletException,IOException{
        String prefix =request.getParameter("query");
        ArrayList<String> matchingSuggestions =  suggestions.getAllPrefixMatches(prefix);

        request.setAttribute("suggestions",matchingSuggestions);
        RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/suggest.jsp");
        rd.forward(request,response);

    }

现在控件转到suggest.jsp,我们可以使用JSTL(从here 下载)循环列表并发送选项。事实上,您可以使用 Jackson 库将 JSON 发回,但我觉得目前消化太多了

suggest.jsp

<c:forEach items="${suggestions}" var="suggestion">
   <option value="${suggestion}" />
</c:forEach>

这应该给你一些开始:)

【讨论】:

  • 理想情况下,您应该发布一个新问题,解释您所做的工作以及您认为不起作用的代码部分。请这样做并在 cmets 中发布链接,许多其他人会尝试帮助您,而不仅仅是我:-)
  • 您是否检查了开发者工具控制台中是否有任何脚本错误?如果没有错误,请通过检查开发工具中的网络选项卡来检查您的 Ajax 调用是否正在触发
  • Chrome - F12- 开发工具 - 网络选项卡 - 按 XHR 过滤
  • 那么你的 Ajax url 可能是错误的。在“网络”选项卡中单击您的 Ajax 调用,然后在 Headers 部分中查看 Request URL
  • src="js/jquery.autocomplete.js" 中使用相对路径有什么具体原因吗?您使用了其他脚本的完整路径。
猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 2012-10-14
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多