流程:
- 客户端请求提交到 DispatchServlet (前端控制器)
- 由 DispatchServlet 控制器根据请求路径返回一个 HandlerExcutionChain 给 DispatcherServlet
- HandlerExcutionChain:Handler 和 Interceptor集合
- DispatchServlet 调用 HandlerAdapter 适配器
- HandlerAdapter 调用具体的 Handler 处理业务
- Handler 处理结束返回一个集体的 ModelAndView 给适配器
- 适配器将 ModelAndView 给 DispatchServlet
- DispatchServlet 把视图给 ViewResolver 视图解析器
- ViewResolver 返回一个具体的视图给 DispatchServlet
- 渲染视图
- 展示给用户
SpringMVC 控制器是单例的,多线程有线程安全问题,可以使用 ThreadLocal
常用注解
@CookieValue(value="sessionId", required=false)
可让处理方法入参绑定某个 Cookie 值
@RequestParam:只能接收简单参数
@RequestBody:前端请求必须是 POST,能够将 JSON 数据绑定到 Java对象中
不加注解:可以是简单数据类型,也可以是 Java对象,不能接收 Map对象
乱码解决
Post请求
<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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Get请求
-
修改 tomcat配置文件
<ConnectorURIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
-
使用 String 编码转换
String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
拦截器
- 实现 HandlerInterInterceptor 接口
- 继承实现了上面接口的类,如 Spring 提供的抽象类 HandlerInterceptorAdapter
<!-- 配置SpringMvc的拦截器 -->
<mvc:interceptors>
<!-- 配置一个拦截器的Bean就可以了 默认是对所有请求都拦截 -->
<bean id="myInterceptor" class="com.dyq.action.MyHandlerInterceptor"></bean>
<!-- 只针对部分请求拦截 -->
<mvc:interceptor>
<mvc:mapping path="/modelMap" />
<bean class="com.dyq.action.MyHandlerInterceptorAdapter" />
</mvc:interceptor>
</mvc:interceptors>