SpringMVC 进阶

一些情况下我们可能需要对请求进行限制,比如仅允许POST,GET等...

RequestMapping注解中提供了多个参数用于添加请求的限制条件

value 请求地址

path 请求地址

method 请求方法

headers 请求头中必须包含指定字段

params 必须包含某个请求参数

consumes 接受的数据媒体类型 (与请求中的contentType匹配才处理)

produce 返回的媒体类型 (与请求中的accept匹配才处理)

案例:

@RequestMapping(value = "/editCourse",method = RequestMethod.POST,headers = {"id"},params = {"name"},consumes = {"text/plain"},produces = {"text/html"}) //含义:url为/editCourse 请求方法为POST hander必须包含id字段 参数必须包含name 只接受text/plain类型数据 返回数据类型为text/html

为了简化书写,MVC还提供了集合路径和方法限制的注解,包括常见的请求方法:

PostMapping GetMapping DeleteMapping PutMapping 例: @PostMapping("/editCourse") handler返回值

handler方法可以是三种类型的返回值,用于不同场景

ModelAndView

返回值为视图和数据的包装类型,用于返回逻辑视图名称和视图需要展示的数据

等同于在Request中添加了属性,然后进行了请求转发

例:

@RequestMapping("/test") public ModelAndView test() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("index.jsp"); modelAndView.addObject("msg", "hello ssm!"); return modelAndView; } void

表示handler不返回任何数据,用于当需要直接操作response完成响应的场景

例:

@RequestMapping("/test2") public void test2(String name,HttpServletResponse response) throws IOException { response.getWriter().println(name.toUpperCase()); } String

返回一个字符串类型的值,返回的内容可以是视图名称也可以是其他请求地址

其背后采用的是请求转发的方式

例:

@RequestMapping("/test3") public String test3(Model model) { model.addAttribute("msg","hello XXX"); return "index.jsp"; } @RequestMapping("/test4") public String test4() { return "/test"; } 转发和重定向:

也可指定对目标地址的请求是通过重定向或请求转发;

例:

@RequestMapping("/test5") public String test5() { return "forward:/index.jsp"; } @RequestMapping("/test6") public String test6() { return "redirect:/index.jsp"; }

当然了 默认就是forward所以可以省略;

json交互

当下,大多数公司都会有移动端App,当我们的后台服务需要为App提供接口时,就不得不使用到json数据了,当然还有前后端分离项目中前端和后台同样采用json来交换数据;

在开始前,需要导入jackson依赖,用于实现json的序列化与反序列化;

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.9</version> </dependency> 返回json数据

@ResponseBody注解用于标注一个handler方法返回的是json数据,同时方法的返回值将作为返回给前台的数据;

例:

@RequestMapping("/getCourseList") @ResponseBody public List<Course> getCourseList() { //获取所有课程 return courseService.selectCourses(); } @RequestMapping("/getCourse") @ResponseBody public Course getCourse(Integer id) {// 根据id获取一个课程 return courseService.selectByID(id); }

ResponseBody会将响应的ContentType设置为application/json, 然后调用jackson的toJsonString将返回值转为json字符串,最后返回给客户端;

@RestController

如果需要为每一个方法添加ResponseBody的话,就显得非常麻烦,SpringMVC提供了@RestController注解,表示这是一个所有handler返回值全都是json的Controller,相当于把Controller和ResponseBody两个注解合并在一起;

例:

@RestController public class CourseController {.....} 接受json数据

SpringMVC可以帮助我们将json参数反序列化到指定的实体类型,List或Map;

需要强调的是:客户端必须指定ContenType为application/json

@RequestMapping("/addCourse") @ResponseBody public Course addCourse(@RequestBody Course course) {//接收json参数映射到实体 course.setName("接收json成功");//修改name再把数据发回去 以便查看效果 return course; } @RequestMapping("/addCourses") @ResponseBody public List<Course> addCourse(@RequestBody List<Course> courses) {//接收json数组参数映射到list return courses; } @RequestMapping("/addData") @ResponseBody public Map<String,String> addData(@RequestBody Map<String,String> data) {//接收json数据映射到map return data; } @RequestMapping("/addInfo") @ResponseBody public String addInfo(@RequestBody String data) {//接收json数据不做任何转换 return data; }

当客户端传递的json比较复杂时可能无法直接转换到某个实体类型,这是我们可以通过Map来接收,或直接获取原始的json字符串自己处理; 就像上面的addData 和addInfo一样

Handler拦截器

顾名思义Handler拦截器可对Handler方法进行拦截,控制Handler方法是否执行,与Servlet的过滤器非常相似

但是要注意:

​ Servlet的filter的执行时机是在SpringMVC之前,过滤的目标对象是请求;

​ 而Handler拦截器,拦截的目标对象是Handler方法

Handler拦截器可以方便的实现,登录状态验证,操作权限验证等操作;

使用案例:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwjxf.html