Ищете более краткую конфигурацию пересылки JSP в Spring 3.0 - PullRequest
1 голос
/ 17 февраля 2011

В обычном приложении Java weba, если я добавлю это в код моего сервлета, переадресация будет работать:

getServletConfig().getServletContext().getRequestDispatcher("/something.jsp").forward(req, resp);

Но когда я делаю это в том же сервлете в приложении Spring 3.0, я получаю 404 даже если я добавлю эту запись в свой XML-файл контекста приложения:

    <intercept-url pattern="/something.jsp**" access="hasRole('ROLE_ANONYMOUS')" requires-channel="http" />

Вместо этого я должен сделать это весной, кажется:

getServletConfig().getServletContext().getRequestDispatcher("/something").forward(req, resp);

и добавить отображение в контроллере:

@RequestMapping(value = {"/something"}, method = RequestMethod.GET)
public final String something(HttpServletRequest req, ModelMap model) {
    ...
    }

Но это довольно существенный обходной путь, чтобы заставить работать простой JSP.

Есть ли лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Я не полностью понимаю вашу проблему, но:

  • return "/something" от контроллера пересылается в jsp с именем something.jsp (если используется наиболее типичная конфигурация распознавателя представлений))

  • если у вас нет возвращаемого значения из метода, по умолчанию ищется jsp с именем метода.

1 голос
/ 17 февраля 2011

Прежде всего, все, что вы можете сделать из сервлета, который вы можете сделать из контроллера Spring MVC (поскольку в этот момент вы в основном находитесь внутри DispatcherServlet.service()), поэтому, если вы получите 404, это может бытьсвязанные с вашим сервлетом.Возможно ли, что вы отобразили сервлет Dispatcher как / *?

Отдельно (но я бы сказал, что более важно) Spring MVC (как и любой веб-фреймворк) должен скрывать инфраструктуру сервлета от вас,поэтому ваша потребность использовать RequestDispatcher и переслать запрос мне не очень понятна.

Чтобы переслать запрос в JSP, просто поместите его в местоположение, о котором ViewResolver знает, и просто верните "что-то"метод контроллера - так как он имеет точно такой же эффект и более "MVC-иш" ...

1 голос
/ 17 февраля 2011

Вот как я это делаю:

Настройте преобразователь представления так, чтобы имена представлений основывались на URL-адресе запроса:

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  <property name="prefix" value="/WEB-INF/pages/"/>
  <property name="suffix" value=".jsp"/>
</bean>

Во-вторых, контейнер сервлета выбирает отображение на основе самого длинного пути, который соответствует. Таким образом, вы можете вставить это отображение для ваших JSP, и оно будет выбрано вместо / * mapping.

<servlet-mapping>
  <servlet-name>jsp</servlet-name>
  <url-pattern>/WEB-INF/pages/*</url-pattern>
</servlet-mapping>

На самом деле для Tomcat это все, что вам нужно, поскольку jsp - это сервлет, который существует из коробки. Для других контейнеров вам нужно либо узнать имя сервлета JSP, либо добавить определение сервлета, например:

<servlet>
  <servlet-name>jsp</servlet-name>
  <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
</servlet>

Как только эти две вещи будут реализованы, вам не нужно ничего делать в ваших контроллерах, кроме как возвращать модель. Он автоматически перешлет к просмотру с WEB-INF / pages на основе URL вашего запроса. В вашем примере это будет /WEB-INF/pages/something.jsp.

...