StringMVC

目录

一,MVC定义

二,SpringMVC的基本使用 

2.1建立连接 - @RequestMapping("/...")

​编辑

2.2请求

1.传递单个参数

2.传递多个参数

3.传递对象

4.参数重命名

5.传递数组

6. 传递集合

7.传递JSON数据

8. 获取url中数据

9. 传递文件

10.获取Cookie

11.获取session

12.获取header

​编辑

2.3响应

1.返回静态页面

2.返回html片段

3. 返回JSON

 4.设置状态码

5.设置Header


一,MVC定义

MVC,英文名Model-View-Controller,是软件工程中的一种软件架构模式。MVC模式分离了应用程序的数据访问,用户界面,和处理逻辑。

  • Model(模型)模型是用来处理数据和业务逻辑,在MVC 模式中,模型与视图是分离的,模型并不知道视图的存在。
  • View(视图)视图是用户看到和交互的界面,例如网页,窗口等。视图通常是动态生成的。
  • Controller(控制器)控制器接收用户的请求,并调用模型和视图去完成用户的需求。控制器本身不输出任何东西和做任何处理,它只是接收请求并决定调用哪个模型构件和哪个视图来处理请求。

二,SpringMVC的基本使用 

学习Spring MVC 就是学习如何通过浏览器和用户程序进行交互,主要分为一下三个方面:

  1. 建立连接:将浏览器于Java程序连接起来,就是访问一个网址能调用Spring程序
  2. 接收请求:用户请求可能会带一些参数,要学会在程序中接收这些参数
  3. 返回响应:直接完业务逻辑后,要将程序运行的结果返回给用户

2.1建立连接 - @RequestMapping("/...")

@RequestMapping 注解是用来注册接口的路由映射的。表示服务接收到请求时,路径为 /... 的请求会调用对应的方法。

该注释既可以修饰方法也可以修饰类,如果两者同时加注释的话,它的访问地址就是 类路径 + 方法路径,举个例子:

@RestController
@RequestMapping("/test")
public class Test {
    @RequestMapping("/hello")
    public String test1(){
        return "hello world!";
    }
}
//这里的路径是指:类路径(/test)+ 方法路径(/hello)

@RequestMapping注释既支持post请求也支持get请求,也可以限定只支持其中一个请求方式,代码如下:

@RestController
@RequestMapping("/test")
public class Test {
    //如果只有一个参数,就会默认赋值给value这个属性,如果有多个参数,就需要属性名 = ...
    //此处表示只支持post请求
    @RequestMapping(value = "/hello",method = RequestMethod.POST)
    public String test1(){
        return "hello world!";
    }
}

2.2请求

一般的参数名要与请求中给的数据一致

1.传递单个参数

    @RequestMapping("/r1")
    public String r1(String name){
        return "name = " + name;
    }

2.传递多个参数

    @RequestMapping("/r2")
    public String r2(String name, Integer age){
        return "name = " + name+", age = " + age;
    }

3.传递对象

    @RequestMapping("/r3")
    public String r3(User user){
        //User是单独创建的一个对象,需要有构造方法和get()
        return user.toString();
    }

4.参数重命名

当请求中的给的名称与参数名不一致时,可以使用 @RequestParam注解

    @RequestMapping("/r4")
    public String r4(@RequestParam("name") String username, Integer age){
        return "name = " + username+", age = " + age;
    }

使用@RequestParam注解还有一点需要注意:它修饰的参数默认是必须传值的,如果没有传值,就会报错。当然也可以设置为非必传,代码如下:

    @RequestMapping("/r4")
    public String r4(@RequestParam(value = "name", required = false) String username, Integer age){
        return "name = " + username+", age = " + age;
    }

5.传递数组

    @RequestMapping("/r5")
    public String r5(int[] arr){
        return Arrays.toString(arr);
    }

有两种请求方式 :

6. 传递集合

集合参数:和数组类似, 同⼀个请求参数名有为多个, 且需要使⽤ @RequestParam 绑定参数关系
默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,必须使用@RequestParam 绑定参数关系。
此次的请求与数组一致,就不再贴图了。
    @RequestMapping("/r6")
    public String r6(@RequestParam List<Integer> lst){
        return lst.toString();
    }

7.传递JSON数据

