Java 如何将不同的Servlet链接在一起?

Java 如何将不同的Servlet链接在一起?,java,servlets,servlet-dispatching,Java,Servlets,Servlet Dispatching,首先,我没有使用Spring MVC::)只是想先把它弄出来。 现在我看到的是调用不同servlet的不同JSP页面。所有的作品都很好,但我需要把它们联系在一起。如果所有jsp页面都发出GET请求,那么就很容易了,因为我只需通过web地址传递类型,在servlet端,我只需枚举所有参数,确定它是哪个类型,并委托给正确的servlet。但并非所有jsp页面都发出GET请求,有些页面通过表单发出POST请求。让我们看看例子 A.jsp $.getJSON('GenericServlet?type

首先,我没有使用Spring MVC::)只是想先把它弄出来。 现在我看到的是调用不同servlet的不同JSP页面。所有的作品都很好,但我需要把它们联系在一起。如果所有jsp页面都发出
GET
请求,那么就很容易了,因为我只需通过web地址传递
类型
,在servlet端,我只需枚举所有参数,确定它是哪个
类型
,并委托给正确的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>
B.jsp
用户名:
密码:

我很难在
GenericServlet.java
中确定是否需要在您的GenericServlet中转到
servletB
,只需执行以下操作:

  public void doPost(HttpServletRequest request,HttpServletResponse response) 
         throws ServletException, IOException {
    doGet(request, response);
  }
因此doPost()将委托给doGet()


并且具有与前面相同的doGet()代码。

您还可以尝试执行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 2
Servlet 1或Servlet 2可以根据需要实现doGet()或doPost()。或者,您可以使用重字节的建议,将doPost()委托给doGet()


通过这种方式,您可能可以取消GenericServlet。

通常的MVC方法是重写该方法,并让业务逻辑也依赖于请求方法,这是通过获得的。另见

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


与HTTP
HttpServlet#service()
方法相反,这不考虑HTTP
HEAD
TRACE
PUT
OPTIONS
DELETE
请求方法。您可能希望忽略它们,让servletcontainer以“默认”方式处理它们(即返回)。

您是否对这种MVC方法进行过任何指导,BalusC?像弹簧MVC还是减震器?@哈利:不,实际上不是。这将是一个很大的写作。你可能会发现这篇文章很有用:读完这篇文章后,我觉得我对材料有了一些了解,但并不知道如何实施,因为它并没有真正告诉你如何去做。但是,很好的参考知识,谢谢你。问题是你不知道它是否是一种类型,因为B.jsp通过POST请求与
GenericServlet
通信
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.
}