目录
前言
虽然说SSM框架这个技术已经很老了,但是我个人觉得学完之后还是有很多启发的,同时也是作为一个基础去学习后面更多的框架知识。
一、SpringMVC是什么?
(B/S )web开发的轻量级框架。
工作原理
客户端发送一条请求到服务器
DispathcherServlet 前端控制器捕获
前端控制器调用HandlerMapping 映射处理器 ,最后返回一个执行链对象(控制器,拦截器)
HandlerMapping首先会在控制器映射表中查找
控制器映射表(映射地址,控制器,控制器中的实现方法)
拦截映射地址,处理方法
前端控制器 调用 HandlerAdapter ,返回 一个 MAV(ModelAndView)
消息转换器(数据转换)等等,最终去到控制器执行请求
前端控制器----调用---->视图解析器 ------- 返回VIEW
前端控制器----调用-----> VIEW 调用 .render() 渲染模型 并将模型域数据转移请求域
前端控制器交给Tomcat渲染jsp数据
最终由Tomcat返回给客户端渲染后的视图
配置加载流程
Tomcat(Servlet容器) ----加载-----> 部署应用 ----处理(加载解析)----->web.xml
---->web (IoC) 容器
二、所遇到的一些问题
1.中文乱码
视图中的乱码:可以使用字符转换过滤器解决
在web.xml中配置
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是@ResponeBody 或者是使用了@RestController 注解的 输出时是不经过tomcat的渲染,所以这个字符转换过滤器是没有办法解决这两个注解所输出的中文乱码问题。
解决方案有两个
第一个设置每个Mapping的produces属性(数量多了比较麻烦,如果只有几个可以用)
@RequestMapping(value = "/get",produces = "text/html;charset=utf-8")
第二个是配置一个消息转换器(springMVC 的配置文件中)
<mvc:annotation-driven validator="validator" conversion-service="conversionFactoryBean">
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg name="defaultCharset" value="UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
2.路径跳转
重定向与内部转发,我个人理解两者最大的区别就是 是否有携带跳转点的数据。
重定向:是回到服务器进行一次新的的请求,不会携带前面所有的(模型域中的)数据。
内部转发:是携带着模型域中的数据去到转发的映射地址进行操作,前后的视图是共享一个数据域
对映射地址进行重定向时,有 / 则表示从项目根路径开始,没有 / 则从当前父路径 开始
重定向到同个控制器下的映射地址时(使用这个时,不要有空格)
return "redirect:方法的映射地址";
重定向到不同控制器的话,就需要全路径(并不会默认在上下文地址下的)
return "redirect:/设置的上下文地址/控制器映射地址/方法映射地址";
上面两种都是方法返回的重定向
还有一种是使用 http 去进行重定向
resp.sendRedirect("/my-model/Login/show");//方法参数上HttpServletResponse resp
servlet 映射匹配规则
当两个servlet 的映射相同时,项目(自定义的)servlet 会导致 Tomcat 全局servlet 失效
资源竞争规则:两个servlet都符合匹配规则时,以路径精准优先
servlet 映射地址 一定要有 "/" 开头
自定义的servlet 的映射地址不能重复
访问流程 --- mvc的访问流程
Tomcat 自带 DefaultServlet (专门处理静态),而DefaultServlet 的默认映射地址 是 '/'
与前端控制器的映射地址相同,被前端控制器覆盖 导致失效
前端控制器
解决的方法
重新为DefaultServlet配置映射地址
方法2
在springMVC 中 重新启动 DefaultServlet
<mvc: default-servlet-handler/>
这种方式 是当 前端控制器 找不到映射时 启用默认映射
映射地址的区别
/:作为应用的默认Servlet,只处理那些没有被其他Servlet明确映射的请求。
/*:拦截应用中所有的请求,无论这些请求是否已被其他Servlet映射