JSON就是⼀种数据格式, 有自己的格式和语法, 使用文本表示⼀个对象或数组的信息, 因此
JSON本质是字符串. 主要负责在不同的语言中数据传递和交换,它是以键值对的形式表示,主要还是表示一个对象。
JSON给的数据是在请求的正文当中,所以需要使用@RequestBody注解,被该注解修饰的参数需要到请求正文中查找对应的数据,该注释只有一个属性就是required,也就是说它也可以设置该参数是否必传。
    @RequestMapping("/r7")
    public String r7(@RequestBody User user){
        return user.toString();
    }

8. 获取url中数据

这里需要使用@PathVariable,该注释主要作用在url路径的数据绑定上,即默认参数写在url上。该注释也可以设置成非必传,但是一般都是默认的。

    @RequestMapping("/r8/{name}")
    public String r8(@PathVariable String name){
        return name;
    }

9. 传递文件

     @RequestMapping("/r9")
    public String r9(@RequestPart MultipartFile file) throws IOException {
        String filename = file.getOriginalFilename();//获取文件名
        file.transferTo(new File("D:/二次元/"+filename));//将文件上传到指定的路径
        return filename;
    }

10.获取Cookie

    @RequestMapping("/r10")//这里的两个参数,是spring内置的,用到的时候可以直接加上
    public String r10(HttpServletRequest request, HttpServletResponse response) {

    }

    //获取cookie的第一种写法,能得到所有的cookie
    @RequestMapping("/r10")
    public String r10(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        String res = "";
        for(Cookie x : cookies){
            res = res +  x.getName() + ":" + x.getValue();
        }
        return res;
    }

    //第二种写法,获取名为Cookie_2对应value
    @RequestMapping("/r11")
    public String r11(@CookieValue("Cookie_2") String value) {
        return value;
    }

11.获取session

    //三种方式都行
    @RequestMapping("/r12")
    public String r12(HttpServletRequest request) {
        HttpSession session = request.getSession();
        String username = (String)session.getAttribute("username");
        return username;
    }
    @RequestMapping("/r13")
    public String r13(HttpSession session) {
        String username = (String)session.getAttribute("username");
        return username;
    }

    @RequestMapping("/r14")
    public String r14(@SessionAttribute("username") String name) {
        return name;
    }

12.获取header

    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request){
        //请求头中的数据是以键值对的形式存储,所以和map的用法差不多
        String userAgent = request.getHeader("User-Agent");
        return userAgent;
    }

    @RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("User-Agent") String userAgent){
        return userAgent;
    }

2.3响应

1.返回静态页面

@Controller
@RequestMapping("/demo")
public class Demo {
    @RequestMapping("/r1")
    public String r1(){
        return "/index.html";
    }
}

这里需要讲解一下@RequestController注解与@Controller注解的区别,先看一下它们的源码:

//@Controller
@Target({ElementType.TYPE})//表示能作用的目标(比如:类,方法)
@Retention(RetentionPolicy.RUNTIME)//表示生命周期
@Documented
@Component
public @interface Controller {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}
//@ResquestController
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

我们可以发现,@RequestController = @Controller + @ResponseBody,而@Controller注释只负责告诉Spring帮我们管理哪些程序,所以关键是@ResponsBody注释,它的作用是保证返回的一定是数据,如果不加该注释,那么默认返回的是一个网页。

 @ResponsBody注解既可以修饰类,也可以修饰方法,修饰类,那么该类中的所有方法都返回数据;修饰方法,表示该方法返回的数数据,当一个类中的方法既要返回数据也要返回页面时,要给该类使用@Controller注解,再给返回数据的方法加上@ResponseBody注解。

2.返回html片段

直接返回数据,spring会根据返回的结果,动态设置response的content-type

    @ResponseBody
    @RequestMapping("/r2")
    public String r2(){
        return "<h1>.....</h1>";
    }

3. 返回JSON

类和哈希都会自动转换成 json格式来返回

    @ResponseBody
    @RequestMapping("/r3")
    public User r3(){
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        user.setSex("男");
        return user;
    }

    @ResponseBody
    @RequestMapping("/r4")
    public Map<String, String> r4(){
        HashMap map = new HashMap();
        map.put("key", "value");
        map.put("zhangsan", "lisi");
        return map;
    }

 4.设置状态码

    @ResponseBody
    @RequestMapping("/r7")
    public String r7(HttpServletResponse response){
        response.setStatus(404);
        return "设置成功";
    }

