Spring Web MVC的入门学习(二)

news2024/11/26 12:52:22

本篇接着Spring Web MVC的入门学习(一)-CSDN博客来继续学习Spring MVC。

一、从请求中获取Header

1、传统获取 header

获取Header也是从 HttpServletRequest 中获取。
代码:
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/getHeader")
    public String param10(HttpServletRequest request, HttpServletResponse response)
    {
        String userAgent = request.getHeader("User-Agent");
        return "userAgent: "+userAgent;
    }
}
使用HttpServletRequest 提供的getHeader方法来获取, 参数对应HTTP请求报头的"Key" 。
访问: http://127.0.0.1:8080/param/getHeader

响应结果:

 这里可以通过Fiddler观察结果是否正确。

2、简洁获取 Header

 代码:

@RequestMapping("/getHeader2")
public String header(@RequestHeader("User-Agent") String userAgent) {
  return "userAgent:"+userAgent;
}
@RequestHeader注解的参数值为HTTP请求报头中的"Key"

 访问:http://127.0.0.1:8080/param/getHeader2

 响应结果:

 二、响应

在前面的代码中,我们都设置了响应数据, Http响应结果可以是数据, 也可以是静态页面,也可
以针对响应设置状态码, Header信息等。

1、返回静态页面

创建前端页面 index.html(注意创建的路径)

idea如图:

 

 index.html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index⻚⾯</title>
</head>
<body>
    Hello,Spring MVC,我是Index⻚⾯.
</body>
</html>

 后端代码:

@RestController
public class IndexController {
    @RequestMapping("/index")
    public Object index(){
      //返回index.html
      return "/index.html";
    }
}

 我们来访问一下试试:http://127.0.0.1:8080/index

发现结果为:

 

结果却发现, 页面未正确返回, http响应把 "/index.html" 当做了http响应正文的数据。
那Spring MVC如何才能识别出来 index.html 是⼀个静态页面, 并进行返回呢?
我们需要把 @RestController 改为 @Controller。

正确代码如下:

@Controller
public class IndexController {
    @RequestMapping("/index")
    public Object index(){
      //返回index.html
      return "/index.html";
    }
}

 再次访问: http://127.0.0.1:8080/index

此时结果就正确了:

@RestController @Controller 有着什么样的关联和区别呢?

我们在学习MVC模式时, 知道后端会返回视图, 这是早期时的概念。
随着互联网的发展, 目前项目开发流行"前后端分离"模式, Java主要是用来做后端项目的开发, 所以也就 不再处理前端相关的内容了MVC的概念也逐渐发生了变化, View不再返回视图, 而是返回显示视图时需要的数据. 所以前面使用的 @RestController 其实是返回的数据。
@RestController = @Controller + @ResponseBody
@Controller : 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
@ResponseBody : 定义返回的数据格式为非视图, 返回⼀个 text/html 信息
如果想返回视图的话, 只需要把 @ResponseBody 去掉就可以了, 也就是 @Controller

 2、返回数据@ResponseBody

根据前面,我们就知道 @ResponseBody 表示返回数据.

@Controller
@ResponseBody
public class IndexController {
    @RequestMapping("/index")
    public Object index(){
        return "/index.html";
    }
}

 上面代码,加上 @ResponseBody 注解, 该方法就会把 "/index.html" 当做⼀个数据返回给前端.

 @ResponseBody 既是类注解, 又是方法注解;

如果作用在类上, 表示该类的所有方法, 返回的都是数据, 如果作用在方法上, 表示该方法返回的是数据.
也就是说: 在类上添加 @ResponseBody 就相当于在所有的方法上添加了 @ResponseBody 注解.
同样, 如果类上有 @RestController 注解时:表示所有方法上添加了 @ResponseBody
解, 也就是当前类下所有的方法返回值都为响应数据。
如果⼀个类的方法里, 既有返回数据的, 又有返回页面的, 就把 @ResponseBody 注解添加到对应的要返回数据的方法上即可。
参考代码:
@Controller
public class IndexController {
    @RequestMapping("/index")
    public Object index(){
        return "/index.html";
    }
    @RequestMapping("/returnData")
    @ResponseBody
    public String returnData(){
        return "该⽅法返回数据";
    }
}
运行程序, 访问浏览器: http://127.0.0.1:8080/returnData
响应结果如下:

如果对 returnData 方法去掉 @ResponseBody 注解, 程序会报404错误。

程序会认为需要返回的是视图, 根据内容去查找文件, 但是查询不到, 路径不存在, 报404 。

 3、返回HTML代码片段

 后端返回数据时, 如果数据中有HTML代码, 也会被浏览器解析

 示例代码:

@RequestMapping("/returnHtml")
@ResponseBody
public String returnHtml() {
   return "<h1>Hello,HTML~</h1>";
}

运行程序, 访问浏览器:http://127.0.0.1:8080/returnHtml

响应结果如下:

 可以发现数据中的HTML代码, 被浏览器解析,显示出来的为一级标题的形式。

4、返回JSON

Spring MVC 也可以返回JSON;后端方法返回结果为对象

示例代码:

