Java Spring|day2.SpringMVC

Spring MVC

定义

MVC是一种设计模式,在这种模式下软件被分为三层,即Model(模型)、View(视图)、Controller(控制器)。

MVC是一种软件架构思想,把软件按照模型,视图,控制器来划分

模型

  1. Model

    模型层,指工程中的JavaBean,用来处理数据

    javaBean分为两类

    • 一类称为实体类Bean:专门用来存储业务数据,比如Student,User
    • 一类称为业务处理Bean:指Servlet或Dao对象,专门用来处理业务逻辑和数据访问
  2. View

视图层,指工程中的html,jsp等页面,作用是和用户进行交互,展示数据

  1. Controller

控制层,指工程中的Servlet,作用是接收请求和响应浏览器

它是Model和View这两层的桥梁

流程:

  1. 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收
  2. Controller调用相应的Model层处理请求,处理完毕后结果返回到Controller
  3. Controller再根据请求处理的结果找到对应的View视图,渲染数据后最终响应给浏览器

执行流程

图示

具体

  1. 客户端请求被DispatcherServlet接收
  2. 根据HandlerMapping映射到Handler
  3. 生成Handler和HandlerInterceptor
  4. Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet
  5. DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理
  6. 返回一个ModelAndView对象给DispatcherServlet
  7. DispatcherServlet把获取的ModelAndView对象传给ViewResolver视图解析器,把逻辑视图解析成物理视图
  8. ViewResolver返回一个View进行视图渲染(把模型填充到视图中)
  9. DispatcherServlet把渲染后的视图响应给客户端

使用过程

  1. 创建maven改成工程,pom.xml加入Spring MVC的依赖

  2. 在web.xml中配置Spring MVC的DispatcherServlet

    • 首先在项目中创建java和resources的目录
    • 在resources目录中添加springmvc.xml
    • 然后在web.xml 配置Spring MVC的DispatcherServlet

DispatcherServlet

  • DispatcherServlet是Spring MVC提供的核心控制器,这个一个Servlet程序,该Servlet程序会接收所有请求
  • 核心控制器会读取一个springmvc.xml配置,加载Spring MVC的核心配置
  • 配置/代表拦截所有请求
  • 代表在项目启动时实例化DispathcerServlet,如果没有配置,则在第一次访问Servlet时进行实例化
  1. springmvc.xml进行配置
  2. 创建Controller控制器Handler,在里面编写接收参数,调用业务方法,返回视图页面等逻辑

具体执行流程

  1. DispatcherServlet接收到URL请求index,结合@RequestMapping("/index")注解把该请求交给index业务方法进行处理
  2. 执行index业务方法,控制台打印日志,并且返回"index"字符串(逻辑视图)
  3. 结合springmvc.xml中的视图解析器配置,找到目标资源:/index.jsp,即根目录下的index.jsp文件,把该JSP资源返回给客户端完成响应

常用注解

  1. @RequestMapping

    • 作用

      • Spring MVC通过@RequestMapping注解把URL请求和业务方法进行映射,在控制器的类定义处以及方法定义处都可以添加@RequestMapping,在类定义处添加相当于多了一层访问路径
    • 属性

      • value:指定URL请求的实际地址,是@RequestMapping的默认值

      • method:指定请求的method类型,包括GET、POST、PUT、DELETE等

      • params:指定request请求中必须包含的参数值,如果不包含的话,就无法调用该方法

      • headers:发送的请求中必须包含的请求头。

      • consumes:指定处理请求的提交内容类型,如application/json, text/html。

      • produces: 指定返回的内容类型,仅当request请求头中的类型中包含该指定类型才返回。

  2. @RequestParam

    • 作用
      • 把请求中的指定名称的参数传递给控制器中的形参赋值。
    • 属性
      • value:请求参数中的名称。
      • required:请求参数中是否必须提供此参数,默认值是true,必须提供。
  3. @RequestBody

    • 作用
      • 用于获取请求体的内容(get方式没有请求体)。
    • 属性
      • required:是否必须有请求体,默认值是true。
  4. @PathVariable

    • 作用
      • 用于绑定url中的占位符。例如:url中有/delete/{id},{id}就是占位符。
      • url支持占位符是 springmvc支持 rest风格 URL的一个重要标志。
    • 属性
      • value:指定url中的占位符名称。
  5. @CookieValue

    • 作用
      • 用于获取指定cookie的名称的值。
    • 属性
      • value:cookie的名称。
  6. @ModelAttribute

    • 作用
      • 出现在方法上:表示当前方法会在控制器方法执行前先执行。
      • 出现在参数上:获取指定的数据给参数赋值。
      • 当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据。
      • 如果所在方法有返回值,那么直接返回,如果没有,需要提供一个map集合,先将数据存入map集合。
  7. @SessionAttributes

    • 作用
      • 用于多次执行控制器方法间的参数共享。
    • 属性
      • value:指定存入属性的名称。

