SpringMVC详尽知识点思维导图
2021-07-27 18:15:27 0 举报
AI智能生成
非常详细的介绍springmvc知识点
作者其他创作
大纲/内容
处理流程
DispatherServlet
接收客户端请求并分发
web.xml中配置核心Servlet
HandlerMapping
根据请求url查找对应的处理【类】(控制层)
常用接口
BeanNameUrlHandlerMapping
【自动的】将访问url与xml中bean配置的id一一对应,不需要显式配置
SimpleUrlHandlerMapping
【手动】通过K/V的方式将url和bean id一一对应,使用时需要显式声明
RequestMappingHandlerMapping
主要是针对注解配置@RequestMapping的
HandlerAdapter
在查找到控制层所在类后辨识对应的处理【方法】并且调用
常用接口
HttpRequestHandlerAdapter
SimpleControllerHandlerAdapter
RequestMappingHandlerAdapter
Handler/Controller核心
方法入参绑定
Servlet原生API
可直接使用
1.HttpServletRequest
2.HttpServletResponse
3.HttpSession
4.Writer
5.Reader
6.OutputStream
7.InputStream
8.java.security.Principal
页面参数传递
基本类型和对象类型 : name与表单相同可以直接使用,
不同则需要使用@RequestParam("表单name")注解在入参类型前
文件类型 使用MultiPartFile类型接收
集合类型 : 需要绑定在对象上使用,直接使用需要强制加@RequestParam
ModelAndView
Model
本质上是一个Map<String,?>
用于存放页面数据,通过addObject()和构造方法注入
View
不是真正的 View,只是一个视图名称,之后通过ViewResolver解析为View
默认为转发,需要重定向时在视图名前加上 redirect: 即可
常用注解
@RequestMapping 请求映射
属性
value 指定访问url
method 指定访问方式
RequestMethod.
get
post
put
delete
...
params 指定请求数据必须(不)包含的内容
包含使用"键=值"的形式
不包含使用"!值"
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
consumes 指定接收请求数据类型
application/json
text/html
produces指定返回数据类型
指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
@RequestParam 请求参数
@ModelAttribute
@SessionAttributes 将参数放入session中
@PathVariable RESTful风格url
RESTful风格的一大特点是使用url作为资源定位的唯一方式,即:
不使用get式的?键=值向后台传值,而使用 项目名/路径/参数值1/参数值2/ 来传递参数
使用名词作为url,不使用动词
@responseBody Ajax返回json数据
@CookieValue 获取cookie内容
@InitBinder 结合WebDataBinder对象
对复杂类型数据进行转换
实例1:域对象的绑定
@InitBinder("userDto") //指定方法接收域对象使用形参的对象名
public void binder(WebDataBinder binder)
{
//如果前台使用userDto作为域模型,用此方法进行类型绑定
binder.setFieldDefaultPrefix("userDto.");
}
前台可以使用userDto.name=a&userDto.pwd=b 传输数据给userDto
实例2:日期等复杂类型绑定
@InitBinder()
public void binder(WebDataBinder binder) {
//自定义数据匹配规则
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//注册类型转换规则registerCustomEditor(要转换的类型,转换器)
//CustomDateEditor 是一个系统自带日期转换器,构造函数(日期格式, 是否可为空)
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
ViewResolver
AbstractCachingViewResolver 抽象类
UrlBasedViewResolver 实现类,
需要指定解析后的View类型
InternalResourceViewResolver 【最常用】
默认View类型为InternalResourceView
FreeMarkerViewResolver
默认View类型为InternalResourceView
VolocityViewResolver
默认View类型为VolocityView
XmlViewResolver 通过xml文件指定ViewName和View的对应关系
ResourceBundleViewResolver 通过classpath根目录下的.properties文件指定
BeanNameViewResolver
根据beanName解析ViewName
常用功能
xml配置文件
多方法Servlet【配置方式】
xml中配置多方法解析器
<bean id="multiActionResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="action"></property>
</bean>
Servlet类需要继承MultiActionController类,
且注册类时需要配置属性methodNameResolver引用多方法解析器
<bean id="/userLogin" class="com.zl.controller.UserController">
<property name="methodNameResolver" ref="multiActionResolver"></property>
</bean>
前台调用时使用****/userLogin?action=方法名
ajax
引入jackson的jar包
用于将数据转为json格式输出
方法返回值可以是任意类型
在返回值类型前加@ResponseBody 标注 或者
在方法上面加@ResponseBody 标注
文件上传下载
文件上传
xml中注册 文件上传处理器,注意<<<<id是固定的,会自动注入,不要随便更改>>>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 文件大小限制 -->
<property name="maxUploadSize" value="10000000"/>
<!-- 编码-->
<property name="defaultEncoding" value="utf-8"/>
</bean>
MultipartFile 处理上传文件类
【作为入参,且标注@requestParam("name属性值")】
getOriginalFilename() 获取上传文件名
transferTo(file) 将文件保存到指定文件中
注意无论是否上传对象都不为空,需要通过isEmpty()判断是否存在文件
文件下载
方案一: 使用servlet容器方法
response的write直接写到客户端
方案二: 使用SpringMVC的方法解耦
拦截器
HandleInterceptor 接口
boolean preHandle(request, response, Object handler) 【前置拦截】
void postHandle(request, response, Object handler, ModelAndView modelAndView) 【后置拦截】
void afterCompletion(request, response, Object handler, Exception ex)
【完成后拦截】只在preHandle执行结果为true时执行
拦截器调用顺序.png
拦截器和过滤器的区别
原理
反射
函数回调
容器依赖
servlet容器
不依赖Servlet
使用位置
servlet前后
+ 方法前后、异常前后..
可用资源
request和response
+ 所在框架的各种资源皆可注入
用途
字符编码统一、非法字符过滤
请求数据压缩
用户登录验证、
日志记录
问题总结
静态资源的放行
指定默认放行url
<mvc:default-servlet-handler/>
web.xml配置如下:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
指定资源文件路径
<mvc:resources location="/js/" mapping="/js/**"/>
指定拦截器放行
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/**/user*"/>
<bean class="com.zl.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
配置静态资源放行后无法访问controller???
配置静态资源放行后,必须要显式的开启 <mvc:annotation-driven/>
前台传来无法直接接受的数据类型??
使用@InitBinder和WebDataBinder解决
日期格式参数传递
【直接作为入参】String方式接收,使用simpleDateFormat自行转换
【对象属性传递】需要在对象类中给属性加上注解
@DateTimeFormat(pattern="yyyy-MM-dd")
【使用类型转换器】
前台传来数据空指针?
前台传来的基本数据类型数据使用包装类接收,
否则null值数据转换为基本数据类型时报错
前后缀问题
在使用视图解析器定义前后缀后,会在解析视图时加上;
但是当显式使用redirect: 和forward: 时,不会自动加上前后缀
字符编码的统一处理
web.xml中加上过滤器
数据从一个controller传递到另一个controller
使用get拼接的方式 url...?key=value&key=value
使用RedirectAttributes对象的addAttribute(key,value)方法,跳转的controller入参即可接收

收藏
0 条评论
下一页