代码之家  ›  专栏  ›  技术社区  ›  Raj

Servlet请求Dispatcher转发给调用者或上一个Servlet

  •  0
  • Raj  · 技术社区  · 10 年前

    我有一个SERVLET_a,它转发到一个表单(form.jsp页面)。表单提交给SERVICET_B。SERVLET_B将值插入数据库后,我必须在表单上显示消息“values inserted successfully”或错误消息“。

    我试图使请求分派器从SERVLET_B转发到SERVLET_A。但它不起作用,也不会给我一个错误。

    服务器_A--------->格式.sp---------->服务器_B------------------>服务_ A

    我的问题不是如何做到这一点。因为如果我使用sendRedirect而不是requestDispatcher,它会起作用。我的问题如下

    1. 我的理解正确吗?servlet不能转发回最初调用它的servlet。?

    2. 我通过在会话中设置消息并使用sendredirect来实现这一点。这种方法正确吗?

    3. 我被告知从servlet显示表单总是更好。(隐藏url并始终使用控制器)这就是为什么我有一个servlet_a转发到form.jsp。我可以直接访问form.jsp,但希望通过servlet访问,所以创建了servlet_a。 来自php背景的这一切似乎都很难处理表单。有人能告诉我在jsp MVC架构中表单通常是如何处理的吗。(无框架)

    2 回复  |  直到 10 年前
        1
  •  0
  •   Niru    10 年前

    你的代码有问题。如果你把代码贴出来就更好了。我会逐一回答你的问题。
    1.是的ServletB可以再次将请求转发回servletA我是 在下面发布示例代码
    ServletA GET方法 urlpatter=“sa”

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

    表单.jsp

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

    ServletB GET方法 urlpatter=“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,即模型类,它将处理数据并返回结果。在您的案例中,您应该将数据库部分作为一个Model类来处理,特别是使用DAO设计模式
    -servlet将获取结果并将其传递到JSP或HTML页面以显示它。

    你应该做什么
    正如我从你的方法中理解的那样,这是错误的。您应该使用Ajax或使用Servlet 3.0的异步请求处理。我的意思是,在处理完成后,您不应该将请求转发回ServletA,即jsp。相反,您应该向ServletB生成一个异步请求以提交数据。现在,当生成结果时,ServletB将响应作为JSON字符串发送,该字符串由javascript显示在form.jsp页面上

        2
  •  0
  •   Serge Ballesta    10 年前

    使用或不使用框架并没有多大区别。

    我是这样做的:

    • 使用servlet(方法doGet)来预处理请求、从数据库中获取值等,将值放入请求属性中并转发给servlet以显示HTML-好的,它是servlet a+form.jsp
    • 使用帖子处理提交的表单;这样,您可以使用相同的servlet,但doPost方法和 form 给出: <form method="POST"> 不采取任何行动-使用相同的url在很大程度上取决于意见。。。
    • 在doPost结束时,重定向到servletA或其他url( response.senRedirect(...) ). 这样,即使用户重新加载页面或按下浏览器的后退按钮,它也不会再次发布,只需再次获得重定向的URL。