Новичок Spring: шаблон URL для моего DispatcherServlet, похоже, «переопределяет» файл приветствия

#java #spring #configuration #spring-mvc #url-pattern

#java #spring #конфигурация #spring-mvc #шаблон url

Вопрос:

Я использую Spring для рендеринга своих JSP, и шаблон URL для моего DispatcherServlet — это «/». Похоже, это приводит к тому, что список файлов приветствия никогда не рассматривается. На самом деле я бы хотел DispatcherServlet обрабатывать все, кроме «/». Однако я хотел бы избежать расширений имен файлов (например, *.html, .do и т.д.), И я использую InternalResourceViewResolver , Поэтому установка шаблона URL для сервлета dispatcher в «/» приводит к тому, что он принимает слишком много (например, внутренние запросы для JSP-страниц, которые InternalResourceViewResolver генерируются, будут перехвачены сервлетом dispatcher, который затем выдаст ошибку, поскольку у него нет сопоставления для / WEB-INF /jsp/about.jsp). Буду признателен за любую помощь — я очень новичок в Spring (например, 2 дня ;-))

Вот соответствующие файлы:

Структура каталогов

 /war (I'm using AppEngine)
  index.jsp (Simply includes WEB-INF/jsp/index.jsp)
  /WEB-INF
    XML Config files

    /jsp
      index.jsp
      about.jsp
      ...
  

web.xml

 <?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<!--
    We purposefully do not make this /*. The convention here is to define
    mappings for files that exist, and write a good 404 page for anything
    else. Also, if you say /*, then the dispatcher servlet will intercept
    all requests, and the InternalResourceViewResolver will fail to
    resolve internal resources (e.g. jsp pages) because the dispatcher
    servlet will be intercepting all of the requests, even the internal
    ones
-->
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>
  

dispatcher-servlet.xml

 <!-- Search for and import all components in the controllers package -->
<context:component-scan base-package="org.foo.server.controllers" />


<bean name="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
    <property name="order" value="2" />
    <property name="location" value="/WEB-INF/views.xml" />
</bean>

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="100000" />
</bean>


<!--
    Given an arbitrary view name, such as 'about, that has been returned
    from a handler (controller), this will simply create
    '/WEB-INF/jsp/about.jsp' and send that to the Dispatcher Servlet.
    Because of the way ViewResolvers are chained (e.g. search until a View
    is found), coupled with the annoyance that this ViewResolver cannot
    determine if a View is found, this *has* to be the last ViewResolver
    considered, so I have set the order very high. See
    http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-viewresolver-chaining
    for more details
-->
<bean id="jspResolver"
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
        value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
    <property name="order" value="999" />
</bean>
  

Контроллер JSP (один из контроллеров, содержащихся в пакете org.foo.server.controllers)

 @Controller
public class WebportalController {
@RequestMapping(value = "/myforms", method = RequestMethod.GET)
public String getMyForms() {
    return "myforms";
}

@RequestMapping(value = "/about", method = RequestMethod.GET)
public String getAbout() {
    return "about";
}
... etc (for now all of the JSP pages are fairly static)
}
  

Комментарии:

1. Не могли бы вы добавить префикс для динамических страниц, отправляемых через spring? Что-то вроде /spring или / x? Таким образом, вы могли бы сопоставить / spring / * с сервлетом диспетчера и оставить ‘/’ не сопоставленным для чтения в файлах приветствия.

Ответ №1:

Способ, которым я обошел это, — присвоить сервлету dipatcher некоторый префикс и перенаправить ему все с этим префиксом (включая расширения). В моем случае я использовал webapp , а затем были другие каталоги первого уровня, такие как images etc. Это единственный способ, который я нашел (за исключением перезаписи URL), чтобы заставить это работать. Кроме того, если хотите, вы могли бы затем использовать механизм перезаписи URL для удаления webapp запросов from, для которых нет расширения, и т.д.

Комментарии:

1. Я думаю, что это единственный «простой» ответ: — / Я действительно надеялся избежать этого, потому что у меня уже есть несколько преобразователей цепного просмотра — мне, по сути, нужно будет изменить все мои запросы, чтобы использовать новый префикс (или суффикс), а затем, если я не хочу, чтобы он отображался, мне нужно будет переписать URL, что, вероятно, приведет к созданию как минимум 3 преобразователей цепочки внутри и может быть сложно для других spring новички в проекте, чтобы понять

2. Ах, вы пишете это для класса, который вы разрабатываете, не так ли?

3. На самом деле это для исследовательского проекта, но я наставляю некоторых студентов. Они выполняются довольно быстро, но в какой-то момент придет новая группа студентов, чтобы взять верх, поэтому я должен немного спланировать заранее 😉