ssm 拦截器为什么执行了两次_SSM框架碰到的问题

什么时候用classpath:

这是开发时候的项目结构

2617f90769d8087174bbfaed81ab7b28.png

这是打包发布后的项目结构

925880e09f742fee14aa7fcaeb5e042b.png

"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配置

  1. *.xxx 以指定后缀结尾的请求都交由DispatcherServlet处理。
  2. / 将会覆盖容器的default servlet,会将除.jsp*.jspx以外的所有请求全部拦截,包括静态资源的请求。我们虽然可以通过第一种方法拦截我们想拦截的后缀结尾的请求,但无法实现当下统一的rust风格,但第二种通过该配置是可以实现rustful风格的URL的。
  3. /* 这种请求会拦截所有的请求包括.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中。

dc5276ef8c5387150276cc5b37ccd95b.png

图一中的JspServlet会处理后缀为(*.jsp, *.jspx)的文件,这也就解释了为什么我们可以得到对应页面了,我们可以自己做一个小实验,由于在WEB-INF的jsp无法直接诶访问,我们在WEB-INF外写一个简单的jsp文件,并发送该请求,我们可以直接得到对应的页面,这就是JspServlet的作用。

中文乱码问题

服务端接受客户端的传值出现了中文乱码

解决方案,配置字符拦截器

4885705f459649a2ac03604e955b08c5.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值