2011-01-10 46 views
1

我在玻璃鱼2.1上创建一个你好世界的春天项目。我正在尝试使用SimpleUrlHandlerMapping将以/spring/*.htm结尾的所有内容映射到我的弹簧控制器。以下是我有:用玻璃鱼和弹簧的URL映射

的web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app 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" 
    version="2.4"> 
    <display-name>Test MVC Project</display-name> 

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

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

    <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
</web-app> 
在我的调度员servlet.xml文件

<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"> 

    <bean id="defaultController" 
     class="org.springframework.web.servlet.mvc.ParameterizableViewController"> 
     <property name="viewName" value="WEB-INF/jsp/springbean-view.jsp" /> 
    </bean> 

    <bean id="urlMapping" 
     class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
     <property name="mappings"> 
      <props> 
       <prop key="*.htm">defaultController</prop> 
      </props> 
     </property> 
    </bean> 

</beans> 

我的sun-web.xml文件:

<sun-web-app> 
    <context-root>/foo</context-root> 
    <class-loader delegate="false" /> 
</sun-web-app> 

当我要求http://localhost:9680/foo时,我看到欢迎页面。当我请求http://localhost:9680/foo/spring/test.htm时,我得到了404。

我已经在servlet.xml文件的urlMapping中尝试了很多模式的变体。我已经得到了工作的唯一的事情是,如果我这样做:

<bean id="urlMapping" 
    class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="mappings"> 
     <props> 
      <prop key="/*">defaultController</prop> 
     </props> 
    </property> 
</bean> 

当我要求http://localhost:9680/foo/spring,它的工作原理。对我来说,这意味着我的web.xml是正确的,因为它正确地将请求传递给调度servlet。当我要求http://localhost:9680/foo/spring/test.htm(或任何在/春天结束/ *,我得到一个500与此异常:

javax.servlet.ServletException:PWC1232:超过最大深度嵌套请求派遣:20

我觉得我做的事情非常愚蠢,但几个小时google搜索,并与映射玩耍后,我难倒

+0

请帮我看看我的问题,我想我也有类似的问题 http://stackoverflow.com/questions/31709601/ glassfish-url-mapping – 2015-07-30 12:30:19

回答

1

这几乎是正确的:

<prop key="/*">defaultController</prop> 

但是,这可以简单一些:

<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
    <property name="defaultHandler" ref="defaultController"/> 
</bean> 

另外,您得到无尽的转发循环的原因是这样的:

<bean id="defaultController" class="org.springframework.web.servlet.mvc.ParameterizableViewController"> 
    <property name="viewName" value="WEB-INF/jsp/springbean-view.jsp" /> 
</bean> 

这里的问题是有一个在viewName没有领先/ ,所以它被解释为相对的。所以,当你去到结尾为/foo/spring/test.htm的URL时,相应的转发URI是/foo/spring/WEB-INF/jsp/springbean-view.jsp,而这又被url-patternweb.xml中捕获,所以它回到DispatcherServlet,它转发它等等等等。无尽的循环。

简单的解决办法:

<property name="viewName" value="/WEB-INF/jsp/springbean-view.jsp" /> 

注意龙头/

+0

谢谢,viewName开头的斜杠是我所有问题的根源! – Kyle 2011-01-10 22:03:01