Spring MVC程序开发

1.什么是 Spring MVC?

1.Spring MVC 是一个 Web 框架。
2. Spring MVC 是基于 Servlet API 构建的。
Spring MVC是基于MVC设计模式并在Servlet API基础上实现的一个Web框架。

1.1 MVC 定义

MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分

在这里插入图片描述

  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
  • View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

1.2 MVC 和 Spring MVC 的关系

MVC 是一种思想, Spring MVC 是对 MVC 思想的具体实现。

总结来说,Spring MVC 是一个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当用户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求。

2.为什么要学 Spring MVC?

现在绝大部分的 Java 项目都是基于 Spring(或 Spring Boot)的, Spring 的核心就是 Spring MVC。

3.怎么学 Spring MVC?

学习 Spring MVC 我们只需要掌握以下 3 个功能:

1.连接的功能:将用户(浏览器)和 Java 程序连接起来,也就是访问一个地址能够调 到我们的 Spring 程序。
2.获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数。
3.输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户。

对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC。

3.1 Spring MVC 创建和连接

3.1.1 创建 Spring MVC 项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通常情况下所说的Spring Boot项目,大部分的时候等于Spring MVC项目的,Spring Web也等于Spring MVC项目。

3.1.2实现用户和程序的链接

@RequestMapping 注解介绍

@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。

路由映射:所谓的路由映射指的是,当用户访问一个 url 时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射。

@RequestMapping 基础使用:

package com.example.demo.controller;

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

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/sayhi")//实现路由映射(用户和程序连接)
    @ResponseBody//当前方法返回的是一个非静态页面的数据
    public String sayHi(){
        return "Hello,Spring MVC";
    }

}

@RequestMapping 即可修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类 + 方法。

@RequestMapping 是 post 还是 get 请求?

@RequestMapping 默认是 get 方式的请求,但也可支持POST方式的请求

需求:将一个方法只支持GET请求,不能支持POST请求

    //表示此方法只支持GET类型的请求
    @RequestMapping(value = "/sayhi",method = RequestMethod.GET)//实现路由映射(用户和程序连接)
@GetMapping 和 PostMapping

get 请求的 3 种写法:

// 写法1
@RequestMapping("/index")
// 写法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 写法3
@GetMapping("/index")

post 请求的 2 种写法:

// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")

3.2 获取参数

3.2.1 传递单个参数

    /**
     * 接受单个参数
     * @param name
     * @return
     */
    @RequestMapping("/showname")
    @ResponseBody
    public String showName(String name){
        return "姓名:"+name;
    }

在这里插入图片描述

3.2.1 传递多个参数

    /**
     * 接受多个参数
     * @param name
     * @param password
     * @return
     */
    @RequestMapping("/login")
    @ResponseBody
    public boolean islogin(String name,String password){
        boolean result=false;
//        //非空校验
//        if(name!=null&&!name.equals("")&&password!=null&&!password.equals("")){
//
//        }
        //非空校验
        if(StringUtils.hasLength(name)&&StringUtils.hasLength(password)
                &&name.equals("admin")&&password.equals("12345678")){
            result=true;
        }
        return result;
    }

在这里插入图片描述

3.2.3 传递对象

对象:

@Data
public class UserInfo {
    private int id;
    private String name;
    private String password;
    private String photo;
    private int age;
    // ....
}

传递代码:
在这里插入图片描述
在这里插入图片描述

3.2.4 表单参数传递/传递多个参数(非对象)

同3.2.3

3.2.5 后端参数重命名(后端参数映射)

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个username 给后端,而后端又是有 name字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值。
@RequestParam(“xxx”) String yyy 将前端的xxx重命名为后端的yyy

    @RequestMapping("/login2")
    @ResponseBody
    public String islogin2(@RequestParam("username") String name,String password){
        return "用户名"+name+"|密码:"+password;
    }

在这里插入图片描述

3.2.6 设置参数必传@RequestParam

上面 的列 ,如果我们是前端传递一个非time 的参数,就会出现程序报错的情况,如下图所示:
在这里插入图片描述

这是因为后端已经声明了前端必须传递一个 time 的参数,但是前端没有给后端传递

