如何使用response.sendRedirect将参数传递给JSP?

时间:2014-06-25 13:19:21

标签: java jsp servlets

我真的需要使用response.sendRedirect()方法,因为我的JSP(search.jsp)页面实际上正在调用servlet <jsp:include page="/searchServlet" />而在我的searchServlet中如果我使用forward方法(到同一页面)我得到一个奇怪的错误(也许是因为我一直在调用它并转发,我还没找到原因......)但是我需要在JSP中读取一个属性(搜索.jsp)页面上有一条简单的消息,如&#34;请提供有效数据&#34;

但是,由于我使用我的响应重定向到页面,并在我的请求范围中设置此属性,因此当我尝试读取它时,没有任何内容会按预期进行。我试图把这个属性放在我的会话范围,读取然后删除它,它工作(传递错误的数据),但只是第一次,如果我尝试运行它再次正确地提供所有数据我将得到错误消息,因为我关闭了我的浏览器以实际从我的会话中删除它。

所以我的问题是:有一种方法可以使用sendRedirect()并将属性设置到我的JSP页面中吗?如果没有,如何解决这个问题?

谢谢!

编辑1:

searchServlet:

if (errorMessage != null) {
    /*sendError will generate an HTML error page using the message that you supplied and will override the content type to text/html.
    response.sendError(1, errorMessage);    
    */
    request.getSession().setAttribute("errorMessage",errorMessage);
    response.sendRedirect("charts/search.jsp");
}

search.jsp的

<jsp:include page="/searchServlet" /> 
<c:if test="${sessionScope.errorMessage != null}">
    <div id="error-Message">
        <c:out value="${sessionScope.errorMessage}" />
        <c:remove var="errorMessage" scope="session" />
    </div>
</c:if>

编辑2: 如果我使用forward()而不是sendRedirect,我得到的错误,我永远不会停止,继续循环:

at javax.servlet.ServletRequestWrapper.isAsyncStarted(ServletRequestWrapper.java:390)
// the error above repeats for more than a thousand times   

at javax.servlet.ServletRequestWrapper.isAsyncStarted(ServletRequestWrapper.java:390)
at org.apache.catalina.core.ApplicationDispatcher.unwrapRequest(ApplicationDispatcher.java:846)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:822)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:486)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:411)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
at control.SearchCriteriaServlet.doPost(SearchCriteriaServlet.java:99)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:748)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:604)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:543)
at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:954)
at org.apache.jsp.charts.searchChart_jsp._jspService(searchChart_jsp.java:183)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

编辑3:

我的doGet()方法:

ArrayList<Machine> foundMachines = MachineDB.getAllMachines();
request.setAttribute("foundMachineList", foundMachines);
RequestDispatcher rd = request.getRequestDispatcher("/searchServlet");
rd.forward(request, response);

我的doPost()处理所有条目,并在其中包含来自edit1的代码:

5 个答案:

答案 0 :(得分:2)

好的,我得到了你为什么面临这个问题的原因。那是因为无限的呼叫循环。查看您编写的代码。 在您的JSP <jsp:include page="/searchServlet" />中,此行会导致您调用servlet searchServlet,并再次在您向search.JSP发送请求的servlet中调用。所以现在纠正这个问题。

答案 1 :(得分:1)

如您所知,如果您正在进行重定向,则无法在请求中传递属性,因为重定向会导致浏览器发出新请求。因此,您在JSP页面中拥有的请求(对象)将是一个新的 - 而不是您存储该属性的请求(对象)。

您可以在会话中存储属性,但正如您所发现的,如果您不在请求之间重置/删除它们,则可能会导致问题。在会话中存储状态也会导致问题,如果用户使用他们的浏览器&#39;返回&#39;按钮,或一次打开两个或多个选项卡。

您可以使用重定向在请求参数中传递信息 - 例如,通过构造您要重定向到的URL,使其包含参数。 例如blahblah / search?message = whatever

但是,这对用户来说可能看起来很奇怪(他们会在浏览器的地址栏中看到参数),并且您可能会遇到网址变大的问题。

在你的情况下,我会看看为什么前锋不起作用。

答案 2 :(得分:1)

正如mahesh所说,你有一个一般的设计问题:

  • search.jsp包括searchServlet(嗯...)
  • searchServlet转发(或重定向为解决方法)至search.jsp

这种设计非常罕见。当然,在servlet中使用重定向或转发会破坏无限循环,但是servlet会将重定向发送到浏览器,以便浏览器调用视图...当然,您无法在servlet之间传递请求中的任何内容以及它的视图,因为视图将在另一个请求中被调用...恕我直言,这里的重定向只是一个快速的解决方法。

什么会更好(根据惯例)

  • 浏览器最初调用servlet(即:搜索页面的链接指向由servlet直接处理的URL)
  • servlet完成繁重的工作(用java编写,更易于编写和测试)
  • servlet将所有相关参数放入请求并转发到jsp
  • jsp只是简单地格式化将在浏览器中显示的所有html。

答案 3 :(得分:0)

您可以在会话中保留参数。

session.setAttribute("Att1","para1");
session.setAttribute("Att2","para2");
.
.
.
像这样。

答案 4 :(得分:-1)

您可以像这样使用RequestDispatcher: -

     RequestDispatcher rd=request.getRequestDispatcher("result.jsp");
     rd.forward(request,response);

如果您正在使用response.sendRedirect,那么您可以在ServletRequest对象中添加参数,并且可以在jsp.like中使用: -

      <% String st=(String)request.getParameter("uname"); %>
相关问题