Springmvc 笔记

Spring mvc 简介

什么是Springmvc?

SpringMVC属于Spring大框架下的一个模块,解决了Spring原本不能解决MVC控制访问的问题,SpringMVC并不是单独存在的一个框架。

springmvc 也是spring webmvc ,属于表现层框架,Spring Mvc 是spring 框架的一部分 是在 Spring3.0 后发布的。

在Spring整体的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中容器不一定只有一个,Spring中可以包括多个容器,而且容器间有上下层关系。

Mvc 的设计思想

mvc 即Model + view+controler 将应用按照Model (模型),view (视图),Controller(控制) 这样的方式分离

视图(view):代表用户交互界面,对于web 应用来说,可以是Html ,也可能是jsp等

模型(model)是业务的处理以及业务规则的制定,模型接受视图请求的数据并返回最终的处理结果

控制(Controller)可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求

Spring mvc 解决了什么问题?

Springmvc 是一个mvc 框架,解决了mvc 框架做的事情,而且优化了原始mvc 的流程,简化了操作的过程

java web传统的Mvc 模式

传统的serlvetMVC访问,耦合度较强,web处理内容较多,处理复杂,代码杂乱无章,数据处理麻烦,常常以各种后缀结尾不利于rest的访问

Spring mvc 的优点

  • 能非常简单的设计出干净的web 层和薄薄的WEB层
  • 进行更加简洁的web 层的开发
  • 天生与Spring 框架集成(如IOC 容器 ,Aop 等)
  • 提供强大的约定大于配置的契约式编程支持
  • 非常灵活的数据验证,格式化和数据绑定
  • 支持restful 风格

为什么要使用Spring mvc ?

spring mvc 对比原始的mvc 所具有的优点

Spring mvc 运行流程

  • 用户发送请求到前端控制器 DispatcherServlet
  • DispatcherServlet收到请求调用HandlerMapping 处理器映射器
  • 处理器映射器根据请求的url 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
  • DispatcherServlet通过HandlerMapping处理器适配器调用处理器
  • 执行处理器(Controller ,也叫后端控制器)
  • Controller 执行完成返回ModelAndView
  • HandlerAdapter 将Controller 执行结果ModelAnd View 返回给 DispatcherServlet
  • DispatcherServlet 将ModelAndView 传给ViewReslover 视图解析器
  • ViewReslover 解析后返回具体View
  • DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
  • DispatcherServlet返回给用户

说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。

需要用户开发的组件有handlerview

Spring 的第一个demo

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">


  <display-name>Archetype Created Web Application</display-name>
<!--  配置前端控制器-->
  <servlet>
    <servlet-name>springmvc01</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
  </init-param>

  </servlet>
<!--  映射-->
  <servlet-mapping>
    <servlet-name>springmvc01</servlet-name>
<!--    设置所有以action 结尾的请求进入Springmvc-->
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>
</web-app>

Springmvc.xml (我懒得配置视图解析器)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--扫描controller 包-->
<context:component-scan base-package="com.jj"></context:component-scan>
<!--    加入mvc 的注解-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>
Controller 类
package com.jj.controller;

import com.jj.pojo.Vip;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

//加入注解
@org.springframework.stereotype.Controller
public class Controller {
//写方法
//    方法注解
    @RequestMapping("/hello")
    public ModelAndView demo(String name,String pwd){

        ModelAndView mv = new ModelAndView();
//        设置到视图
        mv.addObject("name",name);
        mv.addObject("pwd",pwd);
        System.out.println(name);
        mv.setViewName("success.jsp");
        return mv;
    }
}

剩下的就是简单的jsp 跳转了

<html>
<body>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<form method="get" action="hello.action">
    <input type="text" name="name">
<br>
    <input type="password" name="pwd"><br>
    <input type="submit" value="提交">

</form>
</body>
</html>

如何接受参数,接受参数的几种方式

既可以像servlet一样接收参数,也能直接使用参数名接收,还能像同类型的框架struts2类似使用JavaBean接收参数。

除此之外还有几个注解也能用来接收参数。

例如:

@PathVariable接收URL中的请求参数

@RequestParam接收请求参数

@ModelAttribute接收请求参数

JAVABEAN 接受参数

package com.jj.controller;

import com.jj.pojo.Vip;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

//加入注解
@org.springframework.stereotype.Controller
public class Controller {
//写方法
//    方法注解
    @RequestMapping("/hello")
    public ModelAndView demo(Vip vip){

        ModelAndView mv = new ModelAndView();
//        设置到视图
        mv.addObject("name",vip.getName());
        mv.addObject("pwd",vip.getPwd());
//        System.out.println(name);
        mv.setViewName("success.jsp");
        return mv;
    }
}