非必传参数设置

如果我们的实际业务前端的参数是一个非必传的参数,我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错,具体实现如下:

    @RequestMapping("/login2")
    @ResponseBody
    public String islogin2(@RequestParam(value = "username",required = false) 
                                       String name,String password){
        return "用户名"+name+"|密码:"+password;
    }

在这里插入图片描述

3.2.7 @RequestBody 接收JSON对象

在这里插入图片描述

    @RequestMapping("/reg")
    @ResponseBody
    public UserInfo reg(@ResponseBody UserInfo userInfo){
        return userInfo;
    }

3.2.8获取URL中参数@PathVariable

在这里插入图片描述

3.2.9 上传文件(图片)@RequestPart

关键实现步骤:

  1. 接受前端传递的文件:@RequestPart("filename") MultipartFile file
  2. 将前端传递过来的文件保存在本地:file.transferTo(new File(filepart))
@Value("${myfile.path}")
    private String filePath;//从配置文件中获取图片的上传路径

    /**
     * 上传文件
     * @param username
     * @param file
     * @return
     */
    @RequestMapping("/upfile")
    @ResponseBody
    public Boolean upFile(String username, @RequestPart("myfile")MultipartFile file)  {
        boolean result=false;
        try {
            //得到源文件的名称和后缀
            String fileType=file.getOriginalFilename();
            fileType=filePath.substring(fileType.lastIndexOf("."));//文件的后缀(类型)
            //文件的保存名称
            String fileName= UUID.randomUUID().toString()+fileType;
            file.transferTo(new File(filePath+fileName));
            result=true;
            log.info(username+":上传图片成功!");
        } catch (IOException e) {
            System.out.println("图片上传失败");
        }
        return result;
    }

如果上传的是文件,不使用GET类型的请求方式,一定要使用POST。

3.2.10 获取Cookie/Session/header

获取Cookie

  1. 通过HttpServletRequest getCookie获取【servlet的操作方法】
    /**
     * 获取cookie方法1
     * @param request
     */
    @ResponseBody
    @RequestMapping("/getck")
    public void getCookie(HttpServletRequest request){
        Cookie[] cookies=request.getCookies();
        log.info("cookie length:"+cookies.length);
        Arrays.stream(cookies).forEach(cookie -> {
            log.info(cookie.getName()+":"+cookie.getValue());
        });
    }

在这里插入图片描述

  1. @CookieValue("cookieName")String cookieValue
    /**
     * 获取 cookie 方法2
     *
     * @param bite
     * @return
     */
    @RequestMapping("/getck2")
    public String getCookie2(@CookieValue("bite") String bite) {
        return bite;
    }
  1. 获取请求头中的数据(Spring Boot方式):@RequestHeader("headname") String headValue
    @RequestMapping("/getua")
    public String getUA(@RequestHeader("User-Agent") String userAgent) {
        return userAgent;
    }

Session 存储和获取
Session 存储和 Servlet 类似,是使用 HttpServletRequest 中获取的,如下代码所示:

    /**
     * 设置 session
     *
     * @param request
     * @return
     */
    @RequestMapping("/setsess")
    public boolean setSession(HttpServletRequest request) {
        boolean result = false;
        // 1.得到 session 对象
        try {
            HttpSession session = request.getSession(true);
            session.setAttribute(SESSION_KEY, "Java");
            result = true;
        } catch (Exception e) {
            log.info("出现了异常:" + e.getMessage());
        }
        return result;
    }

读取 Session 可以使用 HttpServletRequest,如下代码所示:

    /**
     * 获取 session 方式1
     *
     * @param request
     * @return
     */
    @RequestMapping("/getsess")
    public String getSession(HttpServletRequest request) {
        String result = "";
        // 1.得到 session,如果存在就查询 session 中的值,否则返回空
        HttpSession session = request.getSession(false); // false=如果没有 session 就不用创建 session 对象
        if (session != null && session.getAttribute(SESSION_KEY) != null)
            result = (String) session.getAttribute(SESSION_KEY);
        return result;
    }

