簡體   English   中英

Servlet ReqeustDispatcher轉發給調用者或先前的Servlet

[英]Servlet ReqeustDispatcher forward to caller or previous servlet

我有一個SERVLET_A,它轉發到一個表單(form.jsp頁)。 表單提交到SERVLET_B。 通過SERVLET_B將值插入數據庫后,我必須顯示消息“已成功插入值”或表單上的錯誤消息。現在,這就是問題所在。

我試圖使requestdispatcher從SERVLET_B轉發到SERVLET_A。 但這不起作用,也不會給我一個錯誤。

SERVLET_A -----------> FORM.jsp ----------- >> SERVLET_B -----------------> SERVLET_A

我的問題不是如何做到這一點。 因為如果我使用sendRedirect而不是requestDispatcher可以工作,我的問題如下

  1. 我的理解正確嗎,一個servlet無法轉發回最初調用它的servlet。

  2. 我通過在會話中設置消息並使用sendredirect來使其工作。 這種方法正確嗎?

  3. 有人告訴我,從servlet顯示表單總是更好。 (隱藏url並始終使用控制器)所以這就是為什么我將servlet_A轉發到form.jsp。 我可以直接訪問form.jsp,但想通過servlet來完成,所以才創建了SERVLET_A。 來自php的背景,這似乎對處理表單很有幫助。 任何人都可以讓我知道在jsp MVC體系結構中通常如何處理表單。(無框架)

您的代碼有問題。 如果您發布了代碼,那就更好了。 我將一一回答您的問題。
1.是,ServletB可以再次將請求轉發回ServletA,我在下面發布示例代碼
ServletA GET方法 urlpattern =“ sa”

RequestDispatcher view=request.getRequestDispatcher("form.jsp");
view.forward(request, response);

form.jsp

<body>
   <form action="./sb">
      <input type="text" name="fn" />
      <input type="submit"  value="Submit" />
    </form>
    <%= "fn : "+(String)session.getAttribute("fn") %>
</body>

ServletB GET方法 urlpattern =“ sb”

String fn = request.getParameter("fn");
request.getSession().setAttribute("fn",fn);
RequestDispatcher view=request.getRequestDispatcher("sa");
view.forward(request, response);

2如何在不使用框架的情況下使用MVC處理表單
-這里V代表觀點。 它是jsp或html頁面。 您將顯示所有內容。 此處無需進行任何處理。
-C代表控制器。 它是您的servlet。 表單提交的所有數據均由servlet收集。 這里也沒有處理,只收集所有數據。 然后,創建一個普通Java類的對象,它實際上是您的M即模型類,它將處理數據並返回結果。 在您的情況下,應專門使用DA​​O設計模式將數據庫部分作為Model類進行處理
-servlet將獲取結果並將其傳遞到JSP或HTML頁面以顯示它。

你應該怎么做
據我了解,您的方法是錯誤的。 您應該使用Servlet 3.0停止使用Ajax或請求的異步處理。 我的意思是,處理完成后,您不應該請求轉發回ServletA,即jsp。 相反,您應該向ServletB生成異步請求以提交數據。 現在,當生成結果時,ServletB將響應作為JSON字符串發送,該字符串由javascript在form.jsp頁面上顯示

是否使用框架並沒有多大區別。

這是我的方法:

  • 使用servlet(方法doGet)預處理請求,從數據庫中獲取值等,將值放入請求屬性中並轉發到servlet以顯示HTML-好的,它是servlet A + form.jsp
  • 使用帖子處理提交的表格; 這樣,您可以使用相同的servlet,但是doPost方法和您的form給出: <form method="POST">而無需采取任何操作-使用相同的url在很大程度上取決於意見...
  • 在doPost的末尾,重定向到servletA或另一個URL( response.senRedirect(...) )。 這樣,即使用戶重新加載其頁面或按其瀏覽器的“后退”按鈕,它也不會再發布,而只需再次獲取重定向的URL。

暫無
暫無

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

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