@RequestMapping("/returnJson")
@ResponseBody
public HashMap<String, String> returnJson() {
    HashMap<String, String> map = new HashMap<>();
    map.put("Java", "Java Value");
    map.put("MySQL", "MySQL Value");
    map.put("Redis", "Redis Value");
    return map;
}

 运行程序, 浏览器响应结果如下: http://127.0.0.1:8080/returnJson

 通过Fiddler观察响应结果, Content-Type application/json

5、设置状态码

Spring MVC会根据我们方法的返回结果自动设置响应状态码, 我们也可以手动指定状态码。
通过Spring MVC的内置对象HttpServletResponse 提供的方法来进行设置

代码:

@RequestMapping(value = "/setStatus")
@ResponseBody
public String setStatus(HttpServletResponse response) {
    response.setStatus(401);
    return "设置状态码成功";
}

运行程序, 浏览器响应结果如下: http://127.0.0.1:8080/setStatus

 

 状态码不影响页面的展示。

三、设置Header

Http响应报头也会向客户端传递⼀些附加信息,比如服务程序的名称,请求的资源已移动到新地址等, 如: Content-Type, Local等.
这些信息通过 @RequestMapping 注解的属性来实现。
  • value: 指定映射的URL
  • method: 指定请求的method类型, 如GET, POST等
  • consumes: 指定处理请求(request)的提交内容类型(Content-Type),例如application/json,text/html;
  • produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
  • Params: 指定request中必须包含某些参数值时,才让该方法处理
  • headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求

1、设置Content-Type

我们通过设置 produces属性的值, 设置响应的报头Content-Type

代码:

@RequestMapping(value = "/returnJson2",produces = "application/json")
@ResponseBody
public String returnJson2() {
    return "{\"success\":true}";
}

运行程序, 浏览器响应结果如下: http://127.0.0.1:8080/returnJson2

 

 如果不设置produces ,方法返回结果为String时, Spring MVC默认返回类型, 是text/html.

设置返回类型时, 也可以同步设置响应编码 :

代码:

@RequestMapping(value = "/returnJson2",produces = "application/json;charset=utf-8")
@ResponseBody
public String returnJson2() {
    return "{\"success\":true}";
}

2、设置其他Header

 设置其他Header的话, 需要使用Spring MVC的内置对象HttpServletResponse 提供的方法来进行设置。

示例代码:

@RequestMapping(value = "/setHeader")
@ResponseBody
public String setHeader(HttpServletResponse response) {
    response.setHeader("MyHeader","MyHeaderValue");
    return "设置Header成功";
}
void setHeader(String name, String value) 设置⼀个带有给定的名称和值的 header. 如果 name已经存在, 则覆盖旧的值。

运行程序, 浏览器响应结果如下: http://127.0.0.1:8080/setHeader

通过Fiddler来观察设置的结果:

 

Spring MVC 的入门学习就先介绍到这里了,接下来会继续更新Spring MVC的相关实现综合案例,欢迎继续收看!

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

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

相关文章

社交网络的未来图景:探索Facebook的发展趋势

随着科技的不断进步和社会的快速变迁&#xff0c;社交网络作为连接人与人之间的重要纽带&#xff0c;扮演着日益重要的角色。而在众多社交网络中&#xff0c;Facebook作为老牌巨头&#xff0c;一直在探索着新的发展路径&#xff0c;引领着社交网络的未来图景。本文将深入探索Fa…

linux学习:栈(汉诺塔游戏)

第一根上面套着 64 个圆的金片&#xff0c;最大的一个在底下&#xff0c;其余一个比一个小&#xff0c;依次叠上去&#xff0c;庙里的众僧不倦地 把它们一个个地从这根棒搬到另一根棒上&#xff0c;规定可利用中间的一根棒作为帮助&#xff0c;但每次只能 搬一个&#xff0c;而…

【vue】v-model 双向数据绑定

:value&#xff1a;单向数据绑定v-model&#xff1a;双向数据绑定 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Maven创建项目

目录 1.创建项目 2.从Maven Repository: Search/Browse/Explore (mvnrepository.com)链接&#xff0c;下载API 3.1.0 3.在main文件内创建webapp文件夹&#xff0c;再webapp文件夹内创建WEB-INF文件夹&#xff0c;在WEB-INF文件夹内创建web.xml 4.网络编程 5.打包 6.部署 …

Leetcode二十三题:合并K个升序链表【22/1000 python】

“合并K个升序链表”&#xff0c;这是一道中等难度的题目&#xff0c;经常出现在编程面试中。以下是该问题的详细描述、解题步骤、不同算法的比较、代码示例及其分析。 问题描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中…

vue快速入门(十九)使用动态类绑定实现TabBar动态样式

注释很详细&#xff0c;直接上代码 上一篇 新增内容 vue绑定动态样式根据点击事件获取当前点击部分序号 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"width…

开源模型应用落地-chatglm3-6b-function call-入门篇(六)

一、前言 每个模型都有自己的限制&#xff0c;有些情况下它们无法满足复杂的业务需求。但是&#xff0c;可以通过一个外置函数的方式&#xff0c;例如&#xff1a;"Function Call"&#xff0c;让开发者能够更加灵活地利用大型语言模型&#xff0c;帮助开发者在特定场…