实体类

 

参数名直接接受

package com.jj.controller;

import com.jj.pojo.Vip;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

//加入注解
@org.springframework.stereotype.Controller
public class Controller {
//写方法
//    方法注解
    @RequestMapping("/hello")
    public ModelAndView demo(String name,String pwd){

        ModelAndView mv = new ModelAndView();
//        设置到视图
        mv.addObject("name",name);
        mv.addObject("pwd",pwd);
//        System.out.println(name);
        mv.setViewName("success.jsp");
        return mv;
    }
}

返回值

SpringMVC可以servlet一样接收参数,springmvc本身就是基于servlet的一个框架那么serlvet也可以向servlet一样使用HttpServletRequest像前台传递返回值,但是需要使用HttpServletRequest接收参数。

就像刚才的接收参数一样!SpringMVC作为一个独立的框架除了像servlet一样接收参数也有自己的方式向前台传值。

之前一直使用的ModelAndView对象,可以用来向jsp页面传值。

mv.addObject(键, 值);前台接收方式跟servlet接收一样。

前台用el 表达式即可获取参数

<%--
  Created by IntelliJ IDEA.
  User: 可爱的小仙女
  Date: 2020/11/24
  Time: 21:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Springmvcday01 </h1>
<h2>${name},${pwd}</h2>

</body>
</html>

Springmvc 数据从前台传递后台的流程有那几步?

1,http 请求 num (字符串) 日期类型 2000-01-15(字符串)

2,Springmvc

3,类型转换

4,Controller 方法,num 参数,integer 对象 日期类型 Date 对象

Converter 和Formatter 有什么不同?

Converter 和Formatter 对比

Converter 可以将一种类型转换为另一个种类类型的对象,可用于任何层

Formatter 格式化只能将String 类型转换为另一种类型,只适用于Web 层

Spring Mvc 的静态资源

使用容器默认servlet 标签,defaultServlet 来处理静态文件

  <!--  配置静态文件-->
  <servlet-mapping>
    <servlet-name>default</servlet-name>
<!--    设置所有以action 结尾的请求进入Springmvc-->
    <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>

2,在spring 3.0.4 以后版本提供了mvc:resourxes;

<mvc:resources mapping="/img/" location="/img/**"></mvc:resources>

3,使用mvc:default-servlet-handler/'

<mvc:default-servlet-handler></mvc:default-servlet-handler>

给DispatcherServlet 拦截的url 加后缀,也可以避免静态资源冲突

Springmvc 文件上传

1导入依赖

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.2</version>
    </dependency>

配置文件的修改

<!--    配置文件上传解析器,一定要给id -->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--上传文件的最大大小,单位为字节 -->
        <property name="maxUploadSize" value="17367648787"></property>

        <!-- 上传文件的编码 -->
        <property name="defaultEncoding" value="UTF-8"></property>
    </bean>

jsp 页面提供表单

上传表单必须method 是post

上传表单域enctype 属性必须为

multipart/form-data
<%--
  Created by IntelliJ IDEA.
  User: 可爱的小仙女
  Date: 2020/12/3
  Time: 15:11
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="upload.action" method="post" enctype="multipart/form-data">
头像:<input type="file" name="file"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

控制类

@RequestMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest req)
        throws IllegalStateException, IOException {

    // 判断文件是否为空,空则返回失败页面
    if (file.isEmpty()) {
        return "failed";
    }
    // 获取文件存储路径(绝对路径)
    String path = req.getServletContext().getRealPath("/webapp/WEB-INF/file");
    // 获取原文件名
    String fileName = file.getOriginalFilename();
    // 创建文件实例
    File filePath = new File(path, fileName);
    // 如果文件目录不存在,创建目录
    if (!filePath.getParentFile().exists()) {
        filePath.getParentFile().mkdirs();
        System.out.println("创建目录" + filePath);
    }
    // 写入文件
    file.transferTo(filePath);
    return "success.jsp";
}

结果

