You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:48:24