当前位置:首页 > 技术 > 正文内容

JSP实现搜索功能与记住密码功能详解

访客 技术 2026年7月2日 1

搜索功能的实现方案

在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,提升安全性

通过上述实现方式,即可完成搜索功能以及记住密码功能的开发。

标签: JSP

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。