5.设置Header

Http响应报头也会向客户端传递一些信息,比如服务程序的名称,请求资源已移动到新地址等,如:Content-Type,Local等。这些信息通过@RequestMapping注解来实现,先看看它的源码:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";

    @AliasFor("path")
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};

    String[] consumes() default {};

    String[] produces() default {};
}
  • value:指映射的URL
  • method:指请求的method类型,比如:post,get,put...
  • consumes:指处理请求(request)的提交内容类型(Content-Type)
  • produces:指返回提交内容类型,仅当request请求头中的Accept类型包含该指定类型才返回
  • params:request中必须包含某参数值时,才让该方法处理
  • header:request中必须包含某指定的header参数值时,才让该方法处理

 设置Content-Type

    @ResponseBody
    @RequestMapping(value = "/r9",produces = "application/json")
    public String r9(){
        return "1111";
    }

自定义Header:这里的key和value是可以自己随意指定的

    @ResponseBody
    @RequestMapping("/r10")
    public String r10(HttpServletResponse response) {
        response.setHeader("key","value");
        return "设置成功";
    }

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp+canvas实现逐字手写效果

在移动端使用 UniApp 进行逐字手写的功能。用户可以在一个 inputCanvas 上书写单个字&#xff0c;然后在特定时间后将这个字添加到 outputCanvas 上&#xff0c;形成一个逐字的手写效果。用户还可以保存整幅图像或者撤销上一个添加的字。 初始化 Canvas&#xff1a; 使用 uni.c…

每日一题《leetcode--1472.设计浏览器历史记录》

https://leetcode.cn/problems/design-browser-history/ 这里我是用双栈实现前进和后退。 #define URL_SIZE 21 #define STACK_SIZE 5000typedef struct {char *BackStack[STACK_SIZE]; //回退栈char *ForwardStack[STACK_SIZE]; //前进栈int BackTop; //回退栈的栈顶下标…

3D瓦片地图组件上线|提供DEM数据接入,全方位呈现三维地图地形!

在用户调研中&#xff0c;我们了解到很多用户自身的可视化项目&#xff0c;需要在垂直空间上表现一些业务&#xff0c;例如&#xff1a;3D地形效果&#xff0c;数据底板建设等&#xff0c;而传统的地图效果不满足此用户需求。瓦片地图能够无限加载大地图&#xff0c;以更三维的…

云端升级,智能适配——LDR6282,USB-C接口显示器的最佳选择

华为MateView USB-C接口显示器技术深度解析与科普 随着科技的飞速发展&#xff0c;终端显示产品也迎来了全新的变革。在众多更新迭代中&#xff0c;华为MateView显示器凭借其独特的USB-C接口设计&#xff0c;为用户带来了前所未有的便捷体验。本文将带您深入探索这款显示器的技…

uniapp开发vue3监听右滑返回操作,返回到指定页面

想要在uniapp框架中监听左滑或者右滑手势&#xff0c;需要使用touchstart和touchend两个api&#xff0c;因为没有原生的左右滑监听api&#xff0c;所以我们只能依靠这两个api来获取滑动开始时候的x坐标和滑动结束后的x坐标做比对&#xff0c;右滑的话&#xff0c;结束时候的x坐…

Flutter 页面布局 Flex Expanded弹性布局

题记 —— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精&#xff0c;即是折腾每一天。 什么是弹性布局&#xff08;Flex&#xff09;&#xff1f; 弹性布局&#xff08;Flex&#xff09;是一种基于弹性盒子模型的布局方式&#xff0c;类…

【如何让论文中摘要后面的内容不出现在目录中】

首先选择摘要二字&#xff0c;设置为一级标题&#xff0c;然后选择摘要后面的内容设置为正文样式&#xff0c;再选择这一部分看一下是不是都是正文大纲级别&#xff0c;如果是那就可以了。 具体流程如下 1、选择摘要二字&#xff0c;设置为一级标题样式 2、选择摘要后面的文…

Springboot零星知识点1

1、请求路径的组成 2、多个环境配置文件 3、对 自定义的属性 增加文字描述&#xff0c;而且IDEA不会警告 4、读取属性值的两种方式 5、东东

