如何在带有超链接的jsp页面中设置属性(请求范围)

时间:2014-04-08 19:27:10

标签: java jsp servlets hyperlink

我认为上面的标题有点令人困惑。 我想要实现的目标:

我有一个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? 是否有不同的方法来实现我想要做的事情?

1 个答案:

答案 0 :(得分:3)

HttpServletRequest及其属性仅在一个HTTP请求/响应周期的持续时间内存在。在您在JSP中设置属性之后,JSP将作为HTTP响应主体的一部分进行呈现和发送。 Servlet容器会考虑处理的请求并清除其属性。该属性现已消失。

因此,在用户点击链接后到达的下一个请求中不再可用。

会话属性或请求参数很好。考虑查看Front Controller pattern

另外,请考虑使用core标记库(特别是url标记)而不是scriptlet来构建链接。