Пролетен начинаещ: url-моделът за моя DispatcherServlet изглежда „заменя“ файла за добре дошли

Използвам Spring за изобразяване на моите JSP и url моделът за моя DispatcherServlet е "/". Това изглежда прави така, че списъкът с добре дошли файлове никога да не се разглежда. Всъщност бих искал DispatcherServlet да обработва всичко освен "/". Бих искал обаче да избегна разширенията на имената на файловете (напр. *.html, .do и т.н.) и използвам InternalResourceViewResolver, така че задавам url модела за сървлета на диспечера на "/ " го кара да приема твърде много (напр. вътрешните заявки за JSP страниците, които InternalResourceViewResolver генерира, ще бъдат прихванати от диспечерския сървлет, който след това ще изведе грешка, защото няма съпоставяне за /WEB-INF/jsp/about.jsp ). Всяка помощ ще бъде оценена - аз съм много нов в пролетта (напр. 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)
}

person Hamy    schedule 25.04.2011    source източник
comment
Бихте ли добавили префикс за динамични страници, изпратени чрез spring? Нещо като /spring или /x? По този начин можете да картографирате /spring/* към диспечерския сървлет и да оставите '/' немаркиран, за да бъде прочетен за приветстващите файлове.   -  person Pace    schedule 25.04.2011


Отговори (1)


Начинът, по който заобиколих това, е да дам на сервлета dipatcher някакъв префикс и да препратя всичко с този префикс към него (включително разширения). В моя случай използвах webapp и след това имаше други директории от първо ниво като images и т.н. Това е единственият начин, който намерих (освен пренаписването на URL), за да накарам това да работи. Освен това, ако желаете, можете да използвате машина за пренаписване на URL адреси, за да премахнете webapp от заявки, които нямат разширение върху тях и т.н.

person Chris Thompson    schedule 25.04.2011
comment
Мисля, че това е единственият „лесен“ отговор :-/ Наистина се надявах да избегна това, защото вече имам няколко верижни преобразуватели на изгледи - по същество ще трябва да променя всичките си заявки, за да използвам новия префикс (или суфикс), а след това, ако не искам да се показва, ще трябва да направя URL пренаписване, което вероятно ще доведе до поне 3 верижни резолвера вътрешно и може да е трудно за разбиране от други новобранци в проекта - person Hamy; 25.04.2011
comment
А, пишете това за клас, който водите, нали? - person Chris Thompson; 26.04.2011
comment
Всъщност е за изследователски проект, но аз съм ментор на някои студенти. Те са доста бързи, но в даден момент ще има нова група студенти, които ще поемат, така че трябва да планирам малко по-напред ;-) - person Hamy; 26.04.2011