[2020-12-03 04:04:16,232] Artifact Springmvc01:war exploded: Artifact is being deployed, please wait...
03-Dec-2020 16:04:18.357 信息 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 至少有一个JAR被扫描用于TLD但尚未包含TLD。 为此记录器启用调试日志记录,以获取已扫描但未在其中找到TLD的完整JAR列表。 在扫描期间跳过不需要的JAR可以缩短启动时间和JSP编译时间。
[2020-12-03 04:04:18,455] Artifact Springmvc01:war exploded: Artifact is deployed successfully
[2020-12-03 04:04:18,455] Artifact Springmvc01:war exploded: Deploy took 2,223 milliseconds
03-Dec-2020 16:04:26.135 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 部署 web 应用程序目录 [D:\工具\apache-tomcat-9.0.14-windows-x64\apache-tomcat-9.0.14\webapps\manager]
03-Dec-2020 16:04:26.194 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\工具\apache-tomcat-9.0.14-windows-x64\apache-tomcat-9.0.14\webapps\manager] has finished in [59] ms
03-Dec-2020 16:04:29.619 信息 [http-nio-8080-exec-5] org.springframework.web.servlet.FrameworkServlet.initServletBean Initializing Servlet 'springmvc01'
03-Dec-2020 16:04:30.572 信息 [http-nio-8080-exec-5] org.springframework.web.servlet.FrameworkServlet.initServletBean Completed initialization in 953 ms
创建目录E:\Springmvc01\target\untitled2\webapp\WEB-INF\file\22.jpg

文件下载

web 应用程序文件下载功能实现需要设置以下响应信息

1,设置文件的内容类型,如果不确定内容类型,可以设置为 application/octet-stream

2,设置响应头信息Content-Disposition和下载文件名:

ttachment:filename +自己要下载的名字

完成以上响应内容类型和头信息的设置后,通过以下步骤实现下载功能:

思路:

获取响应对象的字节输出流

创建文件字节输入流

通过文件字节输入流读取文件数据

通过响应对象的字节输出流将文件数据写出到客户端

通过

HttpServletResponse response 对象实现下载功能
/文件下载
    @RequestMapping("/download")

    public void download(HttpServletResponse response,String name) throws Exception {
        File file = new File(name);
        System.out.println(file);
        System.out.println("11111111111");
//        String name = file.getName();
//        将文件名进行编码避免乱码
        name= new String(name.getBytes("UTF-8"), "iso8859-1");
//        设置响应的头信息
        response.addHeader("content-disposition","attachment:filename"+name);
//        设置响应内容类型
        response.setContentType("application/octet-stream");
//        获取字节输出流
        ServletOutputStream outputStream = response.getOutputStream();
//        获取输入流
        FileInputStream in = new FileInputStream(file);
//        数据的写入
        byte[] bytes = new byte[1024];
//        设置长度
        int length=0;
//        如果长度不等于负一接着写入。
        while ((length=in.read(bytes))!=-1){
            outputStream.write(bytes,0,length);

        }
//        关流
        outputStream.close();
        in.close();
    }

前台页面

<%--
  Created by IntelliJ IDEA.
  User: 可爱的小仙女
  Date: 2020/12/4
  Time: 12:08
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="download.action">
    <input type="text" name="name"></form>
    <input type="submit" value="提交">
<%--<a href="img/QQ图片20190721202635.jpg" name="file">点击下载</a>--%>
</form>
</body>
</html>

方式二下载 Springmvc 中可以通过REsponseEntity将二进制字节数据封装到响应正文中输出到客户端从而实现下载功能

 

//方式二下载
    @RequestMapping("/download")
    public ResponseEntity<byte[]> download(String name) throws Exception {
//获取File
        File file = new File(name);
        System.out.println(file);
获取要下载的名字
//        name = file.getName();
//        对文件名进行编码
        name= new String(name.getBytes("UTF-8"), "iso8859-1");
//        创建HttpHeader 对象
        HttpHeaders httpHeaders = new HttpHeaders();
//        设置Content-Dispostion 头信息
        httpHeaders.setContentDispositionFormData("attachment",name);
//        设置内容类型
        httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//        将文件内容转换为字节数组,因为一次性将文件内容读取到内存中,大文件可能会移除
        byte[] bytes = FileUtils.readFileToByteArray(file);
        ResponseEntity<byte[]> entity = new ResponseEntity<>(bytes, httpHeaders, HttpStatus.CREATED);
        return entity;
    }

方式二下载的图片直接就是图片,方式一下载的是一个地址。

处理json 格式

导入jackson 相关的依赖

    <!--*****************************json 依赖********************************-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.10.0</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.10.0</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.10.0</version>
    </dependency>

在进行post 类型请求时,使用@RequestBoby 绑定请求处理方法的形参,Springmvc 会根据请求的内容类型(Content-type)调用不同的HTTPmessageConverter 将请求中文中的数据转换为对应的java 对象绑定到指定的形参上

//    可以通过 注解接受到的JSON 格式字符串转换成javabean
    @RequestMapping("/demo")

    public String jsonToBean(@RequestBody Vip vip){
        System.out.println("我来了");
        System.out.println(vip);
        return "demo";
    }

