SpringMVC笔记【JavaEE】

news2024/12/27 0:23:56

SpringMVC

1. SpringMVC概念

  1. Spring MVC 是一个Web 框架。
  2. Spring MVC 是基于Servlet API构建的。

MVC是 Model(模型) View(视图) Controller(控制器) 的缩写,它是一种设计模式。

在这里插入图片描述

视图分为两种:

  1. 服务器端的视图【View】
  2. 客户端的视图

MVC 和 Spring MVC 有什么关系?

MVC 是一种设计思想。

Spring MVC 是对 MVC 设计思想具体实现的Web框架。

Spring MVC是一个基于 MVC 设计模式和 Servlet API 实现的 Web 项目,同时 Spring MVC 又是 Spring 框架中的一个Web 模块, 它随着Spring 的诞生而存在的一个框架。

2. SpringMVC主要实现

  • 实现用户和程序的映射(在浏览器输入URL地址之后,能够在程序中匹配到相应方法)
  • 服务器端要得到用户的请求参数
  • 服务器端要将结果返回给用户(前端)

3. SpringMVC入门

3.1 SpringMVC 创建和连接

实现用户和程序的映射

  • 方法一:@RequestMapping(“/xxx”)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJg5hilI-1676078271227)(C:\Users\17512\AppData\Roaming\Typora\typora-user-images\1674967308929.png)]

    @RequestMapping特征:
    
    1. @RequestMapping既能修饰类(可选)也能修饰方法。
      
    2. 默认情况下 @RequestMapping 既能支持POST请求,也支持GET请求。
    
    
    @RequestMapping参数拓展(只支持某种类型的请求方式,比如POST类型的请求方式):
    
    
    
  • 方法二:@GetMapping 和 PostMapping

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

在这里插入图片描述

3.2 获取参数

获取单个参数

在这里插入图片描述

获取多个参数

在这里插入图片描述

拓展功能:参数重命名

使用@RequestParam注解

在这里插入图片描述

将前端传递过来的name变成当前程序内的username

在这里插入图片描述

默认前端必须传入RequestParam注解的值,否则会报错。【除非设置 required = false】

在这里插入图片描述

使用@RequestBody接收JSON对象

接收JSON格式的数据

使用Postman模拟发送 JSON 字符串给服务器

在这里插入图片描述

Fiddler 抓包请求

在这里插入图片描述

Fiddler 抓包响应

在这里插入图片描述

目前对象只能接收普通请求方式,无法接收JSON数据格式

在这里插入图片描述

使用注解@RequestBody就可以让服务器端接收JSON数据

在这里插入图片描述

在这里插入图片描述

从URL地址中获取参数@PathVariable

【不是从URL地址中的参数部分获取参数】

在这里插入图片描述

上传文件 @RequestPart

使用Postman模拟上传文件

在这里插入图片描述

拓展功能:不同运行平台的配置文件设置

  1. 新建不同平台的配置文件【不同平台的配置文件的命名规则:application-平台.yml(properties)

    在这里插入图片描述

  2. 在主配置文件中设置运行的配置文件

    在这里插入图片描述

获取Cookie

  • servlet 获取 Cookie

    在这里插入图片描述
    在这里插入图片描述

  • @CookieValue

    在这里插入图片描述

获取Header

  • servlet获取Header

在这里插入图片描述

  • @RuquestHeader

在这里插入图片描述

存储和获取Session

在这里插入图片描述

获取session的方法:

  • servlet

在这里插入图片描述

  • @SessionAttribute

在这里插入图片描述

拓展

@RestController //组合注解 = Controller + ResponseBody

3.3 返回数据

返回静态页面

@ResponseBody

返回text/html

练习:实现计算器功能

前端页面:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.
0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>计算器示例</title>
</head>
<body>
<form action="/calc">
    <h1>计算器</h1>
    数字1:<input name="num1" type="text"><br>
    数字2:<input name="num2" type="text"><br>
    <input type="submit" value=" 点击相加 ">
</form>
</body>
</html>

后端代码:

package com.example.springmvc.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author SunYuHang
 * @date 2023-01-31 09:41
 * @ClassName : CalcController  //类名
 */

@RestController
public class CalcController {


    @RequestMapping("/calc")
    public String calc(Integer num1,Integer num2){
        if (num1 == null || num2 == null){
            return "<h1>参数错误!</h1><a href='javascript:history.go(-1)'>返回上一个页面</a>";
        }
        return "<h1>结果: "+ (num1+num2)+"</h1><a href='javascript:history.go(-1)'>返回上一个页面</a>";
    }
}


返回JSON对象

练习:实现登录功能

