Как связать разные сервлеты вместе?

Прежде всего, я не использовал 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 (), как и раньше.

Другие вопросы по тегам