Как связать разные сервлеты вместе? - PullRequest
1 голос
/ 16 апреля 2010

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

2 голосов
/ 17 апреля 2010

Обычный подход 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 Метод не разрешен ).

0 голосов
/ 17 апреля 2010

Вы также можете попытаться выполнить логику «делегирования» сервлета, которая есть в вашем jsp. Вы можете сделать это намного проще, используя язык выражений 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>

Сервлет 1 или 2 может реализовывать doGet () или doPost () по мере необходимости. Или вы можете воспользоваться предложением Heavy Bytes, чтобы иметь делегат doPost () для doGet ().

Таким образом, вы можете покончить с вашим GenericServlet.

0 голосов
/ 16 апреля 2010

В вашем GenericServlet просто выполните:

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

Так что doPost () делегирует doGet ().

И иметь тот же код для doGet (), что и раньше.

...