Совместное использование сервлетов и JSP приводит к неожиданному зацикливанию

Я пытаюсь использовать сервлеты в качестве уровня контроллера и JSP в качестве уровня представления. Многие из примеров / руководств, которые я прочитал, предлагают сделать что-то вроде этого:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // add something for the JSP to work on
    request.setAttribute("key", "value");

    // show JSP
    request.getRequestDispatcher("main.jsp")forward(request, response);
}

Это отлично работает для простого примера, но когда я увеличиваю его (даже немного):

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // add something for the JSP to work on
    request.setAttribute("key", "value");

    String pathInfo = request.getPathInfo();
    if ((pathInfo != null) && (pathInfo.length() > 1)) {
        // get everything after the '/'
        pathInfo = pathInfo.subSequence(1, pathInfo.length()).toString();

        if (pathInfo.equals("example")) {
            request.getRequestDispatcher("alternate.jsp").forward(request, response);
        }
    }

    // show JSP
    request.getRequestDispatcher("main.jsp").forward(request, response);
}

Насколько я могу судить, происходит следующее: если я перейду (например) на http://localhost/main/example он попадает в сервлет, попадает туда, где он отправляется в alternate.jsp, затем он снова запускает сервлет, но на этот раз вместо pathInfo, равного «example», он равен «alternate.jsp», поэтому он переходит в основной. jsp отправка.

Как я могу заставить его запускать разные файлы JSP с некоторой логикой, аналогичной приведенной выше?

На всякий случай сопоставление в web.xml выглядит следующим образом:

<servlet>
    <servlet-name>Main</servlet-name>
    <servlet-class>com.example.MainServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Main</servlet-name>
    <url-pattern>/main/*</url-pattern>
</servlet-mapping>

person Jeremy Logan    schedule 22.06.2009    source источник
comment
Эх ... Думаю, мне придется серьезно переработать этот вопрос, чтобы получить нужный мне ответ.   -  person Jeremy Logan    schedule 23.06.2009
comment
Хорошо, после того, как я сузил проблему еще больше и попробовал еще несколько тестов, я придумал лучший вопрос. stackoverflow.com/questions/1030302/   -  person Jeremy Logan    schedule 23.06.2009


Ответы (1)


Как ни странно, я просто смотрел на это под другим углом. См. здесь, раздел 7.3. 2 Процедура сопоставления сервлетов для получения информации о порядке совпадений.

Краткое описание: сопоставления на основе пути важнее сопоставлений на основе расширений, поэтому вы захватываете сопоставление JSP.

person Tetsujin no Oni    schedule 22.06.2009
comment
Есть ли у кого-нибудь предложения по альтернативным подходам? - person Jeremy Logan; 23.06.2009