前端代码:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.
0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script src="js/jquery-1.9.1.min.js"></script>
    <title>Document</title>
    <script>
        // ajax 提交
        function mysub(){
            //1. 判空
            var username = jQuery("#username");
            var password = jQuery("#password");
            if (jQuery.trim(username.val())==""){
                alert("请先输入用户名!");
                username.focus();// 光标重置
                return;
            }
            if (jQuery.trim(password.val())==""){
                alert("请输入密码!");
                password.focus();// 光标重置
                return;
            }
            jQuery.ajax({
                url: "/user/login2",
                type: "POST",
                data:{
                    "username":username.val(),
                    "password":password.val()
                },
                success: function (result){
                    alert(JSON.stringify(result));
                }
            });
        }
    </script>
</head>
<body>
<div style="text-align: center;">
    <h1>登录</h1>
    ⽤户:<input id="username">
    <br>
    密码:<input id="password" type="password">
    <br>
    <input type="button" value=" 提交 " onclick="mysub()" style="margin-top: 20px;margin-left: 50px;">
</div>
</body>
</html>

后端代码:

@RequestMapping("/login2")
    public HashMap<String,Object> login2(String username,String password){
        HashMap<String,Object> result = new HashMap<String,Object>();
        int state = 200;
        String msg = "";
        int data = -1; // 等于 1, 表示登陆成功,否则登陆失败
        if (StringUtils.hasLength(username) && StringUtils.hasLength(password) ) {
            if (username.equals("admin") && password.equals("admin")) {
                data =1;
                msg="";
            }else{
                msg="用户名或密码错误";
            }
        }else{//参数为空
            msg = "非法参数";

        }
        result.put("state",state);
        result.put("data",data);
        result.put("msg",msg);
        return result;
    }

在这里插入图片描述

JSON.stringify(result)

请求转发或请求重定向

  • 请求转发 forward

    /**
         * 请求转发实现方式 1  请求转发是服务器端帮用户实现的
         * @return
         */
        @RequestMapping("/fw")
        public String myForward(){
            return "forward:/hello.html";
        }
        //省略
        @RequestMapping("/fw1")
        public String myForward1(){
            return "/hello.html";
        }
    
    
    /**
         * 请求转发实现方式 2
         * @param request
         * @param response
         * @throws ServletException
         * @throws IOException
         */
        @RequestMapping("fw2")
        public void myForward2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            request.getRequestDispatcher("/hello.html").forward(request,response);
        }
    
    
  • 请求重定向 redirect

/**
     * 请求重定向方式 1 重定向请求发生在客户端,服务器端不会对用户进行请求操作
     * @return
     */
    @RequestMapping("/rd")
    public String myRedirect(){
        return "redirect:/hello.html";
    }

/**
     * 请求重定向方式 2
     * @param response
     * @throws IOException
     */
    @RequestMapping("/rd2")
    public void myRedirect2(HttpServletResponse response) throws IOException {
        response.sendRedirect("hello.html");
    }

请求重定向 VS 请求转发

  1. 定义不同
  2. 跳转方式不同
  3. 数据共享不同
  4. 最终URL地址不同
  5. 代码实现不同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022年山东省中职组“网络安全”赛项比赛任务书正式赛题

2022年山东省中职组“网络安全”赛项 比赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 Nginx安全策略 A-3 日志监控 A-4 中间件服务加固 A-5 本地安全策略…

html的表单标签(form)

目录标题1、表单标签主要有三大类&#xff1a;2、表单标签中常见的属性3、例子代码及结果4、注意&#xff1a;5、表单中特殊的属性表单标签可以用来数据交互&#xff0c;而前面学的六个标签只能发送不能接收。 表单标签的作用就是数据交互1、表单标签主要有三大类&#xff1a; …

搭建本地私有仓库

目录 一、搭建本地私有仓库 1、首先下载registry镜像 2、在daemon.json文件中添加私有镜像仓库地址 3、运行restart容器 4、为镜像打标签 5、上传到私有仓库 6、列出私有仓库的所有镜像 7、列出私有仓库的centos镜像有哪些tag 8、删除原有的centos的镜像&#xff0c;再测试…

双目测距------双目相机V1.0,将双目相机采集到任意一点的深度数据进行串口传输(带源码)

Depth2Uart 双目测距------双目相机V1.0&#xff0c;将双目相机采集到任意一点的深度数据进行串口传输 一、项目说明/Overview 所实现的功能&#xff1a;基于Intel Realsense官方提供的SDK&#xff0c;双目深度相机能获取到相机任何一个像素点距离前方障碍物的距离&#xff0…

电子学会2022年12月青少年软件编程(图形化)等级考试试卷(三级)答案解析