参数绑定

  1. URL风格参数绑定

    • params是对URL请求参数进行限制,不满足条件的URL无法访问该方法,需要在业务方法中获取URL的参数值。
    • 在业务方法定义时声明参数列表
    • 给参数列表添加@RequestParam注解进行绑定
    • Spring MVC可以自动完成数据类型转换,该工作是由HandlerAdapter来完成的
  2. RESTful风格的URL参数获取

    • 传统的URL:localhost:8080/hello/index?id=1&name=tom
    • RESTful URL:localhost:8080/hello/index/1/tom(@PathVariable("id"))
java 复制代码
@RequestMapping("/restful/{id}/{name}")
    public String restful(@PathVariable("id") Integer num, @PathVariable("name") String name){
        System.out.println(num+"-"+name);
        return "index";
    }
  1. 映射Cookie
    • @CookieValue("JSESSIONID")

@RequestMapping("/cookie")

public String getCookie(@CookieValue("JSESSIONID") String sessionId){

System.out.println(sessionId);

return "index";

}

  1. 使用POJO绑定参数

    • Spring MVC会根据请求参数名和POJO属性名进行匹配,自动为该对象填充属性值,并且支持属性级联

    • 首先创建实体类

    • 为了方便测试,写一个addUser.jsp页面

    • 然后在Handler中,编写相关方法

    • 启动Tomcat服务器

    • 结果发现出现乱码问题

      为了解决这个问题,我们只需要在web.xml配置文件中配置过滤器就可以了

  2. JSP页面的转发和重定向

    • Spring MVC默认是通过转发的形式响应JSP,可以手动进行修改
    • 比如,我们想把它改成重定向的话
    • 设置重定向的时候不能写逻辑视图,必须写明资源的物理路径,比如"rediect:/index.jsp"
  3. JSON

    • JSON数据必须用JSON.stringfy()方法转换成字符串
    • contentType:"application/json;charset=UTF-8"不能省略
    • @RequestBody注解
      • 读取HTTP请求参数,通过Spring MVC提供的HttpMessageConverter接口把读取的参数转换为JSON、XML格式的数据,绑定到业务方法的形参
      • 需要使用组件结合@RequestBody注解把JSON转为JavaBean,这里使用FastJson,其优势是如果属性为空,就不会将其转为JSON
    • @ResponseBody注解
      • 把业务方法返回的对象,通过HttpMessageConverter接口转为指定格式的数据,JSON、XML等,响应给客户端

响应数据

  1. String类型返回值

    • Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
    • 如上述例子中,返回success,然后试图解析器解析后,跳转到success.jsp页面。
    • 实际用途:调用此方法的同时,将数据存入到model中,然后框架将数据存入request中,将数据转发到新的页面。
  2. void类型返回值

    • 控制器的方法返回值编写是void,默认会跳转到@RequestMapping(value="/initUpdate") initUpdate的页面。
    • 可以使用请求转发或者重定向跳转到指定的页面。还可以直接响应。
