1

首先,我没有使用 Spring MVC。:) :) 只是想先把它拿出来。现在我拥有的是调用不同 Servlet 的不同 JSP 页面。所有的部分单独工作都很好,但我需要把它们联系在一起。如果所有的jsp页面都发出GET请求,那会很容易,因为我只需通过type网址传递a,在我的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

4

3 回答 3

2

通常的 MVC 方法是覆盖该HttpServlet#service()方法并让业务逻辑也依赖于请求方法,如HttpServletRequest#getMethod(). 另请参阅此答案

另一种方法确实是让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 HEADTRACEPUT和request 方法。您可能希望忽略它们并让 servletcontainer 以“默认”方式处理它们(即返回HTTP 405 Method Not Allowed)。OPTIONSDELETE

于 2010-04-16T20:46:28.370 回答
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。

于 2010-04-16T20:21:36.297 回答
0

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

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

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

并且 doGet() 的代码与以前相同。

于 2010-04-16T19:52:04.790 回答