目录 一、单选题(共25题&#xff0c;共50分) 二、判断题(共10题&#xff0c;共20分) 三、编程题(共3题&#xff0c;共30分) 青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;三级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 默认小猫角色…

FlinkCEP - Flink的复杂事件处理

版本说明 本文中以Flink 1.16.1 版本讲解说明 Note:Flink1.16.1版本相较于之前版本增强的within函数&#xff0c; 支持模式序列中相邻事件间的超时定义&#xff0c;以前版本只支持模式序列中第一个事件到最后一个事件之间的最大时间间隔。 快速开始 基于Kafka connecter 流…

C语言速成(有基础)

linux下的 是一种通用的、面向过程式的计算机编程语言 #include <stdio.h> //#include 预处理命令&#xff0c;用来引用头文件&#xff0c; stdio.h 头文件 int main() //开始 {/* 一个注释 */printf("Hello, World! \n");return 0; …

最强大的人工智能chatGPT不会还有人没用过吧,再不用就out了

&#x1f517; 运行环境&#xff1a;chatGPT &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f9…

JUC并发编程 Ⅱ -- 共享模型之管程(上)

文章目录共享带来的问题临界区 Critical Section竞态条件 Race Conditionsynchronized 解决方案synchronized语法解决方案思考面向对象改进方法上的 synchronized线程八锁变量的线程安全分析成员变量和静态变量是否线程安全&#xff1f;局部变量是否线程安全&#xff1f;局部变…

搜索插入位置-力扣35-java

一、题目描述给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums [1,3,5,6], target 5输出: 2示例 2:输…

制作自己的ChatGPT

众所周知&#xff0c;ChatGPT 目前能够取得令人印象深刻的壮举。 很可能许多人都有在他们自己的项目中使用该技术的想法。 不过需要注意的是&#xff0c;ChatGPT 目前并没有官方的 API。 使用非官方 API 可能会导致困难。 目前需要手动获取access token和cloudflare token才能…

基于Java+SpringBoot+Vue前后端分离学生宿舍管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《S…

智慧水务未来技术发展方向预测探讨

随着科技的不断发展和城市化的加速&#xff0c;智慧水务作为一种新的水务模式&#xff0c;逐渐受到广泛关注。未来&#xff0c;智慧水务将会面临更多的技术挑战和商机。本博客将对智慧水务的未来技术发展方向进行预测&#xff0c;以探讨智慧水务未来可能的技术重点。 1. 人工…

MySQL数据库11——子查询语句

嵌入一个SELECT的语句称为子查询语句。虽然内连接也可以代替子查询&#xff0c;但是内连接效率不高。而且我个人觉得子查询更好理解。 单值子查询 果子查询返回单值&#xff0c;则可以使用关系运算符&#xff0c;例如&#xff0c;等于&#xff08;&#xff09;、不等于&#x…

【C语言】“指针的运算”、“指针与数组”

文章目录一、指针运算1.指针 - 整数2.指针-指针3.指针关系运算二、指针与数组三、二级指针四、指针数组完结一、指针运算 指针可以进行整数&#xff0c;指针-指针&#xff0c;还有关系运算&#xff0c;其他的运算会被编译器阻止。 1.指针 - 整数 对指针进行的时候一定要注意不…

【SSM】篇一:初试Spring--Ioc与Bean

文章目录1、Spring2、SpringFramework系统架构3、Bean--Bean的配置Bean的实例化Bean的生命周期1、Spring Spring地址&#xff1a;https://spring.io Spring技术的优点&#xff1a; Spring家族&#xff08;Spring全家桶&#xff09;&#xff1a; 2、SpringFramework系统架构 S…

MySQL数据库10——多表连接查询

数据如果在多个表里面&#xff0c;需要进行连接查询。 一般在pandas里面merge合并会用到一个索引&#xff0c;按这个索引的规则进行合并叫做有规则的等值连接。若不按规则连接&#xff0c;遍历两两组合的所有可能性&#xff0c;叫做笛卡尔积。 笛卡尔积连接 通常人们都会设置…

R语言学习笔记

1.R语言介绍 2.R语言安装 官网&#xff1a;https://www.r-project.org/ CARN → 选择China中任意镜像站点 → Download R for Windows → base&#xff08;二进制版本R基础软件&#xff09;→ Download R-4.2.2 for Windows (76 megabytes, 64 bit) 3.Rstudio安装 https://po…

【Call for papers】SIGCOMM-2023(CCF-A/计算机网络/2023年2月15日截稿)

ACM SIGCOMM is the flagship annual conference of the ACM Special Interest Group on Data Communication (SIGCOMM). ACM SIGCOMM 2023, the 37th edition of the conference series, will be held in New York City, US, September 10 - 14, 2023. 文章目录1.会议信息2.时…

C语言(文件输入输出操作)

目录 一.文件 1.文件概念 2.文本模式和二进制模式 (1)模式结尾映射 (2)存储精度 3.I/O级别 一.文件 1.文件概念 文件:在磁盘或固态硬盘上一段已命名的存储区。对于C来说&#xff0c;文件就是一系列连续的字节&#xff0c;每个字节都能被单独读取&#xff08;在计算机当…