获取 sessionn 方式2:

    /**
     * 获取 sessionn 方式2
     *
     * @param data
     * @return
     */
    @RequestMapping("/getsess2")
    public String getSession2(@SessionAttribute(required = false,
            name = "SESSION_KEY") String data) {
        return data;
    }

3.3 返回数据

3.3.1 返回静态页面

    @RequestMapping("/index")
    public String getIndex(){
        return "index.html";
    }

3.3.2 返回非静态页面的数据

3.3.2.1 组合注解:@RestController

@RestController = @Controller + @ResponseBody

//@Controller
//@ResponseBody//当前类中的所有方法返回的都是一个非静态页面的数据
@RestController
public class RespController {

    @RequestMapping("/index")
//    @ResponseBody//当前方法返回的都是一个非静态页面的数据
    public String getIndex(){
        return "index.html";
    }
}

3.3.3 Sping MVC跳转有以下两种方式:

  1. 请求转发
  2. 请求重定向

请求转发的实现方法1:

    /**
     * 请求转发的实现方法1
     * @return
     */
    @RequestMapping("/fw")
    public Object forward(){
        return "forward:hello.html";
    }

请求重定向的实现方法1:

    /**
     * 请求重定向的实现方法1
     * @return
     */
    @RequestMapping("/rt")
    public Object redirect(){
        return "redirect:hello.html";
    }

请求转发的实现方法2(了解):

    /**
     * 请求转发的实现方法2
     * @return
     */
    @RequestMapping("/fw2")
    public void forward2(HttpServletResponse response, HttpServletRequest request) throws ServletException, IOException {
        request.getRequestDispatcher("hello.html").forward(request,response);
    }

请求重定向的实现方法2:

    /**
     * 请求重定向的实现方法2
     * @return
     */
    @RequestMapping("/rt2")
    public void redirect2(HttpServletResponse response) throws IOException {
        response.sendRedirect("hello.html");
    }

更多注解

更多注解

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7、其它 目录: Spring MVC 3.0新特性 Spring MVC框架结构 Spring MVC框架结构 框架的实现者 目录 HTTP请求映射原理 Spring MVC进行映射的依据 通过URL限定:URL表达式 通过URL限定:绑定{xxx}中的值 通过请求方法限定:请求方法 通过请求方法限定:代码示例 通过请求方法限定:模拟请求方法 通过请求/请求头参数限定:示例 通过请求/请求头参数限定:更多 目录 通过注解绑定:示意图 通过注解绑定:示例 通过注解绑定:小心抛出异常 使用命令/表单对象绑定 使用Servlet API对象作为入参 使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter<T> HttpMessageConverter<T>实现类 使用@RequestBody/@ResponseBody 使用HttpEntity<T>/ResponseEntity<T> 输出XML和JSON 使用HttpEntity<T>/ResponseEntity<T> 目录 数据绑定机理 数据类型转换 PropertyEditor依然有效 强大的ConversionService,让很多梦想成真 基于ConversionService体系,定义自定义的类型转换器 格式化:带格式字符串内部对象 相互转换 使用支持格式化的转换器 数据校验框架 JSR 303 数据校验框架 如何使用注解驱动的校验 使用校验功能时,处理方法要如何签名?? 校验错误信息存放在什么地方?? 页面如何显示错误信息 如何对错误信息进行国际化(1) 如何对错误信息进行国际化(2) 目录 数据模型访问结构 访问数据模型:ModelAndView 访问数据模型:@ModelAttribute 访问数据模型:Map及Model 访问数据模型:@SessionAttributes 一场由@SessionAttributes引发的血案... 如何避免@SessionAttributes引发的血案 目录 Spring MVC如何解析视图 视图解析器类型 基于协商的视图解析器 目录 本地化:基础原理 本地化:Spring MVC的本地化解析器 本地化:Spring MVC的本地化解析器 LocaleChangeInterceptor:通过URL参数指定 静态资源处理 静态资源处理:使REST风格的URL成为实现 静态资源处理:原理 静态资源处理:如何配置? 静态资源处理:如何配置? 物理静态资源路径映射逻辑资源路径 允许利用浏览器的缓存且不当心不同步 AQ?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值