java 复制代码
// 重定向
response.sendRedirect(request.getContextPath()+"/index.jsp");

    // 解决中文乱码
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");

    // 直接进行响应
    response.getWriter().print("响应");
}
  1. ModelAndView对象类型返回值
    • ModelAndView对象是Spring提供的一个对象,可以用来调整具体的JSP视图。
java 复制代码
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    // 创建ModelAndView对象
    ModelAndView mv = new ModelAndView();
    String name="ATFWUS";
    // 把name存储到mv对象中,也会把name存入到request对象
    mv.addObject("user",name);
    // 跳转页面
    mv.setViewName("success")
    return mv;
}
  1. 转发和重定向

    • forward请求转发
      • return "forward:/WEB-INF/pages/success.jsp";
    • redirect重定向
      • return "redirect:/add.jsp";
  2. 响应json数据

    • 配置静态资源不进行拦截
      • DispatcherServlet会拦截到所有的资源,导致静态资源(img、css、js)也会被拦截到,如果需要设置不拦截,需要在springmvc.xml中进行配置。
      • mvc:resources:标签配置不过滤。
      • location元素表示webapp目录下的包下的所有文件
      • mapping元素表示以/static开头的所有请求路径。
    xml 复制代码
    <!-- 设置静态资源不过滤 -->
    <mvc:resources location="/css/" mapping="/css/**"/> 
    <mvc:resources location="/images/" mapping="/images/**"/> 
    <mvc:resources location="/js/" mapping="/js/**"/>  
    • 发送ajax请求
    js 复制代码
    <script>
        $(function(){
            $("#btn").click(function(){
                $.ajax({
                    // 编写json格式,设置属性和值
                    url:"user/testAjax",
                    contentType:"application/json;charset=UTF-8",
                    data:'{"username":"atfwus","password":"atfwus","age":19}',
                    dataType:"json",
                    type:"post",
                    success:function(data){
                     // 服务器端响应的json的数据,进行解析
                     alert(data);
                    }
                });
            });
        });
    </script>
    • 控制器代码

      • 使用@RequestBody注解把json的字符串转换成JavaBean的对象
      java 复制代码
      @RequestMapping("/testJson")
      public void testJson(@RequestBody User user) {
      	 System.out.println(user);
      }
      • 在导入相关的jar包的前提下,Spring MVC可以直接把相关的json数据转换成JavaBean。
      • jar包:jackson-annotations,jackson-datablind,jackson-core。
      • 使用@ResponseBody注解把JavaBean对象转换成json字符串
      java 复制代码
      @RequestMapping("/testAjax")
      public @ResponseBody User testAjax(@RequestBody User user){
          // 后端把json字符串封装到user对象中
          System.out.println(user);
          // 响应
          user.setUsername("ATFWUS");
          return user;
      }

异常处理

系统的 dao、service、controller出现异常都会通过 throws Exception向上抛出,最后由 Spring MVC前端控制器交由异常处理器进行异常处理。

具体使用

  1. 自定义异常类
java 复制代码
public class SysException extends Exception{

    // 存储提示信息的
    private String message;
    
    //get and set
    
    public SysException(String message) {
        this.message = message;
    }
}
  1. 自定义异常处理器
java 复制代码
public class SysExceptionResolver implements HandlerExceptionResolver{

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 获取到异常对象
        SysException e = null;
        if(ex instanceof SysException){
            e = (SysException)ex;
        }else{
            e = new SysException("出异常了");
        }
        // 创建ModelAndView对象
        ModelAndView mv = new ModelAndView();
        mv.addObject("errorMsg",e.getMessage());
        mv.setViewName("error");
        return mv;
    }
}
  1. 配置异常处理器
java 复制代码
 <!-- 配置异常处理器 -->
<bean id="sysExceptionResolver" class="cn.atfwus.exception.SysExceptionResolver"/>
  1. 测试异常处理
