Совместное использование сервлетов и JSP, что приводит к неожиданному циклу - PullRequest
1 голос
/ 23 июня 2009

Я пытаюсь использовать сервлеты в качестве уровня контроллера и 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», поэтому оно переходит к отправке main.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>

1 Ответ

2 голосов
/ 23 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...