Как связать разные сервлеты вместе?
Прежде всего, я не использовал Spring MVC.:):) Просто хочу получить это первым. Теперь у меня есть разные JSP-страницы, которые вызывают разные сервлеты. Все части работают отлично индивидуально, но мне нужно связать их вместе. Если все страницы JSP делают GET
запросить это было бы легко, так как я бы просто передать type
через веб-адрес, и на моей стороне сервлета, я бы просто перечислил через все параметры, определить, какие type
это и делегировать на правильный сервлет. Но не все страницы 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 ответа
Обычный подход 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 HEAD
, TRACE
, PUT
, OPTIONS
а также DELETE
Спросите методы во внимание. Возможно, вы захотите проигнорировать их и позволить сервлет-контейнеру обработать их способом "по умолчанию" (т. Е. Вернуть HTTP 405 "Метод не разрешен").
Вы также можете попробовать выполнить логику "делегирования" сервлета, которая есть в вашем jsp. Вы можете сделать это намного проще, используя JSP Expression Language (EL) и теги JSTL.
Пример:
<c:if test="${param.type == 'A'}>
call servlet 1
</c:if>
<c:if test="${param.type == 'B'}>
call servlet 2
</c:if>
Сервлет 1 или 2 может реализовывать doGet() или doPost() по мере необходимости. Или вы можете воспользоваться предложением Heavy Bytes иметь делегата doPost() для doGet().
Таким образом, вы можете покончить с вашим GenericServlet.
В вашем GenericServlet просто сделайте:
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
Таким образом, doPost() будет делегировать doGet().
И иметь тот же код для doGet (), как и раньше.