什么时候用classpath:
这是开发时候的项目结构
这是打包发布后的项目结构
"classpath:"指WEB-INF/classes/这个目录。所有的class文件和资源文件都在这个目录下。
- 如果在classes目录外的就需要配classpath:,如web.xml,如果在classes目录内的不需要配,如ssm的xml文件
classpath:entry/dev/spring-mvc.xml
,这只能代表一个文件- classpath*:**/mapper/mapping/*Mapper.xml,这能代表多个文件
一句话就是xml中写classpath,代码文件中直接写路径
转载来源
为什么要配置静态资源过滤
Spring MVC 中的核心 servlet - DispatcherServlet,我们在 web.xml 文件中通常这样定义:
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/conf/spring/mvc-*.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
/意味着,DispatcherServlet会处理所有请求,诸如 /images/a.jpg, /css/hello.css 等这些静态资源请求,我们并没有对应实现的controller,所以有两种配置方式解决
<!--根据请求查找对应的mapping,然后交给默认的 ResourceHttpRequestHandler处理
ResourceHttpRequestHandler的功能就是把location下对应的资源返回
-->
<mvc:resources location="/resources/"mapping="/resources/**"/>
<!--为了便捷,一般这样写-->
<mvc:resources location="/" mapping="/" />
两种方案没有很明显优劣,都可以用
<!--该方案的流程是,采用mapping=='/*'即匹配所有请求
1.当请求controller都无法对应的时候再到该HandlerMapping,由于/*所以必定能匹配
2.然后会将该请求交给DefaultServletHttpRequestHandler,它的功能就是将请求交给tomcat原生defaultservlet执行
3.defaultservlet就是专门来处理资源请求,同样也是查找路径然后返回-->
<mvc:default-servlet-handler/>
Spring MVC 中,访问一个图片,还要走层层匹配。性能肯定好不到哪里去。它们存活于 servlet 容器,只要由 servlet 容器处理这些静态资源,必然要将这些资源读入 JVM 的内存区中。所以,处理静态资源,我们通常会在前端加 apache 或 nginx。
转载来源
urlPattern 中/和/*区别
常见的三种url-pattern配置
*.xxx
以指定后缀结尾的请求都交由DispatcherServlet处理。/
将会覆盖容器的default servlet,会将除.jsp
和*.jspx
以外的所有请求全部拦截,包括静态资源的请求。我们虽然可以通过第一种方法拦截我们想拦截的后缀结尾的请求,但无法实现当下统一的rust风格,但第二种通过该配置是可以实现rustful风格的URL的。/*
这种请求会拦截所有的请求包括.jsp
和*.jspx
,我们常常在配置HiddenHttpMethodFilter
和配置字符编码过滤器CharacterEncodingFilter
的时候通常要将url-pattern配置为/*
,但对于DispatcherServlet配置来说,这是一种错误的配置,我们可以通过请求找到对应的映射,并返回一个.jsp
请求,去请求这个.jsp
视图,但如果我们设置为了/*
DispatcherServlet将会拦截这个请求,并继续去找对应的映射,然而我们不会找到对应的映射,进而报错。
将url-pattern配置为 ‘/’,不拦截.jsp,但为什么依然可以得到对应的.jsp页面呢?
这里有一个比较细节的地方要讲,我们将url-pattern配置为 ‘/’之后,我们不在拦截(.jsp, *.jspx)后缀的文件,但是当Springmvc转发刚刚的请求’/WEB-INF/jsp/test.jsp’,我们依然得到了渲染成功得test.jsp页面,证明虽然DispatcherServlet不在处理拦截(.jsp, *.jspx)后缀的文件,但依然会有别的Servlet拦截了该请求,这里我们无法从我们项目的web.xml文件中查看到该Servlet,这些默认的Servlet存在于我们的TOMCAT中。
图一中的JspServlet会处理后缀为(*.jsp, *.jspx)的文件,这也就解释了为什么我们可以得到对应页面了,我们可以自己做一个小实验,由于在WEB-INF的jsp无法直接诶访问,我们在WEB-INF外写一个简单的jsp文件,并发送该请求,我们可以直接得到对应的页面,这就是JspServlet的作用。
中文乱码问题
服务端接受客户端的传值出现了中文乱码
解决方案,配置字符拦截器