我认为上面的标题有点令人困惑。 我想要实现的目标:
我有一个jps页面(位于WEB-INF中),其中有一个超链接,它将通过servlet调用另一个jsp(在WEB-INF中)。
我知道这可以通过以下方式实现:
<a href="ServletName">Go to this page</a>
但是因为会有很多超链接,我的想法是有一个通用的servlet(OpenPagesServlet)来处理所有这些页面。
这样的事情:
JSP页面:
<% request.setAttribute("page", "page1.jsp");%>
<a href="OpenPagesServlet">Page 1</a>
doGet方法中的OpenPagesServlet:
String page = (String) request.getAttribute("page");
request.getRequestDispatcher("/WEB-INF/" + page).forward(request, response);
我尝试了上面的代码,然后得到:
HTTP状态404 - 未找到
输入状态报告
消息未找到
description请求的资源不可用。
但是,如果我尝试使用session.setAttribute / sesion.getAttribute,代码工作正常,但我不希望每次点击超链接时都有会话。
我找到的另一种方法是使用:
<a href="OpenPagesServlet?value=page1">Page 1</a>
并在servlet中:
String page = (String)request.getParameter("value");
request.getRequestDispatcher("/WEB-INF/" + page).forward(request, response);
虽然有效,但这种方法并不好,因为可以使用url直接访问该页面:
http://localhost:8080/WebApp/OpenPagesServlet?value=page1
所以......我的问题是为什么request.setAttribute / request.getAttribute返回404? 是否有不同的方法来实现我想要做的事情?
答案 0 :(得分:3)
HttpServletRequest
及其属性仅在一个HTTP请求/响应周期的持续时间内存在。在您在JSP中设置属性之后,JSP将作为HTTP响应主体的一部分进行呈现和发送。 Servlet容器会考虑处理的请求并清除其属性。该属性现已消失。
因此,在用户点击链接后到达的下一个请求中不再可用。
会话属性或请求参数很好。考虑查看Front Controller pattern。
另外,请考虑使用core
标记库(特别是url
标记)而不是scriptlet来构建链接。