通过在下拉列表中选择数据库列调用 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> ;只能选择下拉框的值,而不能手动去输入值