SpringMVC学习五(resultful风格/异常处理/注解)
- resultful风格
- 异常处理
1.Restfule风格
Restfule风格是一种软件架构风格,而不是标准,只是提供了一种设计原则和约束条件。主要适用于客户端和服务器端交互的软件。是基于http协议实现。目的是为了提高系统的可伸缩性,降低应用之间的耦合度,方便框架分布式处理程序。基于这个风格的软件可更加的简单、更有层次,更易于实现缓存的机制。
在resultful风格中,用户请求的url使用同一个URL而用请求方式:get/post/delete/put等方式对请求的处理方法进行区分。这样可以在前后台分离的开发中让前端开发人员不会对请求的资源地址产生混淆,形成一个统一的接口。
使用区别:在http协议中,四个表示操作方式的动词:GET/Post/put/Delete,他们分别对应四种基本操作。Get用来获取资源。post用来新建立资源,也可以更新资源。put用来更新资源。Delete用来删除资源
一般格式如下:
@RequestMapping(value="{id}",method=RequestMethod.GET)
@RequestMapping(value="{id}",method=RequestMethod.POST)
@RequestMapping(value="{id}",method=RequestMethod.DELETE)
@RequestMapping(value="{id}",method=RequestMethod.PUT)
现在controller类中进行使用如下:
1 @Controller 2 @RequestMapping("users") 3 public class UsersController { 4 5 @RequestMapping(value="{uid}",method=RequestMethod.GET)//查询 6 public String fingById(@PathVariable("uid") int id) { 7 System.out.println("===findbyid==="); 8 int a=10/0; 9 return "index"; 10 } 11 12 @RequestMapping(method=RequestMethod.POST)//添加 13 public String addUsers(Users users) { 14 System.out.println("===addUsers==="); 15 System.out.println(users); 16 return "index"; 17 } 18 19 @RequestMapping(method=RequestMethod.PUT)//修改 20 @ResponseBody 21 public String updateUsers(Users users) { 22 System.out.println("===updateUsers==="); 23 System.out.println(users); 24 return "index"; 25 } 26 27 @RequestMapping(value="{id}", method=RequestMethod.DELETE)//删除 28 @ResponseBody 29 public String delete(@PathVariable int id) { 30 System.out.println(id+"===delete==="); 31 return "index"; 32 } 33 }
编写完成后进行测试,在这里我们用一个google的插件进行测试,可以选择提交方式等十分的方便
测试GET和POST均通过,显示200状态码(通过)
而对于其中的PUT和DELETE我们在测试时发现并不能正确通过
因为浏览器端只可通过GET和POST,所以我们需要在测试时添加属性_method=PUT/_method=DELETE,对应的需要在配置文件中加入一个过滤器【HiddenHttpMethodFilter】这个过滤器的作用是将POST提交的_method=PUT/_method=DELETE通过转化为PUT/DELETE
1 <filter> 2 <filter-name>hiddenHttpMethodFilter</filter-name> 3 <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 4 </filter> 5 <filter-mapping> 6 <filter-name>hiddenHttpMethodFilter</filter-name> 7 <url-pattern>/*</url-pattern> 8 </filter-mapping>
至此测试通过如下
2.异常处理
在上面的controller类中大家可能发现有一个地方会出错,抛出异常即int a=10/0,我们现在进行处理;
1 @RequestMapping(value="{uid}",method=RequestMethod.GET)//查询 2 public String fingById(@PathVariable("uid") int id) { 3 System.out.println("===findbyid==="); 4 int a=10/0;//抛出异常 5 return "index"; 6 }
对于此异常有两种处理方式,实际算是一种吧,看个人理解
第一种:在本类中加入以下代码
//该类中发生异常时由该方法来处理 @ExceptionHandler public ModelAndView error(Exception exception) { ModelAndView mv=new ModelAndView(); mv.addObject("error", exception.getMessage()); mv.setViewName("error"); return mv; }
当该类中发生异常时由该方法来处理,对应的可以在前端页面进行接收这个错误信
第二种:新建一个类,用来接收获得的所有的异常,以此避免在每一个类中进行异常处理
1 @ControllerAdvice 2 public class ExceptionController { 3 4 //该类中发生异常时由该类来处理 5 @ExceptionHandler 6 public ModelAndView error(Exception exception) { 7 ModelAndView mv=new ModelAndView(); 8 mv.addObject("error", exception.getMessage()); 9 mv.setViewName("error"); 10 return mv; 11 } 12 }
前端页面代码,其中需加入isErrorPage="true"属性,意思是此页面为错误信息显示页面,我们再次接收错误信息,当处理了上面的异常后跳出到这里显示
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" isErrorPage="true"%> 3 <!DOCTYPE html> 4 <html> 5 <head> 6 <meta charset="UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 ${error } 11 </body> 12 </html>
测试结果,成功显示异常信息:
Tips(SpringMVC部分注解)
SpringMVC注解:
1@Controller:标注该类为控制层类
2.@RequestMapping:标注请求的地址
3.@ResponseBody:把java对象转化为json对象
4.@Valid:标注校验该数据
5.@PathVariable:接收uri地址的值赋值给参数
6.@SessionAttributes:保存到Session中
7.@RequestParam:接收参数若参数名不同可用,当没传参数值时可设置默认值
8.@ExceptionAdivice:标注一个类为异常处理类
9.@EcceptionHandler:标注一个方法为异常处理方法
10.@InitBinder:时间参数处理格式