[英]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可以工作,我的問題如下
我的理解正確嗎,一個servlet無法轉發回最初調用它的servlet。
我通過在會話中設置消息並使用sendredirect來使其工作。 這種方法正確嗎?
有人告訴我,從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即模型類,它將處理數據並返回結果。 在您的情況下,應專門使用DAO設計模式將數據庫部分作為Model類進行處理
-servlet將獲取結果並將其傳遞到JSP或HTML頁面以顯示它。
你應該怎么做
據我了解,您的方法是錯誤的。 您應該使用Servlet 3.0停止使用Ajax或請求的異步處理。 我的意思是,處理完成后,您不應該請求轉發回ServletA,即jsp。 相反,您應該向ServletB生成異步請求以提交數據。 現在,當生成結果時,ServletB將響應作為JSON字符串發送,該字符串由javascript在form.jsp頁面上顯示
是否使用框架並沒有多大區別。
這是我的方法:
form
給出: <form method="POST">
而無需采取任何操作-使用相同的url在很大程度上取決於意見... response.senRedirect(...)
)。 這樣,即使用戶重新加載其頁面或按其瀏覽器的“后退”按鈕,它也不會再發布,而只需再次獲取重定向的URL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.