TP6 模型批量插入获取插入的自增ID

在TP框架中&#xff0c;数据插入 添加一条数据,返回添加成功的条数 $data [foo > bar, bar > foo]; Db::name(user)->save($data); // 或者 Db::name(user)->insert($data); 批量添加 $data [[foo > bar, bar > foo],[foo > bar1, bar > foo1],[…

【管理咨询宝藏112】波士顿现场精益生产及运营管理整体优化方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏112】波士顿现场精益生产及运营管理整体优化方案 【格式】PDF版本 【关键词】波士顿咨询、精益生产、运营提升 【核心观点】 - 家电市场的发展要…

推荐几款新手学习编程的网站

免费在线开发平台 介绍一款编程平台&#xff0c;专为学生和开发者量身打造&#xff01;平台拥有近4000道编程题目&#xff0c;支持多种编程语言&#xff08;包括C、C、JavaScript、TypeScript、Go、Rust、PHP、Java、Ruby、Python3和C#&#xff09;&#xff0c;为您提供全面的学…

蓝桥杯-数三角(ac代码时间复杂度分析)

问题描述 小明在二维坐标系中放置了 ( n ) 个点&#xff0c;他想在其中选出一个包含三个点的子集&#xff0c;这三个点能组成三角形。然而这样的方案太多了&#xff0c;他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形&#xff1f…

dubbo复习:(7)使用sentinel对dubbo服务进行限流

一、下载sentinel-dashboard 并启动 java -Dserver.port8080 -Dcsp.sentinel.dashboard.serverlocalhost:8080 -Dproject.namesentinel-dashboard -jar sentinel-dashboard.jar二、在spring boot应用中增加sentinel相关依赖 <dependency><groupId>com.alibaba.csp…

Mybatis Cache(二)MybatisCache+Redis

前面提到了&#xff0c;使用mybatis cache&#xff0c;一般是结合redis使用。 一、demo 1、数据表 create table demo.t_address (id int auto_incrementprimary key,address_name varchar(200) null,address_code varchar(20) null,address_type int n…

Star CCM+在电池热管理中SOC计算、充电Map调用、电池内阻调用的方法

前言 众所周知电池充电电流是随着电池温度与容量变化查表获得(形式见下表),其中电池的充电倍率(电流)是阶梯变化的,而内阻是线型变化的。因此为了仿真的准确定,需要在软件中实现数据的调用,计算电池的发热量。 电池内阻/充电倍率表 一 SOC计算 SOC的估算方法有开路电…

selenium安装出错

selenium安装步骤&#xff08;法1&#xff09;&#xff1a; 安装失败法1 第一次实验&#xff0c;失败 又试了一次&#xff0c;失败 安装法2-失败&#xff1a; ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问。: c:\\programdata\\a…

swust oj 1075: 求最小生成树(Prim算法)

#include <iostream> using namespace std;typedef struct {int n;int e;char data[500];int edge[500][500]; }Graph;typedef struct {int index;int cost; }mincost;typedef struct {int x;//起点int y;//终点int weight;//权重 }EDGE;typedef struct {int index;int …

Bugku Crypto 部分题目简单题解(四)

目录 python_jail 简单的rsa 托马斯.杰斐逊 这不是md5 进制转换 affine Crack it rsa python_jail 启动场景 使用虚拟机nc进行连接 输入print(flag) 发现报错&#xff0c;经过测试只能传入10个字符多了就会报错 利用python中help()函数&#xff0c;借报错信息带出flag变…

2024年商业管理与文化传播国际学术会议(ICBMCC 2024)

2024年商业管理与文化传播国际学术会议&#xff08;ICBMCC 2024) 2024 International Conference on Business Management and Cultural Communication 一、【会议简介】 2024年商业管理与文化传播国际学术会议&#xff08;ICBMCC 2024&#xff09;是一次汇集全球商业管理领域…

SwiftUI中的手势(MagnificationGesture、 RotationGesture)

通过前两篇文章的探索&#xff0c;手势的基本使用规则已经较深的了解&#xff0c;本篇文章主要看看放缩手势MagnificationGesture和旋转手势RotationGesture。 MagnificationGesture 放缩手势 放缩手势在App中用的也比较广泛&#xff0c;下面先看一个示例效果&#xff1a; 上…