进行post 请求页面,注意需要指定正文中内容类型,Springmvc 根据请求的内容类型调用不同HttpMessageConverter 处理正文中数据转换为java 对象


<script type="text/javascript">
    <%--    写 js--%>
    $(function () {
//点击事件
        $("#btn").on("click",function (event) {
            alert("aaaa")
            var date='{"id":1,"name":"娇娇","pwd":"1234","date1":"2000-01-15"}';
            $.ajax({
                url:"demo.action",
                type:"post",
                contentType:"application/json",
                data:date,
                success:function (data) {
                    alert("成功!!!!")
                },
                dataType:"json"
            })
        })
    })

</script>

结果

[2020-12-04 05:39:59,049] Artifact Springmvc01:war exploded: Deploy took 2,671 milliseconds
04-Dec-2020 17:40:06.305 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory 部署 web 应用程序目录 [D:\工具\apache-tomcat-9.0.14-windows-x64\apache-tomcat-9.0.14\webapps\manager]
04-Dec-2020 17:40:06.384 信息 [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [D:\工具\apache-tomcat-9.0.14-windows-x64\apache-tomcat-9.0.14\webapps\manager] has finished in [80] ms
04-Dec-2020 17:40:06.533 信息 [http-nio-8080-exec-4] org.springframework.web.servlet.FrameworkServlet.initServletBean Initializing Servlet 'springmvc01'
04-Dec-2020 17:40:08.432 信息 [http-nio-8080-exec-4] org.springframework.web.servlet.FrameworkServlet.initServletBean Completed initialization in 1898 ms
我来了
Vip{id=1, name='娇娇', pwd='1234', date1=Sat Jan 15 08:00:00 CST 2000}
MappingJackson2HttpMessageConverter 结合 @ResponseBody 注解可将请求处理方法返回的 Java 对象转换为 JSON 格式数据并输出至客户端。
使用 @ResponseBody 注解绑定请求处理方法的返回值, SpringMVC 根据请求头 Accept 的值,查找对应的 HttpMessageConverter 对象将请求处理方法返回的 Java 对象转换为对应的数据类型写入响应正文中输出至客户端。
将pojo转换为json 对象格式数据响应到客户端
//    pojo 转换为 json
    @ResponseBody
    @RequestMapping("/pojo")
    public Vip pojo(Vip vip){
//        获取实体类
         vip = new Vip(1,"111","1111",new Date());
        System.out.println(vip);
        return vip;
    }

前台

<form action="pojo.action" method="post" enctype="multipart/form-data">

    <input type="submit" value="提交">
</form>

结果

将map 转换为json 对象格式数据响应到客户端

//    map 转换为json
    @ResponseBody
    @RequestMapping("/map")
    public Map<String,Object> map(){
        HashMap<String, Object> map = new HashMap<>();
        map.put("pageNumber",1);
        map.put("totalRows",20);
        ArrayList<Vip> list = new ArrayList<>();
        Vip  vip = new Vip(1,"张🐟","285",new Date());
        list.add(vip);
        list.add(vip);
        map.put("result",list);
        return map;
    }

结果

将list 集合转换Json 数组格式到客户端

//list 转换json
    @ResponseBody
    @RequestMapping("/list")
    public List<Vip> list(){
        ArrayList<Vip> list = new ArrayList<>();
        Vip  vip = new Vip(1,"张🐟","285",new Date());
        list.add(vip);
        list.add(vip);
        return list;
    }

结果

@jsonFormat

用于属性或者属性上的get 方法上,可将该属性转换为指定字符串数据

一般主要用于转换json 数据将java.util.Date 类型数据转换为指定格式的日期时间字符串

@Jsonignore

用于属性或者属性的get 方法上,指定当前属性在转换过程中将被忽略

@JSONIGNOREPROPERTIES

用于定义类上,指定当前类的对象在转换过程中将要被忽略的属性列表。

统一异常处理思想

在javaEE 项目的开发中,不管对底层的数据库操作过程,还是业务的处理过程,还是控制层的处理过程,都不可避免遇到各种可预知的,不可预知的异常需要处理

Spring MVC 处理异常有三种方式

1,使用spring mvc 的简单异常处理器 

org.springframework.web.servlet.handler.SimpleMappingExceptionResolver
<!--   简单的 处理异常器-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!--        定义默认的异常处理的页面,当该异常类型的注册时使用-->
        <property name="defaultErrorView" value="error"></property>
<!--        定义异常处理页面用来获取异常信息的变量名,默认是exeption-->
        <property name="exceptionAttribute" value="ex"></property>
<!--        定义需要特殊处理的异常,用类名或完全路径名作为key 异常也页面作为值-->
        <property name="exceptionMappings">
            <props>
                <prop key="com.jj.exception.Fileexption">error</prop>

            </props>

        </property>
    </bean>

2,实现异常处理接口自定义异常处理器

配置自定义的异常处理器

3,使用

@ExceptionHandler 注解事项异常处理
//    异常处理
    @ExceptionHandler
    public String ex(HttpServletRequest request,Exception ex){
request.setAttribute("ex",ex);
        return "error";
    }
<!--    配置自定义拦截器-->
    <mvc:interceptors>
        <bean class="com.jj.intercrtor.Demointerceptor"></bean>
    </mvc:interceptors>

拦截器简介

springmvc 拦截器通过aop 机制实现,符合横切关注点业务都可以通过拦截器进行实现

spring mvc 拦截器通过

HandlerInterceptor  接口实现,该接口中定义以下三个方法在请求处理器前后执行
package com.jj.intercrtor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demointerceptor implements HandlerInterceptor {
//    完毕后执行


    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("我是完毕后执行的!!");
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("11");
    }
    //    前执行

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String addr = request.getRemoteAddr();
        String url = request.getRequestURI().toString();
        System.out.println("ip 是" +addr+"url"+url);
        return true;
    }
}

