Совместное использование сервлетов и 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", поэтому оно переходит к отправке 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 ответ
Как ни странно, я просто смотрел на это с другой стороны. См. Раздел 7.3.2 Процедура сопоставления сервлетов для получения информации о порядке совпадений.
Краткое резюме: сопоставления на основе путей имеют преимущество перед сопоставлениями на основе расширений, поэтому вы угоняете сопоставление JSP.