SpringMVC错误:org.springframework.web.servlet.DispatcherServlet noHandlerFound

在做关于SpringMVC的相关操作时经常会出现这个错误,下面的原因会导致这个错误

org.springframework.web.servlet.DispatcherServlet noHandlerFound
警告: No mapping found for HTTP request with URI [/myspring/WEB-INF/jsp/hello.jsp] in DispatcherServlet with name 'springDispatcherServlet'

原因一:在 web.xml 中对 springDispatcherServlet 的配置出错

  <servlet>
    <servlet-name>springDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

 注意如果  <url-pattern>/</url-pattern> 中的 / 写成了 <url-pattern>/*</url-pattern> 会出错
原因:
<url-pattern>/</url-pattern>  会匹配到/login这样的路径型url,不会匹配到模式为 /*.jsp这样的后缀型url


< url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等),无论有多少层目录都一样会被匹配到 如 :/view/*jsp 这种也会被匹配到。

采用 <url-pattern>/*</url-pattern>  你会发现就是直接访问 jsp 页面也会出现这个错误,因为这个访问请求也会被这个Servlet拦截,然后请求的 URI 匹配不到 Http request 中的 URI, 因为 Http request 中不存在这个 URI。

 

原因二:Handler 类没有加上 @Controller 注解
       若 Handler 类没有加上 @Controller 注解,处理器将不会扫描到该类是否使用了 @RequestMapping 注解。

 

原因三:可能只是 @RequestMapping 的值跟页面的请求值不一致
       如:有个@RequestMapping("/test")  页面跳转 <a href="/test"> Test </a> 会出错    应为 <a href="test"> Test </a> 

 

原因四:访问静态资源时,也会出现这个错

        SpringMVC 会将这些访问静态资源的请求也当成一个普通请求处理,然后这个请求会被 DispatcherServlet 拦截器拦截,因找不到对应处理器将导致错误。
        解决办法一:
        在 SpringMVC 的配置文件上加 <mvc:view-controller path="/success" view-name="success"/>


        解决方法二:
        在 SpringMVC 的配置文件中配置 <mvc:default-servlet-handler/>
        注意方法一、二都还需要加上这个标签:<mvc:annotation-driven></mvc:annotation-driven>,不然之前可以的普通请求会失效。
       <mvc:default-servlet-handler/> 的处理原理:

       <mvc:default-servlet-handler/> 将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由 WEB 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理
       一般 WEB 应用服务器默认的 Servlet 的名称都是 default。若所使用的 WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显式指定
       查看默认的 Servlet 的名称可以到 Tomcat\apache-tomcat-8.5.24\conf\web.xml 文件下查看 DefaultServlet 的配置名称。

 

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值