【问题标题】:Spring Controller's URL request mapping not working as expectedSpring Controller 的 URL 请求映射未按预期工作
【发布时间】:2012-06-26 08:58:21
【问题描述】:

我在 web.xml 中创建了一个类似这样的映射:

<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>/about/*</url-pattern>  
</servlet-mapping>

在我的控制器中,我有这样的东西:

import org.springframework.stereotype.Controller;  
@Controller  
public class MyController{  
    @RequestMapping(value="/about/us", method=RequestMethod.GET)
    public ModelAndView myMethod1(ModelMap model){  
        //some code  
        return new ModelAndView("aboutus1.jsp",model);  
    }  
    @RequestMapping(value="/about", method=RequestMethod.GET)
    public ModelAndView myMethod2(ModelMap model){  
        //some code  
        return new ModelAndView("aboutus2.jsp",model);  
    }  
}

而我的 dispatcher-servlet.xml 有如下视图解析器:

<mvc:annotation-driven/>  
<bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:viewClass="org.springframework.web.servlet.view.JstlView"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp"/>

令我惊讶的是:请求 .../about/us 没有到达控制器中的 myMethod1。浏览器显示 404 错误。我在方法中放置了一个记录器,但它没有打印任何内容,这意味着它没有被执行。
.../about 工作正常!可以做些什么来使.../about/us 请求工作?有什么建议吗?

【问题讨论】:

    标签: model-view-controller spring-mvc controller web.xml url-mapping


    【解决方案1】:

    你需要使用@RequestMapping(value="/us", method=RequestMethod.GET)或者你需要请求about/about/us

    【讨论】:

    • 但是我没有在控制器类级别上映射任何东西。我需要吗?我想只有这样我才需要写 /us 而不是 /about/us 并看看:/about 已经在工作了!那为什么不about/us
    • 原因:你已经将web.xml中的/about/映射到了DispatcherServlet。因此,您只需要映射 /about 之后的部分。
    • /about 会进入你的方法吗?真的??它必须进入 DispatcherServlet
    • 它是通过dispatcher servlet 引导到方法的。顺便说一句,我通过在 dispatcher-servlet.xml 中添加更多配置行来使代码正常工作。看看我的回答。谢谢你的帮助。 :)
    • 恭喜!!!!但是,我对此有不同的看法。我看不出有什么理由需要使用 alwaysUseFullPath,只要我只能映射 Spring 的请求 URL 的后面部分。至少我不需要到处重复/about
    【解决方案2】:

    由于您在 web.xml 中映射了“/about”,它将传递的 url 将像这样 www.xyz.com/about/*

    正如您的配置所说,它将适用于

    1. www.xyz.com/about/about/us
    2. www.xyz.com/about/about

    为了正常工作,请使用 /* 在 web.xml 中而不是 /about

    或将控制器的端点更改为

    @RequestMapping(value="/us", method=RequestMethod.GET)

    @RequestMapping(value="/", method=RequestMethod.GET)

    【讨论】:

      【解决方案3】:

      好的,我得到了工作,这是我在 dispatcher-servlet.xml 中添加的内容:

      <bean
          class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
              <property name="alwaysUseFullPath" value="true" />
          </bean>
      
          <bean
          class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
              <property name="alwaysUseFullPath" value="true" />
      </bean>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-05
        • 2015-04-11
        • 2018-04-24
        • 1970-01-01
        • 1970-01-01
        • 2013-02-13
        相关资源
        最近更新 更多