Spring Mvc 配置web.xml中的servlet-mapping时遇到的问题

本文记录了一次SpringMVC项目中视图渲染的问题排查过程。由于对SpringMVC的配置不当,导致视图渲染完成后再次被错误地作为请求处理,最终引发404错误。文章详细分析了问题的原因,并提供了正确的配置建议。

今天在优化一个项目,因为是优化所以会有很多对原有代码的调整。对Spring mvc配置的路径进行了配置如下:

修改前

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/smart/*</url-pattern>
    </servlet-mapping>

修改后

    <servlet-mapping>
        <servlet-name>appServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

因为疏忽和对spring mvc拦截机制的了解不够彻底导致无法获得无法返回视图,控制台输出如下log日志。

2016-12-11 17:12:11|DEBUG| [DefaultListableBeanFactory-->invokeInitMethods] --- Invoking afterPropertiesSet() on bean with name 'WEB-INF/views/login.jsp'
2016-12-11 17:12:11|DEBUG| [DispatcherServlet-->render] --- Rendering view [org.springframework.web.servlet.view.JstlView: name 'WEB-INF/views/login.jsp'; URL [/WEB-INF/views/login.jsp]] in DispatcherServlet with name 'appServlet'
2016-12-11 17:12:11|DEBUG| [JstlView-->renderMergedOutputModel] --- Forwarding to resource [/WEB-INF/views/login.jsp] in InternalResourceView 'WEB-INF/views/login.jsp'
2016-12-11 17:12:11|DEBUG| [DispatcherServlet-->doService] --- DispatcherServlet with name 'appServlet' processing GET request for [/saa/WEB-INF/views/login.jsp]
2016-12-11 17:12:11|DEBUG| [RequestMappingHandlerMapping-->getHandlerInternal] --- Looking up handler method for path /WEB-INF/views/login.jsp
2016-12-11 17:12:11|DEBUG| [RequestMappingHandlerMapping-->getHandlerInternal] --- Did not find handler method for [/saa/WEB-INF/views/login.jsp]
2016-12-11 17:12:11|WARN | [PageNotFound-->noHandlerFound] --- No mapping found for HTTP request with URI [/saa/WEB-INF/views/login.jsp] in DispatcherServlet with name 'appServlet'
2016-12-11 17:12:11|DEBUG| [DispatcherServlet-->doService] --- DispatcherServlet with name 'appServlet' processing GET request for [/saa/404.html]
2016-12-11 17:12:11|DEBUG| [RequestMappingHandlerMapping-->getHandlerInternal] --- Looking up handler method for path /404.html
2016-12-11 17:12:11|DEBUG| [RequestMappingHandlerMapping-->getHandlerInternal] --- Did not find handler method for [/404.html]
2016-12-11 17:12:11|WARN | [PageNotFound-->noHandlerFound] --- No mapping found for HTTP request with URI [/saa/404.html] in DispatcherServlet with name 'appServlet'
2016-12-11 17:12:11|DEBUG| [DispatcherServlet-->processRequest] --- Successfully completed request
2016-12-11 17:12:11|DEBUG| [DefaultListableBeanFactory-->doGetBean] --- Returning cached instance of singleton bean 'org.springframework.context.annotation.internalScheduledAnnotationProcessor'
2016-12-11 17:12:11|DEBUG| [DispatcherServlet-->processRequest] --- Successfully completed request
2016-12-11 17:12:11|DEBUG| [DispatcherServlet-->processRequest] --- Successfully completed request
2016-12-11 17:12:11|DEBUG| [OpenSessionInViewFilter-->doFilterInternal] --- Closing Hibernate Session in OpenSessionInViewFilter

经过多日志分析发现,输出的日志中有视图渲染的操作

[DispatcherServlet-->render] --- Rendering view [org.springframework.web.servlet.view.JstlView: name 'WEB-INF/views/login.jsp'; URL [/WEB-INF/views/login.jsp]] in DispatcherServlet with name 'appServlet'
[JstlView-->renderMergedOutputModel] --- Forwarding to resource [/WEB-INF/views/login.jsp] in InternalResourceView 'WEB-INF/views/login.jsp'

在渲染后的spring mvc会输出成功或者找到视图,在看下面的日志后发现spring mvc又拦截了自己渲染视图的forward的操作,正常的渲染视图操作被解析为forwod后就会把视图的url当做请求的url,在第二次请求时因为没有找到对应Controller导致抛出404错误。

[DispatcherServlet-->doService] --- DispatcherServlet with name 'appServlet' processing GET request for [/saa/WEB-INF/views/login.jsp]
[RequestMappingHandlerMapping-->getHandlerInternal] --- Looking up handler method for path /WEB-INF/views/login.jsp
[RequestMappingHandlerMapping-->getHandlerInternal] --- Did not find handler method for [/saa/WEB-INF/views/login.jsp]
[PageNotFound-->noHandlerFound] --- No mapping found for HTTP request with URI [/saa/WEB-INF/views/login.jsp] in DispatcherServlet with name 'appServlet'
[DispatcherServlet-->doService] --- DispatcherServlet with name 'appServlet'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值