定义进行简单日志输出拦截器:

实现preHandle方法,该方法根据拦截器配置先后次序执行

当该方法返回true 时请求会继续向下传递给下一个拦截器。

定义进行简单日志输出拦截器:
实现 postHandle 方法,该方法只有当前拦截器的 preHandle 方法返回 true 时执行,执行次序按照拦截器栈中配置的逆序进行。

该方法有四个参数依次为HttpServletRequestHttpServletResponseObjectModelAndView类型,前两个参数为本次请求的请求对象和响应对象,而第三个参数请求处理对象,第四个参数请求处理完毕返回的ModelAndView对象封装了本次请求数据模型和视图信息

拦截器总结

类似于 Filter,对于请求处理器做预处理和后处理

使用场景

日志,权限,性能检测,加密,压缩

实现方案:

  •   自定义拦截器通过以下方式实现:
    • 实现HandlerInterceptor接口,实现所有的三个抽象方法
    • 继承SpringMVC提供的HandlerInterceptorAdpater类,该类已对拦截器接口进行简单实现,开发者根据实际需要实现三个方法中任何一个

注意:多个拦截器组合时候,根据配置顺序决定走的先后顺序

过滤器和拦截器区别:

过滤器时selevt 规范中的一部分,任何javaweb 工程都可以使用

拦截器时Spring mvc 框架自己的,之有使用了Springmvc 框架 的工程才能使用

过滤器在 url-pattren 中配置/* 之后,可以对所有要访问的资源拦截

拦截器它时只会拦截访问的控制器方法,如果访问的时jsp ,html....不会进行拦截。

注意:拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦截的。 拦截器是方法级别的拦截

Restful 支持

什么是Restful  

restful 架构,就是目前最流行的一种互联网软件框架,它结构清晰,符合标准,易于理解,扩展方便,所以大家都在用。

互联网应用程序,分为前端和后端两个部分,当前的发展趋势,就是

前端设备层出不穷,因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信,这导致 API 构架的流行。
RESTful API 是目前比较成熟的一套互联网应用程序的 API 设计理论, RESTful 可以通过一套统一的接口为 Web iOS Android 提供服务。
什么是REST?
REpresentational State Transfer  中文翻译为资源表现层转换
使用HTTP动作(Post,put,Delete)描述对资源的操作
Rest 规则
url 用于表示网络资源,所以之使用名词,原则上不使用动词如
/api/emp 用于表示获取员工列表信息
/api/emp /1 可用于表示id 为1 的员工信息,也可以表示删除该员工的信息
Restful风格成为主流
跨平台,标准化,易理解,易扩展
在Springmvc 4.0 后增加@RestContrller 来代替@Controller 和@ResponseBody来创建更具体语义的Restful 请求处理器,这样类中返回为String 的方法,返回不在解析成视图
新增注解
@GetMapping//只能处理get请求
@PostMapping//只能处理pots请求

数据校验

       前端:比说长度,格式。。。。

       后台:因为很多时候有可能可以绕开前端校验,直接走向后台,所以后台校验也是必须的。

两种方式

在Springmvc 前通过实现Validator接口进行验证

在Spring mvc 3.0 和4.0 后提供对Bean Validation1.0(JSR303)Bean validation(JSR349)支持,通过Bean Validation的实现进行数据校验。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值