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

时间:2010-04-16 19:46:45

标签: java servlets servlet-dispatching

首先,我没有使用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

3 个答案:

答案 0 :(得分:2)

通常的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)。

答案 1 :(得分:0)

在你的GenericServlet中,只需:

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

因此doPost()将委托给doGet()。

与doGet()具有相同的代码。

答案 2 :(得分:0)

您还可以尝试执行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。