15

我是 Spring 和 web MVC 模块的新手。基本上,我有以下内容:

web.xml

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

<servlet-mapping>
    <servlet-name>abc-dispatcher</servlet-name>
    <url-pattern>/user/*</url-pattern>
</servlet-mapping>

abc-调度程序-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"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">


<context:component-scan base-package="myPkg" />


<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/pages/"></property>
    <property name="suffix" value=".jsp"></property>        
</bean>

我有一个控制器,相关部分是:

@Controller
public class ABCController {

@RequestMapping("/user/welcome")
public String printWelcome(ModelMap model) {

    //code

}

现在每当我尝试访问http://localhost:8080/myapp/user/welcome

它给了我404。

日志说“将 url '/user/welcome' 映射到处理程序 'ABCController' 但它未能在 DispatcherServlet 中映射 URI [/ MYAPP /user/welcome] 名称为 'abc-dispatcher' 。

完全糊涂了。我已经检查了我们两次指定映射的所有线程,但这里不是这种情况。我肯定错过了什么!

谢谢您的帮助!

4

3 回答 3

15

URL 应该是http://localhost:8080/myapp/user/user/welcome. 实际上,除非处理程序的 alwaysUseFullPath 属性设置为 true,否则 servlet-mapping 会附加到请求映射 URL 以形成完整路径。

有关详细信息,请参阅http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-handlermapping

始终使用完整路径

如果为 true ,Spring 使用当前 Servlet 上下文中的完整路径来查找合适的处理程序。如果为 false(默认值),则使用当前 Servlet 映射中的路径。例如,如果使用 /testing/* 映射 Servlet 并且 alwaysUseFullPath 属性设置为 true,则使用 /testing/viewPage.html,而如果该属性设置为 false,则使用 /viewPage.html。

于 2012-07-27T21:43:37.037 回答
5

它已被添加context:component-scan到示例上下文文件片段中,但没有<annotation-driven/>元素表明 spring 框架可以查找带有注释的控制器@Controller

于 2014-04-11T03:02:28.883 回答
3

对我来说,问题是我使用了已弃用的DefaultAnnotationHandlerMapping,即使将alwaysUseFullPath设置为 true,它也没有生效,但是将 DefaultAnnotationHandlerMapping 替换为RequestMappingHandlerMapping并将alwaysUseFullPath设置为 true 解决了问题。

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="alwaysUseFullPath" value="true"></property>
</bean>
于 2015-04-26T22:45:22.497 回答