首先,我没有使用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
答案 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 HEAD
,TRACE
,PUT
,OPTIONS
和DELETE
请求方法。您可能想要忽略它们并让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。