3

I'm just starting with Spring MVC trying to create a new project, and came accross an issue for which no manual or tutorial seems to help...

I have set up a simple application with no logic, just trying to get Spring configured properly. The controller just returns the name of a view to be displayed, but the view resolver is not rendering the jsp, and returning a 404 error....

Any help is greatly appreciated.

My web.xml is:

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <servlet-name>openstats</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>openstats</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

  <display-name>OpenStats API Server</display-name>
</web-app>

An my openstats-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <context:component-scan base-package="org.openstats.api.controller"/>

    <!-- Enable to request mappings PER METHOD -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>

    <!-- Enable annotated POJO @Controller -->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

    <!-- Define the view resolver to use jsp files within the jsp folder -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
        <property name="prefix"><value>/jsp/</value></property>
        <property name="suffix"><value>.jsp</value></property>
    </bean>
</beans>

The controller itself has no logic whatsoever, it's simply:

@Controller
public class ProductController {

    @RequestMapping(value = "/products.do", method = RequestMethod.GET)
    public ModelAndView listProducts(HttpServletRequest request) {

        ModelAndView model = new ModelAndView("index");
        return model;
    }
}

The controller is reached, the issue is when attempting to render...

I set up log4j in debug, and this is part of what I get:

02:08:19,702 DEBUG DispatcherServlet:1094 - Testing handler adapter [org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter@397b6074] 02:08:19,803 DEBUG HandlerMethodInvoker:134 - Invoking request handler method: public org.springframework.web.servlet.ModelAndView org.openstats.api.controller.ProductController.listProducts(javax.servlet.http.HttpServletRequest) 02:08:19,833 DEBUG DefaultListableBeanFactory:1367 - Invoking afterPropertiesSet() on bean with name 'index' 02:08:19,876 DEBUG InternalResourceViewResolver:81 - Cached view [index] 02:08:19,877 DEBUG DispatcherServlet:1181 - Rendering view [org.springframework.web.servlet.view.JstlView: name 'index'; URL [/jsp/index.jsp]] in DispatcherServlet with name 'openstats' 02:08:19,877 DEBUG JstlView:240 - Rendering view with name 'index' with model {} and static attributes {} 02:08:19,923 DEBUG JstlView:234 - Forwarding to resource [/jsp/index.jsp] in InternalResourceView 'index' 02:08:19,926 DEBUG DispatcherServlet:955 - DispatcherServlet with name 'openstats' determining Last-Modified value for [/api-server/jsp/index.jsp] 02:08:19,927 DEBUG DispatcherServlet:1054 - Testing handler map [org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping@440c4cee] in DispatcherServlet with name 'openstats' 02:08:19,928 DEBUG DefaultAnnotationHandlerMapping:179 - No handler mapping found for [/jsp/index.jsp] 02:08:19,929 DEBUG DispatcherServlet:962 - No handler found in getLastModified 02:08:19,937 DEBUG DispatcherServlet:781 - DispatcherServlet with name 'openstats' processing request for [/api-server/jsp/index.jsp] 02:08:19,938 DEBUG DispatcherServlet:843 - Bound request context to thread: GET /api-server/products.do HTTP/1.1

My jsp folder is right within "webapp" and the index.jsp file exists.

Thanks in advance.

1
  • 2
    What's odd here is that once the InternalResourceViewResolver finds the correct JSP, the DispatcherServlet starts treating it like a request and is looking for a controller to handle the URN /api-server/jsp/index.jsp Could you post the contents of the JSP? Is there any other configuration that could be causing this behaviour? Commented Oct 23, 2009 at 16:23

4 Answers 4

5

I do have the same problem with Spring 3.x. Any progress so far?

EDIT: I figured it out myself :-) I used the following servletmapping:

  <servlet-mapping>
    <servlet-name>spring-frontcontroller</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

Editing the url-pattern to e.g. *.do fixes the problem of not rendering the JSP. But this leaves the question how this is possible with your url-pattern.

Sign up to request clarification or add additional context in comments.

2 Comments

I had this exact problem too, thanks for pointing it out! I guess I'll have to settle on an extension.
Is this behaviour documented somewhere?
2

Does your web.xml define index.jsp in the welcome-file-list, if so it may be getting overridden. Try changing the jsp name to products.jsp.

e.g.

@Controller
public class ProductController {

    @RequestMapping(value = "/products.do", method = RequestMethod.GET)
    public String handleRequest() {
          return "products";
    }
}

Comments

0

doesn't your .jsp and your .do conflict? since a file cannot end with both .jsp and .do .. therefore it will never resolve... so you should get rid of .jsp or change your url pattern to /*

Comments

0

Changing

import org.springframework.web.servlet.ModelAndView;

by

import org.springframework.web.portlet.ModelAndView;

Works in my case.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.