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

Jakarta EE 9+JSF 3.0中Servlet页面跳转传值异常求助

问题解决步骤

1. 修正跳转链接,确保请求先经过Servlet

<h:link>的outcome属性是JSF导航规则标识,默认会直接映射到同名.xhtml页面,导致请求跳过Servlet直接访问result.xhtml。修改链接直接指向Servlet路径:

<h:link value="Place an order" href="#{request.contextPath}/result" />

点击该链接时会发送GET请求到/result,触发Servlet处理逻辑。

2. 保持Servlet的URL映射避免请求循环

不要将Servlet的urlPatterns设为/result.xhtml,否则Servlet处理请求后转发到result.xhtml时会再次被自身拦截,造成无限循环。维持原映射即可:

@WebServlet(name = "result", urlPatterns = "/result")

3. 确保JSF页面正确读取Request属性

JSF的EL表达式默认会在requestScope中查找变量,显式指定作用域可避免潜在命名冲突,修改result.xhtml的循环代码:

<c:forEach items="#{requestScope.menuItems}" var="menuItem">
    <li>#{menuItem.name} <!-- 替换为MenuItem的具体属性,如name/price,避免直接输出对象哈希码 -->
        <h:inputText id="item_#{menuItem.id}" />
    </li>
</c:forEach>

4. 规范Servlet的请求处理方法

service()方法会处理所有HTTP请求类型,这里只需处理GET请求,重写doGet()更符合规范:

@WebServlet(name = "result", urlPatterns = "/result")
public class OrderServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        MenuDao menuDao = MenuDaoFactory.getMenuDao();
        List<MenuItem> menuItems = menuDao.getFullMenu();
        
        // 避免空指针,初始化空列表
        if (menuItems == null) {
            menuItems = new ArrayList<>();
        }
        
        request.setAttribute("menuItems", menuItems);
        request.getRequestDispatcher("/result.xhtml").forward(request, response);
    }
}

额外注意

  • 检查MenuDao是否正确初始化并返回有效数据,确保menuItems不为空
  • 若直接访问/result.xhtml(不经过Servlet),页面会因缺少menuItems报错,可添加空判断:
    <c:if test="#{not empty requestScope.menuItems}">
        <ul>
            <c:forEach items="#{requestScope.menuItems}" var="menuItem">
                <!-- 循环内容 -->
            </c:forEach>
        </ul>
    </c:if>
    

内容的提问来源于stack exchange,提问作者nora nora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:30:56