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
相关产品推荐
相关产品推荐

