我真的需要使用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的代码:
答案 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之间传递请求中的任何内容以及它的视图,因为视图将在另一个请求中被调用...恕我直言,这里的重定向只是一个快速的解决方法。
什么会更好(根据惯例)
答案 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"); %>