SpringMVC是javaEE项目表述层开发首选
主要作用:简化前端参数接收与后端数据响应
SpringMVC结构
DispatcherServlet用于处理所有请求,与其他组件联络。要使用web.xml配置(SpringMVC提供)
handlerMapping用于缓存handler方法和地址,放入IoC容器即可(SpringMVC提供)
handlerAdapter适配器,用于简化参数和响应,连接用户和controller,放入IoC容器即可(SpringMVC提供)
Handler又称处理器,是Controller类内部方法的简称,自定义用来接收参数,调用业务,返回响应结果
viewResolver用于查找视图页面,允许用简单的名字查找对应视图,放入IoC容器即可(SpringMVC提供)后端如果返回JSON数据,不返回页面则不需要视图解析器
SpringMVC使用流程
1.声明@Controller方法,return给前端,在方法前加注解@RequestMapping("对外访问地址"),相当于在handlerMapping中注册。加注解@ResponseBody表示直接返回字符串,给前端,不找视图解析器
2.指定RequestMappingHandlerMapping和RequestMappingHandlerAdapter方法,返回new 对象,放入IoC容器中(在创建方法前加@Bean注解),在mvcConfig注解类前加@Configuration注解和@ComponentScan("Controller方法所在的包")
3.写SpringMvcInit类继承抽象类接口AbstractAnnotationConfigDispatcherServletInitializer
接收数据
路径设置注解
精准地址@RequestMapping({"地址一,地址二"})
模糊地址/文件名/*表示文件下任意单层字符串,**表示任意层任意字符串
可以在类上和方法上添加该注解,访问时通过类地址+方法地址访问,方法上没有注解则直接通过类地址访问
默认情况下,任何请求方式都可以访问该地址
修改为POST方式访问,在注解中添加属性:method={RequestMethod.POST,...,}
不符合请求方式会报405异常
可以使用@GetMapping等注解,代替method={RequestMethod.POST,...,}(只能用在方法上)
param和json区别
param key=value&key=value
使用ASCII码
参数无序
仅支持字符串类型,数值类型和布尔类型等简单数据类型
不支持嵌套
简单易读
在GET请求中使用
json {key:value,key:value}
使用UTF-8编码
参数有序
支持复杂类型,如数组,对象等
支持嵌套
在复杂数据结构中更易读
在POST请求中使用
param参数接收
1.参数名=形参名可以直接接值,但是需要传入参数名与形参名一致,并且不传入也不会报错
2.@RequestParam注解,指定绑定的请求参数名,要求请求参数必须传递,不传递则为请求参数提供默认值
@RequestParam注解加入在形参前,属性value为绑定的请求参数名,如果与形参名一致则可以省略,属性required为true则必须传递,不传会报400异常,为false则不必须传递,可以设置defaultValue为默认值
3.一个形参对应多个值,则必须加@RequestParam注解
如果不加注解会将字符串赋值给集合,会报类型异常,加了注解则会使用add方法加入对应字符串
4.使用对象接值,只需要准备一个含有set和get要接收属性方法的实体类即可,多传值不会报错,少传值可以设置默认值
路径参数接收
1.设置动态路径,在@RequestMapping("{参数一}/{参数二}")
2.接受动态路径参数,在形参前加@PathVarible注解,参数名不相同时,只需要@PathVarible("指定路径注解中参数名")即可
json参数接收
1.创建一个接收参数的类
2.接收参数使用该类接收,在前面加@RequestBody注解
java原生api只支持路径参数和param参数,不支持json,会报415异常
要使用该方法需要1.导入json依赖进入pom.xml,2.handlerAdapter配置json转化器,在config类中加入@EnableWebMvc注解
@EnableWebMvc注解
写在MvcConfig类中,不需要自己再创建handlerMapping和handlerAdapter对象
该注解会添加handlerMapping和handlerAdapter,并且会给handlerAdapter添加Jacksonjson处理器
接收cookie数据
在接收的形参前加@CookieValue(value=CookieName)注解
接收请求头在形参前加@RequestHeader(CookieName)
获取原生对象
httpServletRequest,response,session
可以直接在形参列表传入,并且不分先后顺序
要获取ServletContext对象可以通过get方法获取,也可以声明全局变量然后直接AutoWired自动装入IoC容器
响应数据
每个处理业务的方法是一个handler
简化响应数据主要靠简化return值
返回逻辑视图
通过视图解析器指定前后缀
1.在WEB-INF文件夹下创建jsp文件
2.MvcConfig实现WebMvcConfigurer接口,简化组件创建
重写configureViewResolvers方法,通过registry.jsp(路径前缀,路径后缀)设置
3.创建初始化类SpringMVCInit,放入MvcConfig.class和/
3.要查找视图需要返回字符串类型,并且不能添加@ResponseBody,返回值返回视图名称即可
请求转发和响应重定向
请求转发时返回值为字符串,return “forward:/转发地址”
转发只能是项目下的资源,地址为项目下次地址,写根地址后的地址即可
响应重定向时返回值为字符串,return “redirect:/重定向地址”
重定向可以是项目外的资源,属于二次请求,项目下的地址不要写成全地址(SpringMvc协助处理)
不能添加@ResponseBody
返回JSON数据
1.导入依赖
2.使用@EnableWebMvc注解,可以加入json处理器
在返回方法或类前加@ResponseBody注解返回JSON对象,方法返回直接返回类即可
可以用@RestController注解,代替@Controller和@ResponseBody
返回静态资源
正常静态资源会通过handlerMapping寻找,但是找不到对应路径对应的handler方法,所以会报404
想要找到静态资源要通过配置类中重写configureDefaultServletHanding方法,在里面设置configurer.enable()开启静态资源查找
实际是通过DefaultServletHandler方法handlerRequest传入路径,进行转发寻找真实资源
RESTFul风格
http协议的标准使用方案和风格,规范了路径设计,参数传递,请求方式选择
风格特点:1.每个URI代表一种资源
2.客户端使用GET获取资源,POST新建或更新资源,PUT更新资源,DELETE删除资源
3.资源表现形式是XML或JSON
4.客户端与服务端交互在请求间是无状态的,从客户端到服务端每个请求都必须包含理解请求所必须的信息
路径中不要添加动作,不同动作通过请求方式区分,路径中仅作为名词
优点:含蓄安全,风格统一,无状态,严谨规范,简洁优雅
传参方式
请求参数最好在十个以内
敏感信息使用POST传参
get和delete方式没有请求体,只能用路径传参和param传参。参数为id时使用路径传参,范围参数使用param传参
POST和put方式有请求体,可以用三种方法传参,一般用json方式传参
异常处理机制
可以通过编程显式处理异常
可以将异常处理的逻辑从具体业务逻辑中分离出来,通过配置进行统一管理处理,可以从架构层面统一处理异常
单独处理异常的类前加@ControllerAdvice注解,表示发生异常会进入该类处理,根据方法前的@ExceptionHandler(异常类)寻找方法处理。指定的异常可以精确查找或查找父异常
@RestControllerAdvice注解表示@ControllerAdvice加@ResponseBody注解
拦截器
与过滤器对比
相似点:都需要先拦截请求;存在的意义是对请求统一处理;对请求执行了必要操作后放行,
不同点:过滤器工作在Servlet容器中,拦截器工作在SpringMVC基础上;过滤器能拦截整个Web应用,拦截器能拦截整个SpringMVC负责的请求;过滤器想得到IOC容器需要专门的工具方法间接获得,拦截器本身就在IOC容器中,可以直接装配组件
拦截器使用
1.创建拦截器类,实现HandlerInterceptor接口
2.重写方法
preHandle(request,response,handler),请求执行前触发,返回true表示放行
postHandle(request,response,handler,viewer),请求执行后触发,检查结果
afterCompletion(request,response,handler,ex),整体处理完毕后触发,
3.在配置类中配置,addInterceptors(InterceptorRegistry registry){
拦截全部请求
registry.addInterceptor(new 拦截器对象)
指定地址拦截(也可以通过*和**模糊一层或多层字符串)
registry.addInterceptor(new 拦截器对象).addPathPatterns(路径)
排除拦截(排除地址应该在拦截地址范围内)
registry.addInterceptor(new 拦截器对象).addPathPatterns(路径).excludePathPatterns(路径)
}
参数校验
通过JSR-303提供参数校验注解,通过hibernate框架实现,被SpringMVC支持
@NotNull表示包装类型不为null
@NotEmpty检查集合属性是否为null或size==0
@NotBlank检查字符串是否为null或空字符串
使用流程:
1.在实体类属性中添加校验注解
2.在Handler方法接收的形参前加@Validated注解
自己接受错误绑定信息,自定义返回结果:1.在校验对象后加Binding result形参,要紧挨着校验对象
2.if(result.hasErrors()){}有绑定错误就不直接返回,而是自己决定