《QT实用小工具·十九》回车跳转到不同的编辑框

1、概述 源码放在文章末尾 该项目实现通过回车键让光标从一个编辑框跳转到另一个编辑框&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : p…

【Nacos】Nacos最新版的安装、配置过程记录和踩坑分享

Nacos是什么&#xff1f;有什么功能&#xff1f;大家可以自行联网&#xff08;推荐 https://cn.bing.com/&#xff09;搜索&#xff0c;这里就不做介绍了。 简单的看了下官网&#xff0c;安装最新版的Nacos&#xff08;v2.3.2&#xff09;需要使用到JDK&#xff08;1.8.0&…

JS原生DOM操作 - 获得元素/网页大小/元素宽高

文章目录 获得元素的方法获取页面元素位置宽高概念方法获得网页/元素宽高clientHeight和clientWidth&#xff1a;scrollHeight和scrollWidth&#xff1a;window.innerWidth&#xff1a;element.style.width&#xff1a; offsetXXX 获得网页元素的宽高和相对父元素位置&#xff…

关于运行阿里云直播Demo pub get 报的错

flutter --version dart --version 如何使用Flutter框架推流_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心MediaBox音视频SDK下载指南_音视频终端 SDK(Apsara Video SDK)-阿里云帮助中心 终端输入 dart pub --trace get --no-precompile 打印详细报错信息 详细咨…

⭐Unity 里调用弹出电脑系统文件选择窗 (选择图片/文件)

今天遇到的需求要从Uinty里调用选择程序外的图片&#xff0c;类似手机环境下拿图库的照片一样。 效果如下: 话不多说 直接上代码&#xff01; 1.编辑器模式下 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using Syst…

Android Studio开发学习(六)———TableLayout(表格布局)、FrameLayout(帧布局)

目录 前言 一、Tablelayout &#xff08;一&#xff09;Tablelayout的相关简介 &#xff08;二&#xff09;TableLayout使用方法 1. 当TableLayout下面写控件、则控件占据一行的大小。(自适应一行&#xff0c;不留空白) 2.多个组件占据一行&#xff0c;则配合TableRow实现…

RocketMQ之Topic和Tag最佳实践

一、Topic是什么&#xff1f;它的作用&#xff1f; Topic即主题&#xff0c;是消息队列中用于对消息进行分类和组织的一种机制&#xff0c;它有以下三种作用&#xff1a; 标识消息分类&#xff1a;RocketMQ的主题用于对消息进行分类和组织。通过为不同类型的消息分配不同的主题…

FireProx:一款功能强大的AWS API网关管理与IP地址轮换代理工具

关于FireProx FireProx是一款功能强大的AWS API网关安全管理工具&#xff0c;该工具可以帮助广大研究人员创建实现唯一IP地址轮换的实时HTTP转发代理。 在发送网络请求或进行网络交互时&#xff0c;实现源IP地址轮换是一个非常复杂的过程&#xff0c;虽然社区中也有相关的工具…

ShardingSphere再回首

概念&#xff1a; 连接&#xff1a;通过协议 方言及库存储的适配&#xff0c;连接数据和应用&#xff0c;关注多模数据苦之间的合作 增量&#xff1a;抓取库入口流量题提供重定向&#xff0c; 流量变形(加密脱敏)/鉴权/治理(熔断限流)/分析等 可插拔&#xff1a;微内核 DDL:cr…

皮具5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

皮具5G智能制造工厂数字孪生可视化平台&#xff0c;推进企业数字化转型。随着信息技术的快速发展&#xff0c;数字化转型已成为企业提升竞争力、实现可持续发展的关键路径。皮具行业&#xff0c;作为一个传统的手工制造业&#xff0c;正面临着巨大的市场变革和技术挑战。如何在…

(Java)数据结构——图(第十节)AOE网以及关键路径

目录 前言 AOE网 AOE网的两个性质&#xff1a; AOE网的五个时间 事件的最早发生时间Ve[k] 活动的最早开始时间E[i] 事件的最迟发生时间Vl[k] 活动的最晚开始时间L[i] 活动的时间余量 关于关键路径的缩短 代码实现思路 前言 本博客是博主用于复习数据结构以及算法的博…

蓝桥杯备赛刷题——css

新鲜的蔬菜 这题需要使用grid 我不会 去学一下 一.什么是grid Grid 布局与 Flex 布局有一定的相似性&#xff0c;都可以指定容器内部多个项目的位置。但是&#xff0c;它们也存在重大区别。 Flex 布局是轴线布局&#xff0c;只能指定"项目"针对轴线的位置&#…

(非技术) 基因遗传相关知识学习笔记

目录 一、基因遗传名词解释 二、什么叫显性遗传和隐性遗传&#xff1f; 三、如何确定遗传性质呢&#xff1f;是显性还是隐性&#xff1f; 四、常规例子1&#xff1a; 五、常规例子2&#xff1a; 六、实际案例&#xff1a; 七、思考题&#xff1a; 八、参考&#xff1a; …