通过在下拉列表中选择数据库列调用 jsp 进行自动建议搜索框

Posted

技术标签:

【中文标题】通过在下拉列表中选择数据库列调用 jsp 进行自动建议搜索框【英文标题】:call jsp for autosuggestion search box by selecting column of database in dropdown list 【发布时间】:2016-07-14 18:10:03 【问题描述】:

我想要一个自动建议搜索框,它可以从数据库中搜索内容。我有一个功能,可以选择用户搜索的哪个列,并提供数据库列的下拉列表。对于一个列,它工作正常。但是当我选择另一列时,它同时搜索第一个选定的列和第二个刚刚选定的列。 我不想这样。让我摆脱它 这是代码。它具有 mvc 设计模式。Index.html

  <script type="text/javascript">
    $(function()
    $("#country").autocomplete("find.me", 
          extraParams: 
            choice: function()  
              return $("#searchby").val();
            
          
        );
);
    </script>
       <div>


 Search By:
  <select name="searchby" id="searchby" >
  <option disabled selected value> -- select an option -- </option>
  <option value="name">Name</option>
  <option value="roll_no">Roll No</option>
  <option value="city">City</option>
      <option value="pin_code">Pin Code</option>
      <option value="state">State</option>
      <option value="country">Country</option>
      </select>
     </div>
        <span class="input input--nariko">

          <input id="country" class="input__field input__field--nariko" type="text" id="input-20" name="country" />
          <label class="input__label input__label--nariko" for="input-20">
            <span class="input__label-content input__label-content--nariko">Type Something</span>
          </label>
        </span>

Servlet 控制器

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    // TODO Auto-generated method stub
    PrintWriter out=response.getWriter();
    String searchBy=request.getParameter("choice");

    String[] arr=new AutoCompleteDao().autoComplete(searchBy);

 request.setAttribute("arr", arr);
    RequestDispatcher requestDispatcher=request.getRequestDispatcher("list.jsp");
    requestDispatcher.forward(request, response);

道类 AutocompleteDao.java 公共类 AutoCompleteDao private static final String DRIVER_NAME="com.mysql.jdbc.Driver"; 私有静态最终字符串 URL="jdbc:mysql://localhost:3306/"; 私有静态最终字符串 DB_NAME="autotest";

private static final String USER_NAME="root";
private static final String PASSWORD="WELcome@123";
Connection connection;


public String[] autoComplete(String searchBy)
    PreparedStatement stmt=null;
    ResultSet resultSet=null;

    String query=null;
    try
        //Register JDBC Driver
        Class.forName(DRIVER_NAME).newInstance();
        //open a connection
        connection=(Connection)DriverManager.getConnection(URL+DB_NAME,USER_NAME,PASSWORD);
          switch(searchBy)
           case "name":
              query= "SELECT name FROM test";
               break;
           case "country":
               query="SELECT country FROM test";
               break;
           

        stmt=(PreparedStatement) connection.prepareStatement(query);

     resultSet= stmt.executeQuery();
       List li = new ArrayList();




       while(resultSet.next())
       
           li.add(resultSet.getString(1));
       


    
    catch(SQLException e)
        e.printStackTrace();
    
    catch(ClassNotFoundException e)
        e.printStackTrace();
    
    catch(InstantiationException e)
        e.printStackTrace();
    
    catch(IllegalAccessException e)
        e.printStackTrace();
    
    finally 
        try
            if(stmt!=null)
                stmt.close();
            if(connection!=null)
                connection.close();
        
        catch(SQLException e)
            e.printStackTrace();
        
    

return li.toArray(new String[li.size()]);

Web.xml

  <servlet>
<servlet-name>AutoCompleteServlet</servlet-name>
  <servletclass>AutoCompleteServlet</servlet-class>
  </servlet>

<servlet-mapping>
  <servlet-name>AutoCompleteServlet</servlet-name>
  <url-pattern>/find.me</url-pattern>
  </servlet-mapping>

还有显示结果的list.jspList.jsp

   <%String[] str=null;
str=(String[])request.getAttribute("arr"); 
if(str!=null)
//jQuery related start
String query = (String)request.getParameter("q");

int cnt=1;
for(int j=0;j<str.length;j++)

    if(str[j].toUpperCase().startsWith(query.toUpperCase()))
    %>

       <%=str[j] %>

<%     

str=null;
//jQuery related end

%>

在这里,当我从下拉列表中选择名称并输入自动建议时,它会在找到匹配项时显示数据库中的名称。但是当我选择国家/地区时。 它显示,即从数据库中建议国家和名称。 我真的不明白为什么?

【问题讨论】:

不,不是。当我第一次选择名称后选择国家时。它显示两个条目@YuliiaChuhui 【参考方案1】:

这一行只运行一次,onload:

$("#country").autocomplete("find.me",extraParams: choice: end );

此时end 是空字符串,它会一直运行到后端并在autoComplete 中的autoComplete 方法中遇到default 情况,它会自动执行按名称填写。

您没有说明您使用的是哪个自动完成插件,但您可能能够执行以下操作:

$("#country").autocomplete("find.me", 
  extraParams: 
    choice: function()  
      return $("#searchby").val();
    
  
);

【讨论】:

先生,当我第一次选择名称时,它会在自动提示框中显示正确的即名称。但是现在当我从下拉菜单中选择国家/地区时,它会非常快速地两次调用 servlet“find.me”跨度> 好的,你说它会默认从后端按名称调用。但是当我下次只选择国家而不从下拉列表菜单中刷新页面时,它会建议名称和国家 反之亦然。第一次选择国家时,它只显示国家。在此之后,当我从下拉列表中选择名称时,它也会显示名称和国家/地区 您可能在AutocompleteDao.java 中遇到线程安全问题,因为str 不是方法局部变量。您可以尝试使用return li.toArray(new String[li.size()]),而不是自己手动将列表转换为数组。 你能用AutocompleteDao.java 的真实代码更新问题吗 - 问题中的当前版本无法编译(DriverManager.getConnection 抛出 SQLException 问题中的版本没有抓住或宣布......)

以上是关于通过在下拉列表中选择数据库列调用 jsp 进行自动建议搜索框的主要内容,如果未能解决你的问题,请参考以下文章

delphi中如何设置DBGridEH第一列为下拉列,并使其控制表格筛选

jsp下拉列框不可编辑,<select></select> ;只能选择下拉框的值,而不能手动去输入值

jsp如何按指定条件进行模糊查询

如何在单独的列中添加排序列名称,而不是在下拉列表中选择列来对表进行排序?

允许在 Rhandsontable 列下拉列表中进行多选

在servlet中怎样获取jsp中下拉列表中的值