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"%>

<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;
    }
}

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。