今天用springmvc搭建项目时,遇到了一个以前没有注意到的问题,在此记录一下。
问题描述
web.xml(部分配置)
welcome-file>/index.jsp
spring mvc servlet
springMvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/spring-mvc.xml
1
springMvc
/*
30
404
/404.jsp
500
/500.jsp
java.lang.Throwable
/500.jsp
sping-mvc.xml的配置(部分):
UTF-8
104857600
4096
测试控制器类:
package com.tooklili.app.web.controller.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* 测试控制器
* @author shuai.ding
* @date 2017年5月26日下午5:45:25
*/
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/test")
@ResponseBody
public String test(){
return "test";
}
@RequestMapping("toView")
public String toView(){
return "view";
}
}
页面webapp/WEB-INF/views/view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
测试页面
通过上面配置,访问*****/test/toView页面
jsp没有被解析
再看一个诡异现象,如果将spring-mvc.xml中的
后台的打印是不是也很诡异,这些现象都是怎么回事呢?
原因分析
关于第一个jsp没有被解析的问题,通过上述描述,应该和
关于将
查看自己的配置,发现springmvc的servlet的映射地址配置的是/*,可能这个地方有问题。
在这我们来探讨一下两个问题:
1) springmvc的servlet的配置中/和/*有什么区别
2)
关于问题1:
/*是拦截了所有的请求,包括视图解析后跳转的.jsp页面,/则不会拦截视图解析后的jsp页面。
关于问题2:
servlet在找页面时,走的是dispatcherServlet路线。找不到的时候会报404
加上这个默认的servlet时候,servlet在找不到的时候会去找静态的内容。
所以当我们访问*****/test/toView页面,
1)首先经过dispatcherServlet,找到页面view.jsp
2)访问view.jsp,再次经过dispatcherServlet,springmvc中没有这样的映射,随后走了
3)如果没有配置
解决方法
Springmvc的servlet配置改成如下:
spring mvc servlet
springMvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/spring-mvc.xml
1
springMvc
/
总结一下
对于springmvc的servlet拦截匹配规则,即(
1、拦截*.do、*.html,例如:/a/test.do
这个配置比较传统,简单,不易出错,不会导致静态文件(jpg、css、js)被拦截。
2、拦截/,例如:/a/test
可以实现现在很流行的REST风格,会导致静态文件(jpg、css、js)也被拦截,此时需要配置,让静态文件可访问,如配置
3、拦截/*
这是个错误配置,请求可以转到action,但转到jsp时,会再次被拦截,最终导致页面访问不了的现象。