在JSP中获取ArrayList时始终得到null变量的问题排查
没问题,我帮你把这个无数据库的书籍搜索功能完整实现出来,分成前端表单、Servlet处理逻辑、结果展示三个部分来做,每个部分都给你写好代码并解释清楚:
实现无数据库的书籍搜索功能(Servlet+JSP)
1. 补全welcome.jsp的表单代码
先把你没写完的表单补全,优化下路径和用户体验:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Book Search</title> </head> <body> <form name="form" method="post" action="ResServlet"> <label for="book">Search for a book</label><br> <input type="text" name="book" id="book" placeholder="Enter book name" required> <br> <input type="submit" value="Search"> </form> </body> </html>
- 把action改成相对路径
ResServlet,不用写全URL,适配不同部署环境 - 加了
placeholder提示用户输入,required确保用户不能空提交 - 设置页面编码为UTF-8,避免中文乱码
2. 实现ResServlet处理搜索逻辑
创建ResServlet类,负责接收搜索请求、比对数据、转发结果:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; @WebServlet("/ResServlet") public class ResServlet extends HttpServlet { // 模拟书籍数据的字符串数组,你可以根据需求修改内容 private static final String[] BOOKS = { "The Great Gatsby", "1984", "To Kill a Mockingbird", "Pride and Prejudice", "哈利·波特与魔法石", "百年孤独" }; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 统一设置字符编码,解决中文乱码问题 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 获取用户输入的搜索关键词,去除前后空格 String searchKeyword = request.getParameter("book").trim(); // 存储匹配到的书籍 List<String> matchedBooks = new ArrayList<>(); // 遍历书籍数组,实现模糊匹配(忽略大小写) for (String book : BOOKS) { if (book.toLowerCase().contains(searchKeyword.toLowerCase())) { matchedBooks.add(book); } } // 将结果和关键词存入request域,转发到结果页面 request.setAttribute("matchedBooks", matchedBooks); request.setAttribute("searchKeyword", searchKeyword); request.getRequestDispatcher("/result.jsp").forward(request, response); } // 兼容GET请求,用户直接访问Servlet也能正常跳转 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
- 用
@WebServlet注解直接配置Servlet路径,不用再写web.xml - 支持中英文模糊搜索,忽略大小写,体验更好
- 通过request域传递数据,转发到结果页面,保持URL不变
3. 实现result.jsp展示搜索结果
创建result.jsp,负责展示匹配到的书籍,或者无结果提示:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Search Results</title> </head> <body> <h2>Search Results for: <strong>${searchKeyword}</strong></h2> <%-- 如果没有匹配结果,提示用户 --%> <c:if test="${empty matchedBooks}"> <p>No books found matching your search.</p> </c:if> <%-- 如果有匹配结果,遍历展示 --%> <c:if test="${not empty matchedBooks}"> <ul> <c:forEach items="${matchedBooks}" var="book"> <li>${book}</li> </c:forEach> </ul> </c:if> <%-- 添加返回搜索页面的链接 --%> <p><a href="welcome.jsp">Back to Search</a></p> </body> </html>
- 用JSTL标签实现逻辑判断和遍历,避免在JSP里写Java代码,更规范
- 清晰展示搜索关键词和结果,无结果时给出明确提示
- 提供返回搜索页面的入口,提升用户体验
额外注意事项
如果你的项目没引入JSTL依赖,需要添加:
- Maven项目可以在pom.xml里加:
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
- 非Maven项目直接下载
jstl.jar和standard.jar放到WEB-INF/lib目录下
内容的提问来源于stack exchange,提问作者Vaaroz
相关产品推荐
相关产品推荐

