4

I am using Spring to render my JSPs, and the url-pattern for my DispatcherServlet is "/". This seems to be making it so that the welcome-file-list is never considered. I would actually like DispatcherServlet to handle everything except "/". However, I would like to avoid file name extensions (e.g., *.html, .do, etc), and I am using an InternalResourceViewResolver, so setting the url-pattern for the dispatcher servlet to "/" makes it accept too much (e.g. the internal requests for the JSP pages that InternalResourceViewResolver generates would be intercepted by the dispatcher servlet, which would then throw an error because it does not have a mapping for /WEB-INF/jsp/about.jsp). Any help would be appreciated - I am very new to Spring (e.g. 2 days ;-) )

Here are the appropriate files:

Directory Structure

/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 Controller (one of the controllers contained within the org.foo.server.controllers" package)

@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)
}
Eliran Malka
  • 15,821
  • 6
  • 77
  • 100
Hamy
  • 20,662
  • 15
  • 74
  • 102
  • 1
    Could you add a prefix for dynamic pages dispatched via spring? Something like /spring or /x? This way you could map /spring/* to the dispatcher servlet and leave the '/' unmapped to be read in for the welcome files. – Pace Apr 25 '11 at 03:20

1 Answers1

1

The way I've gotten around this is to give the dipatcher servlet some prefix and forwarded everything with that prefix to it (including extensions). In my case, I used webappand then there were other first-level directories like images etc. This is the only way I've found (short of URL rewriting) to get this to work. Additionally, if you like, you could then use a URL rewriting engine to remove the webapp from requests that don't have an extension on them, etc.

Chris Thompson
  • 35,167
  • 12
  • 80
  • 109
  • I think that's the only 'easy' answer :-/ I was really hoping to avoid doing that, because I've already got a few chained view resolvers - I essentially will need to change all of my requests to use the new prefix (or suffix), and then if I don't want it to show up I will need to do URL rewriting, which will probably result in at least 3 chained resolvers internally and might be hard for other spring newbies on the project to understand – Hamy Apr 25 '11 at 17:26
  • Ah, you're writing this for a class you're TAing aren't you? – Chris Thompson Apr 25 '11 at 21:58
  • Actually it's for a research project, but I'm mentoring some undergrads. They are pretty quick, but there will be a new group of undergrads coming in at some point to take over, so I have to plan ahead a little ;-) – Hamy Apr 26 '11 at 18:35