JSP实现搜索功能与记住密码功能详解
搜索功能的实现方案
在Web应用开发中,搜索功能是极为常见的需求。根据搜索方式的不同,主要分为精确匹配搜索和模糊匹配搜索两种实现方式。精确搜索用于查找与输入值完全一致的数据记录,通常基于主键或唯一标识字段进行查询;模糊搜索则通过模式匹配返回所有符合条件的记录,能够有效提升用户体验。本文将详细介绍这两种搜索方式的实现方法。
精确匹配搜索实现
精确搜索的核心在于SQL语句使用等号(=)进行完全匹配。以下是实现精确搜索的数据访问方法:
public Student findByStudentName(String studentName) {
Student stu = null;
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = DBUtil.getConnection();
String sql = "SELECT * FROM student_info WHERE student_name = ?";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, studentName);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
stu = new Student();
stu.setStudentId(resultSet.getInt("id"));
stu.setStudentName(resultSet.getString("student_name"));
stu.setGender(resultSet.getInt("gender"));
stu.setAge(resultSet.getInt("age"));
stu.setAddress(resultSet.getString("address"));
stu.setInstitution(resultSet.getString("institution"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(resultSet, preparedStatement, connection);
}
return stu;
}模糊匹配搜索实现
模糊搜索利用SQL的LIKE关键字结合通配符实现模式匹配。通配符百分号(%)代表任意多个字符,以下是具体实现:
public List<Student> searchByStudentName(String studentName) {
List<Student> studentList = new ArrayList<Student>();
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
connection = DBUtil.getConnection();
String sql = "SELECT * FROM student_info WHERE student_name LIKE ?";
preparedStatement = connection.prepareStatement(sql);
// 前后都加通配符,实现包含匹配
preparedStatement.setString(1, "%" + studentName + "%");
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
Student stu = new Student();
stu.setStudentId(resultSet.getInt("id"));
stu.setStudentName(resultSet.getString("student_name"));
stu.setGender(resultSet.getInt("gender"));
stu.setAge(resultSet.getInt("age"));
stu.setAddress(resultSet.getString("address"));
stu.setInstitution(resultSet.getString("institution"));
studentList.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBUtil.close(resultSet, preparedStatement, connection);
}
return studentList;
}搜索请求处理Servlet
下面创建一个Servlet来统一处理搜索请求,根据不同的参数调用相应的搜索方法:
public class SearchServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
StudentService studentService = new StudentServiceImpl();
// 处理精确搜索请求
String exactSearch = request.getParameter("exactSearch");
if (exactSearch != null && !exactSearch.trim().isEmpty()) {
Student student = studentService.findByStudentName(exactSearch);
if (student != null && student.getStudentName() != null) {
request.setAttribute("searchResult", student);
request.getRequestDispatcher("/WEB-INF/views/exactResult.jsp")
.forward(request, response);
} else {
List<Student> allStudents = studentService.getAllStudents();
request.setAttribute("studentList", allStudents);
request.setAttribute("errorMsg", "未找到学生:" + exactSearch);
request.getRequestDispatcher("/WEB-INF/views/allStudents.jsp")
.forward(request, response);
}
return;
}
// 处理模糊搜索请求
String fuzzySearch = request.getParameter("fuzzySearch");
if (fuzzySearch != null && !fuzzySearch.trim().isEmpty()) {
List<Student> matchedList = studentService.searchByStudentName(fuzzySearch);
if (!matchedList.isEmpty()) {
request.setAttribute("studentList", matchedList);
request.getRequestDispatcher("/WEB-INF/views/fuzzyResult.jsp")
.forward(request, response);
} else {
List<Student> allStudents = studentService.getAllStudents();
request.setAttribute("studentList", allStudents);
request.setAttribute("errorMsg", "关键字【" + fuzzySearch + "】无匹配结果");
request.getRequestDispatcher("/WEB-INF/views/allStudents.jsp")
.forward(request, response);
}
}
}
}记住密码功能实现
许多Web应用提供"记住我"功能,使用户在下次访问时无需重新输入用户名和密码。这一功能通过浏览器Cookie实现,服务器将用户凭证以Cookie形式存储在客户端浏览器中。
写入Cookie数据
当用户登录成功后,将用户名和密码保存到Cookie中。需要设置Cookie的有效期,单位为秒:
// 创建用户名Cookie,有效期设置为7天
Cookie usernameCookie = new Cookie("rememberedUsername", username);
usernameCookie.setMaxAge(60 * 60 * 24 * 7); // 7天有效期
usernameCookie.setPath("/");
response.addCookie(usernameCookie);
// 创建密码Cookie
Cookie passwordCookie = new Cookie("rememberedPassword", password);
passwordCookie.setMaxAge(60 * 60 * 24 * 7); // 7天有效期
passwordCookie.setPath("/");
response.addCookie(passwordCookie);读取Cookie数据
在登录页面通过EL表达式直接读取Cookie中存储的值,自动填充到表单输入框:
<tr>
<td>用户名:</td>
<td><input type="text" name="username"
value="${cookie.rememberedUsername.value}" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"
value="${cookie.rememberedPassword.value}" /></td>
</tr>
<tr>
<td colspan="2">
<input type="checkbox" name="rememberMe" />记住密码
</td>
</tr>注意事项
- 实际生产环境中,不建议明文存储密码,应对密码进行加密处理后再存入Cookie
- Cookie的有效期应根据应用的安全级别合理设置
- 使用HttpOnly属性可防止JavaScript脚本访问Cookie,提升安全性
通过上述实现方式,即可完成搜索功能以及记住密码功能的开发。