【问题标题】:How to link different Servlet together?如何将不同的Servlet链接在一起?
【发布时间】:2011-02-08 23:42:50
【问题描述】:

首先,我没有使用 Spring MVC。 :) :) 只是想先把它拿出来。 现在我拥有的是调用不同 Servlet 的不同 JSP 页面。所有的部分单独工作都很好,但我需要把它们联系在一起。如果所有 jsp 页面都发出 GET 请求,那将很容易,因为我只需通过网址传递一个 type,而在我的 servlet 端,我只需枚举所有参数,确定哪个 type是它,并委托给正确的servlet。但并不是所有的jsp页面都发出GET请求,有些是通过表单发出POST请求。看例子

 A.jsp
 $.getJSON('GenericServlet?type=A', ...

 GenericServlet.java
 String type = request.getParameter("type");    
 if(type.equals("A")){
     //Somehow delegate to Servlet A (Not sure how to do that yet :))
 }

但是在B.jsp 我会有这样的东西

 B.jsp
 <form action="GenericServlet" method="post">
    <table border=0 cellspacing=10 cellpadding=0>
        <tr>
            <td>User Name:</td>
            <td><input type="text" name="username" size=22/></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type="password" name="password" size=22/></td>
        </tr>
    </table>
    <input type="submit" value="Create User" />
</form>

GenericServlet.java 中我很难确定这需要转到servletB

【问题讨论】:

    标签: java servlets servlet-dispatching


    【解决方案1】:

    在您的 GenericServlet 中执行以下操作:

      public void doPost(HttpServletRequest request,HttpServletResponse response) 
             throws ServletException, IOException {
        doGet(request, response);
      }
    

    所以 doPost() 将委托给 doGet()。

    doGet() 的代码和以前一样。

    【讨论】:

      【解决方案2】:

      您也可以尝试执行您在 jsp 中的 servlet“委托”逻辑。您可以使用 JSP 表达式语言 (EL) 和 JSTL 标记更轻松地完成此操作。

      例子:

      <c:if test="${param.type == 'A'}>
         call servlet 1
      </c:if>
      <c:if test="${param.type == 'B'}>
         call servlet 2
      </c:if>
      

      Servlet 1 或 2 可以根据需要实现 doGet() 或 doPost()。或者您可以按照 Heavy Bytes 的建议让 doPost() 委托给 doGet()。

      这样也许你可以取消你的 GenericServlet。

      【讨论】:

      • 问题是你真的不知道它是否是一个类型,因为B.jsp通过POST请求与GenericServlet通信
      【解决方案3】:

      通常的MVC方法是重写HttpServlet#service()方法,让业务逻辑也依赖于请求方法,正如HttpServletRequest#getMethod()获得的那样。另见this answer

      另一种方法确实是让doGet()doPost() 执行相同的逻辑,但我不会将一个委托给另一个,我宁愿将它们委托给相同的独立方法。例如。 (半伪):

      protected void doGet(request, response) {
          process(request, response);
      }
      
      protected void doPost(request, response) {
          process(request, response);
      }
      
      private void process(request, response) {
          // Do your thing here.
      }
      

      HttpServlet#service() 方法相反,这考虑了HTTP HEADTRACEPUTOPTIONSDELETE 请求方法。您可能希望忽略它们并让 servletcontainer 以“默认”方式处理它们(即返回 HTTP 405 Method Not Allowed)。

      【讨论】:

      • BalusC,你有没有做过关于这种 MVC 方法的教程?像 Spring MVC 还是 Strut?
      • @Harry:不,实际上不是。这将是大量的写​​作。您可能会发现这篇文章很有用:javaranch.com/journal/200603/frontman.html
      • 读完这篇文章,我觉得我对材料有所了解,但并不真正知道如何实现它,因为它并没有真正告诉你如何去做。不过,很好的参考知识,谢谢balusC
      猜你喜欢
      • 2012-01-17
      • 1970-01-01
      • 2014-08-22
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      相关资源
      最近更新 更多