SpringMVC从零单排

189 阅读5分钟

环境

  • jdk1.8
  • maven
  • Idea

MVC 设计模式一般指 MVC 框架

  • M(Model)指数据模型层,模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)

  • V(View)指视图层,负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能

  • C(Controller)指控制层,负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端 使用 MVC 的目的是将 M 和 V 的实现代码分离,使同一个程序可以有不同的表现形式。其中,View 的定义比较清晰,就是用户界面。

  • Servlet 及 JSP 开发时,JavaBean 相当于 Model,Servlet 相当于 Controller,JSP 相当于 View

image.png

MVC优缺点

优点

  • 多视图共享一个模型,大大提高了代码的可重用性
  • MVC 三个模块相互独立,松耦合架构
  • 控制器提高了应用程序的灵活性和可配置性
  • 有利于软件工程化管理 总之,我们通过 MVC 设计模式最终可以打造出一个松耦合+高可重用性+高可适用性的完美架构。

缺点

  • 原理复杂
  • 增加了系统结构和实现的复杂性
  • 视图对模型数据的低效率访问

全注解体验SpringMVC

image.png

  • 创建maven-webapp项目,在src--main下添加,java文件夹标记为source root,新建resources文件夹标记为resource root
  • 新建package.config,然后新建SpringConfig.java 、 servletConfig.java
package com.leo.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.leo.controller")
public class SpringConfig {

}

---


package com.leo.config;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;

public class ServletInitConfig extends AbstractDispatcherServletInitializer {
    // 加载springmvc对应的容器对象
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(SpringConfig.class);
        return ctx;
    }
    // 过滤哪些请求
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    // 加载spring对应的容器对象
    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;
    }
}
  • 控制器处理请求
package com.leo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    @RequestMapping("/save")
    @ResponseBody
    public String save(){
        System.out.println("hello world");
        return "{'info':'user controller'}";
    }

}
  • 配置 maven启动的tomcat,tomcat7:run

  • 访问

image.png

image.png

image.png

排出加载的类

image.png

根据配置类加载bean image.png

GET 请求的参数传递

image.png

image.png

字符集过滤

image.png

请求中name和方法中的username绑定传参

image.png

  • 如果参数名和类型中的字段完全匹配,会自动的装配到类中

image.png

  • 如果接收参数的类中有引用类型的数据,只需要根据类型中的数据填写依然会被收到

image.png

接收数组参数

image.png

image.png

把参数放进集合,传参没有区别,接收参数使用@RequestParm

image.png

通过HttpServletRequest接收请求参数

@RequestMapping("/login")
public String login(HttpServletRequest request, Model model) {    
    String name = request.getParameter("name");    
    String pwd = request.getParameter("pwd");
    if ("root".equals(name)&& "123456".equals(pwd)) { 
        model.addAttribute("message", "登录成功");
        return "main"; // 登录成功,跳转到 main.jsp
     } else {
         model.addAttribute("message", "用户名或密码错误");
         return "login";
    }
}

通过@PathVariable接收URL中的请求参数

@RequestMapping("/login/{name}/{pwd}")
public String login(@PathVariable String name, @PathVariable String pwd, Model model) {

    if ("root".equals(name)
            && "123456".equals(pwd)) {

        model.addAttribute("message", "登录成功");
        return "main"; // 登录成功,跳转到 main.jsp
    } else {
        model.addAttribute("message", "用户名或密码错误");
        return "login";
    }
}

通过@RequestParam接收请求参数

在方法入参处使用 @RequestParam 注解指定其对应的请求参数。@RequestParam 有以下三个参数:

  • value:参数名
  • required:是否必须,默认为 true,表示请求中必须包含对应的参数名,若不存在将抛出异常
  • defaultValue:参数默认值
@RequestMapping("/login")
public String login(@RequestParam String name, @RequestParam String pwd, Model model) {

    if ("root".equals(name)
            && "123456".equals(pwd)) {

        model.addAttribute("message", "登录成功");
        return "main"; // 登录成功,跳转到 main.jsp
    } else {
        model.addAttribute("message", "用户名或密码错误");
        return "login";
    }
}

通过@ModelAttribute接收请求参数

@ModelAttribute 注解用于将多个请求参数封装到一个实体对象中,从而简化数据绑定流程,而且自动暴露为模型数据,在视图页面展示时使用。而“通过实体 Bean 接收请求参数”中只是将多个请求参数封装到一个实体对象,并不能暴露为模型数据

@RequestMapping("/login")
public String login(@ModelAttribute("user") User user, Model model) {

    if ("root".equals(name)
            && "123456".equals(pwd)) {

        model.addAttribute("message", "登录成功");
        return "main"; // 登录成功,跳转到 main.jsp
    } else {
        model.addAttribute("message", "用户名或密码错误");
        return "login";
    }
}

传递JSON数据

  • 导入依赖包

image.png

image.png

image.png

  • 路径参数

image.png

image.png

  • 从requestBody中解析数据

image.png

  • 接收日期参数解析:@DataTimeFormat(pattern="yyyy-MM-dd")

image.png

  • 根据类型中自动的开启转换,配置类上@EnableWebMvc

image.png

开启JSON数据返回 @ResponseBody

image.png

简化controller层类注解

image.png

放行静态资源访问

  • 设置过滤类

image.png

  • 在配置类上扫描过滤类 image.png

整合mybatis

  • 导坐标、写jdbc.properties、写SpringConfig.java,激活配置文件注解@propertieSource

image.png

  • 写jdbcConfig.java

image.png

  • 写MybatisConfig.java配置类 image.png

  • web容器类

image.png

  • SpringMvcConfig.java image.png

  • 开启事务

image.png

  • JdbcConfig.java添加平台事务管理器

image.png

  • 在service层接口上注解事务

image.png

MVC搭建

  • 新建controller、dao、service、service.impl、model controller:接收前端的数据 dao:持久层的接口 service:业务层的接口 service.impl:业务层的接口实现 model:前端交互的业务数据模型

  • 测试

image.png

  • 返回的消息体

image.png

  • 定义code码

image.png

  • controller层返回

image.png

异常处理

  • 异常在表现层处理 image.png

  • spring异常处理器,这个类需要能被扫描到添加到容器中

image.png

image.png

  • 自定义系统异常处理 image.png

  • 自定义运行时异常处理 image.png

  • 业务层异常处理

image.png

image.png

拦截器

  • Spring MVC 提供了 Interceptor 拦截器机制,用于请求的预处理和后处理

  • Spring MVC 的拦截器(Interceptor)与 Java Servlet 的过滤器(Filter)类似,它主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上。

  • preHandle( ):该方法在控制器的处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。

  • postHandle( ):该方法在控制器的处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步的修改。

  • afterCompletion( ):该方法在控制器的处理请求方法执行完成后执行,即视图渲染结束后执行,可以通过此方法实现一些资源清理、记录日志信息等工作。

image.png

image.png

  • 定义拦截器

image.png

  • 有侵入性的拦截器

image.png

  • 在配置类中注册 image.png

  • 拦截请求参数

image.png

  • 拦截器的执行顺序跟配置的顺序有关系,先配置的先执行,退出的时候是后配置的先执行

image.png