java 复制代码
@RequestMapping("/testException")
public String testException() throws SysException {
    try {
        // 模拟异常
        int a = 0/0;
    } catch (Exception e) {
        // 打印异常信息
        e.printStackTrace();
        // 抛出自定义异常
        throw new SysException("出异常了");
    }
    return "success";
}

拦截器

Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。

拦截器是AOP思想的一种实现方式。

可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。

  • 如果需要自定义拦截器,需要实现HandlerInterceptor接口。

拦截器和过滤器的区别

  • 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。拦截器是SpringMVC框架独有的。
  • 过滤器配置了/*,可以拦截任何资源。拦截器只会对控制器中的方法进行拦截。

具体实现

  1. 实现HandlerInterceptor接口
java 复制代码
public class MyInterceptor1 implements HandlerInterceptor{


     // 预处理,controller方法执行前
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor前");
        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
        return true;
    }


     // 后处理方法,controller方法执行后,success.jsp执行之前
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor执行");
        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
    }

    
     //success.jsp页面执行后,该方法会执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor最后");
    }

}
  1. 配置拦截器
java 复制代码
<!--配置拦截器-->
<mvc:interceptors>
    <!--配置拦截器-->
    <mvc:interceptor>
        <!--要拦截的具体的方法-->
        <mvc:mapping path="/user/*"/>
        <!--不要拦截的方法
        <mvc:exclude-mapping path=""/>
            -->
        <!--配置拦截器对象-->
        <bean class="cn.atfwus.controller.cn.itcast.interceptor.MyInterceptor1" />
    </mvc:interceptor>

    <!--配置第二个拦截器-->
    <mvc:interceptor>
        <!--要拦截的具体的方法-->
        <mvc:mapping path="/**"/>
        <!--不要拦截的方法
        <mvc:exclude-mapping path=""/>
        -->
        <!--配置拦截器对象-->
        <bean class="cn.itcast.controller.cn.atfwus.interceptor.MyInterceptor2" />
    </mvc:interceptor>
</mvc:interceptors>
  1. 接口中的方法
  • preHandle方法
    • 是controller方法执行前拦截的方法。可以使用request或者response跳转到指定的页面。
    • return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
    • return false不放行,不会执行controller中的方法。
  • postHandle方法
    • 是controller方法执行后执行的方法,在JSP视图执行前。
    • 可以使用request或者response跳转到指定的页面。
    • 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
  • postHandle方法
    • 是在JSP执行后执行。request或者response不能再跳转页面了。

AJax请求

定义

ajax 全名 async javascript and XML(异步JavaScript和XML)

Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。而传统的网页(不使用 Ajax)如果需要更新内容,必需重载整个网页面。

同步异步请求

同步提交:当用户发送请求时,当前页面不可以使用,服务器响应页面到客户端,响应完成,用户才可以使用页面。

异步提交:当用户发送请求时,当前页面还可以继续使用,当异步请求的数据响应给页面,页面把数据显示出来 。

优点

不需要插件的⽀持,原⽣ js 就可以使⽤

⽤户体验好(不需要刷新⻚⾯就可以更新数据)

减轻服务端和带宽的负担

执行流程

相关推荐
xcl09255 小时前
北京24小时自助健身房系统软件开发实战:从架构到部署全流程指南
java·spring boot·架构
一 乐7 小时前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
卓怡学长7 小时前
w214基于jsp知道特产网
java·intellij-idea
步行cgn7 小时前
Spring 注解使用详解
java·spring
一条小小yu7 小时前
Spring IoC的理解
java·后端·spring
落魄实习生8 小时前
Agent Scope Java 2.x 系列【7】工具使用
java·开发语言·ai
旺仔学长 哈哈8 小时前
springboot钓鱼爱好者交流平台APP设计与实现
java·spring boot·mysql·充电桩管理系统
自强的小白9 小时前
核心功能(Service接口)
java·mybatis
乌暮10 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习