SpringMVC第四天

SpringMVC第四天

一、resultful风格 

1.简介

  Restfule风格是一种软件架构风格,而不是标准,只是提供了一种设计原则和约束条件。主要适用于客户端和服务器端交互的软件。是基于http协议实现。
目的是为了提高系统的可伸缩性,降低应用之间的耦合度,方便框架分布式处理程序。基于这个风格的软件可更加的简单、更有层次,更易于实现缓存的机制。
在resultful风格中,用户请求的url使用同一个URL而用请求方式:get/post/delete/put等方式对请求的处理方法进行区分。这样可以在前后台分离的开发中
让前端开发人员不会对请求的资源地址产生混淆,形成一个统一的接口。
  它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
 

2.特点

  (1)每种url代表了一种资源。
  (2)客户端和服务器之间,传递这个资源的某种表现层。
  (3)客户端通过四个http动词,对服务器资源进行操作。实现表现层状态的转化。
 

3.使用规定

在http协议中,四个表示操作方式的动词:GET/POST/PUT/DELETE,他们分别对应四种基本操作。

  GET:对应select:是从服务器查询,可以在服务器通过请求的参数区分查询的方式。
  POST:对应create:在服务器新建立一个资源,调用insert操作。
  PUT:对应update操作:在服务器更新资源,调用update操作。
  DELETE:对应delete操作,从服务器删除资源,调用delete语句。

4.SpringMVC实现resultful接口

  1.四种动作

  Spring MVc 对resstful应用提供了以下支持。
利用@RequestMapping 指定要处理请求的url模板和http请求的动作类型。
利用@PathVariable将url请求模板中的变量映射到处理方法参数上。
前台利用AJAX,在客户端发出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) 

  2.HiddentHttpMethodFilter

  由于浏览器 form 表单只支持 GET 与 POST 请求,而 DELETE、PUT 等 method 并不支持,Spring3.0 添加了一个过滤器,
可以将浏览器请求改为指定的请求方式,发送给我们的控制器方法,使得支持 GET、POST、PUT与 DELETE 请求。

  3.参考例子

    1)在web.xml文件中添加HiddentHttpMethodFilter过滤器
 <filter>
      <filter-name>hiddenHttpMethodFilter</filter-name>
      <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  
  <filter-mapping>
      <filter-name>hiddenHttpMethodFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

     2)控制器中示例代码:

    @RequestMapping(value="{id}",method=RequestMethod.POST)
    public String insert(@PathVariable("id") int id,User user) {
        System.out.println(id);
        System.out.println(user);
        return "list";
    }
    
    @RequestMapping(value="{id}",method=RequestMethod.GET)
    public String find(@PathVariable("id") int id) throws Exception {
        System.out.println(id);
        return "list";
    }
    
    @RequestMapping(method=RequestMethod.PUT)
    @ResponseBody
    public String update(User user) {
        System.out.println(user);    
        return "list";
    }
    
    @RequestMapping(value="{id}", method=RequestMethod.DELETE)
    @ResponseBody
    public String update(@PathVariable int id) {
        System.out.println(id);    
        return "list";
    }    

 

    3)前端测试(使用谷歌插件测试)

 

 由于浏览器只支持get和set,所以前端要传递put和delete ,就只能将表单提交方式改为post,然后增加一个input标签,name属性为_method,value值为PUT或DELETE

 

二、SpringMVC异常处理

  1.异常处理的思路

 

  系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,
后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
  系统的 dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端
控制器交由异常处理器进行异常处理,如下图:

  2.编写异常类和错误页面

@RequestMapping(value="{id}",method=RequestMethod.GET)
    public String find(@PathVariable("id") int id) throws Exception {
        System.out.println(id);
        
        if (id==0) {
            throw new Exception("参数异常");
        }

        return "list";
    }
    
    
    @ExceptionHandler  //局部处理异常
    public ModelAndView error(Exception exception) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",exception.getMessage());
        mv.setViewName("error"); //异常页面名
        return mv;
    }

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--错误信息-->
${error } 
</body>
</html>

 

 

   上述的是局部异常处理,可以用全局异常处理,可以新建一个处理异常的类

 

package com.zhiyou100.zfx.controller;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

@ControllerAdvice
public class ExceptionController {
    
    @ExceptionHandler  //全局异常
    public ModelAndView error(Exception exception) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("error",exception.getMessage());
        mv.setViewName("error");
        return mv;
    }
}

 

 

 

 

 

 

posted on 2019-09-05 19:47  飞升羊羽  阅读(90)  评论(0编辑  收藏  举报

导航