簡體   English   中英

如何使用response.sendRedirect將參數傳遞給JSP?

[英]How to pass parameters to JSP using response.sendRedirect?

我真的需要使用response.sendRedirect()方法,因為我的JSP(search.jsp)頁面實際上正在調用servlet <jsp:include page="/searchServlet" />並在searchServlet調用(如果我使用forward方法(同一頁)我收到一個奇怪的錯誤(也許是因為我一直在調用它並一直轉發,但我還沒有找到原因..)但是我需要在我的JSP(search.jsp)頁中讀取一個屬性帶有“請提供有效數據”之類的簡單消息

但是,由於我使用響應將其重定向到頁面,並在請求范圍內設置此屬性,因此當我嘗試讀取該屬性時,不會出現任何預期的情況。 我嘗試將此屬性放入“會話范圍”中,然后讀取然后將其刪除,它起作用了(傳遞了錯誤的數據),但這只是第一次,如果我嘗試運行該屬性以再次正確提供所有數據,則會收到錯誤消息因為我沒有關閉瀏覽器才能將其實際上從會話中刪除。

所以我的問題是:有一種方法可以使用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");
}

搜索

<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的代碼:

好的,我明白為什么您要面對這個問題。 那是因為無限調用循環。 查看您編寫的代碼。 在您的JSP <jsp:include page="/searchServlet" />此行導致調用servlet searchServlet並再次在servlet中將請求發送到search.JSP 因此,請立即更正此問題。

如您所知,如果您要進行重定向,則無法在請求中傳遞屬性,因為重定向會導致瀏覽器發出新請求。 因此,您在JSP頁面中擁有的請求(對象)將是一個新請求-而不是您存儲屬性的請求。

您可以將屬性存儲在會話中,但是如您所知,如果不在兩次請求之間重設/刪除它們,可能會導致問題。 如果用戶使用其瀏覽器的“后退”按鈕,或者一次打開兩個或多個選項卡,則在會話中存儲狀態也會引起問題。

您可以使用重定向在請求參數中傳遞信息,例如,通過構造要重定向到的URL,使其包含參數。 例如blahblah / search?message = whatever

但是,這對於用戶來說似乎很奇怪(他們將在其瀏覽器的地址欄中看到參數),並且可能會遇到URL變大的問題。

在您的情況下,我將看看為什么前鋒不起作用。

正如mahesh所說,您有一個一般性的設計問題:

  • search.jsp包含searchServlet (hmm ...)
  • searchServlet轉發(或作為解決方法重定向)到search.jsp

這種設計很少見。 當然,在您的Servlet中使用重定向代替或轉發將打破無限循環,但是您的Servlet將重定向發送到瀏覽器,以便瀏覽器調用視圖...當然,您不能在Servlet之間的請求中傳遞任何內容及其視圖,因為該視圖將在另一個請求中調用。恕我直言,此處的重定向只是一種快速的解決方法。

哪個會更好(根據常規做法)

  • 瀏覽器最初調用servlet(即:搜索頁面的鏈接指向servlet直接處理的url)
  • servlet完成繁重的工作(用Java編程,編寫和測試更簡單)
  • servlet將所有相關參數放入請求中並轉發給jsp
  • jsp只是將所有格式正確的html格式設置在瀏覽器中。

您可以將參數保留在會話中。

session.setAttribute("Att1","para1");
session.setAttribute("Att2","para2");
.
.
.

像這樣。

您可以像這樣使用RequestDispatcher:-

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

如果您使用response.sendRedirect,則可以在ServletRequest對象中添加參數,並且可以在jsp中使用。

      <% String st=(String)request.getParameter("uname"); %>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM