深入了解springmvc响应数据

目录

一、前后端分离开发与混合开发

1.1 混合开发模式

1.2  前后端分离模式【重点】

二、页面跳转控制

2.1 通过JSP实现页面跳转

2.2 转发与重定向

三、返回JSON数据

3.1 导包与配置

 3.2 使用@ResponseBody

四、返回静态资源

4.1 为什么无法直接查询静态资源

4.2 配置实现静态资源查找


一、前后端分离开发与混合开发

一个项目的开发可以分为两种开发模式,分别是前后端分离和混合开发。以下介绍两种开发模式的特点。

1.1 混合开发模式

指将前端和后端的代码集成在同一个项目中,共享相同的技术栈和框架。这种模式在小型项目中比较常见,可以减少学习成本和部署难度。但是,在大型项目中,这种模式会导致代码耦合性很高,维护和升级难度较大。

对于混合开发,我们就需要使用动态页面技术,动态展示Java的共享域数据!!

1.2  前后端分离模式【重点】

指将前端的界面和后端的业务逻辑通过接口分离开发的一种方式。开发人员使用不同的技术栈和框架,前端开发人员主要负责页面的呈现和用户交互,后端开发人员主要负责业务逻辑和数据存储。前后端通信通过 API 接口完成,数据格式一般使用 JSON 或 XML。前后端分离模式可以提高开发效率,同时也有助于代码重用和维护。


二、页面跳转控制

这里页面跳转都是基于jsp技术。即混合开发模式下的应用。

2.1 通过JSP实现页面跳转

1.使用jsp技术,需要导入以下依赖

<!-- jsp需要依赖! jstl-->
<dependency><groupId>jakarta.servlet.jsp.jstl</groupId><artifactId>jakarta.servlet.jsp.jstl-api</artifactId><version>3.0.0</version>
</dependency>

2.jsp页面创建

建议位置:/WEB-INF/下,避免外部直接访问!

位置:/WEB-INF/views/home.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>Title</title></head><body><!-- 可以获取共享域的数据,动态展示! jsp== 后台vue -->${data}</body>
</html>

1.为什么/WEB-INF/能够实现避免外部访问

这种限制的实现是由 Java Web 容器(比如 Tomcat、Jetty 等)来完成的,它们会拦截对 /WEB-INF/ 目录及其子目录的请求,阻止这些内容被直接访问。这样做的目的是为了保护应用程序的安全性和完整性,避免敏感信息和代码被非授权用户获取。

3. 快速响应模版页面

配置对应的mvc类

@EnableWebMvc  //json数据处理,必须使用此注解,因为他会加入json处理器
@Configuration
@ComponentScan(basePackages = "com.atguigu.controller") //TODO: 进行controller扫描//WebMvcConfigurer springMvc进行组件配置的规范,配置组件,提供各种方法! 前期可以实现
public class SpringMvcConfig implements WebMvcConfigurer {//配置jsp对应的视图解析器@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {//快速配置jsp模板语言对应的前缀和后缀registry.jsp("/WEB-INF/views/",".jsp");}
}

handler返回视图 

/***  跳转到提交文件页面  /save/jump*  *  如果要返回jsp页面!*     1.方法返回值改成字符串类型*     2.返回逻辑视图名即可    *         <property name="prefix" value="/WEB-INF/views/"/>*            + 逻辑视图名 +*         <property name="suffix" value=".jsp"/>*/
@GetMapping("jump")
public String jumpJsp(HttpServletRequest request){//设置共享域request.setAttribute( s: "data", o: "hello jsp!!!");model.addAttribute("data","]spController.index");return "index";
}

运行后结果:

1. 由于在配置中加上了前缀和后缀,所以return的值只需要对应jsp页面的名称即可

2. 混合开发模式下,前后端的数据交流是通过共享域进行的。


2.2 转发与重定向

在springMvc中实现转发和重定向是通过关键词Forward和Redirect来实现的。

@RequestMapping("/redirect-demo")
public String redirectDemo() {// 重定向到 /demo 路径 return "redirect:/demo";
}@RequestMapping("/forward-demo")
public String forwardDemo() {// 转发到 /demo 路径return "forward:/demo";
}//注意: 转发和重定向到项目下资源路径都是相同,都不需要添加项目根路径!填写项目下路径即可!

注意转发是只能访问项目下的资源,而重定向是可以重定向到其它资源,比如其它不属于本项目的网站。

 可能会问,转发下既然访问项目下的资源,而tomcat在部署的时候设置了根路径,是否需要把根路径也一并导入进去?答案是不需要

springmvc对转发做了优化,即自动帮你加上了对应的根路径,而如果再转发时候写上根路径,就会导致重复的根路径的填写。


三、返回JSON数据

由于使用JSON返回数据使用到@ResponseBody,就不再使用页面跳转中的跳转(forward)和重定向(redirect)

3.1 导包与配置

使用JSON数据需要导入以下包

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version>
</dependency>

写配置类

//TODO: SpringMVC对应组件的配置类 [声明SpringMVC需要的组件信息]//TODO: 导入handlerMapping和handlerAdapter的三种方式//1.自动导入handlerMapping和handlerAdapter [推荐]//2.可以不添加,springmvc会检查是否配置handlerMapping和handlerAdapter,没有配置默认加载//3.使用@Bean方式配置handlerMapper和handlerAdapter
@EnableWebMvc  //json数据处理,必须使用此注解,因为他会加入json处理器
@Configuration
@ComponentScan(basePackages = "com.atguigu.controller") //TODO: 进行controller扫描//WebMvcConfigurer springMvc进行组件配置的规范,配置组件,提供各种方法! 前期可以实现
public class SpringMvcConfig implements WebMvcConfigurer {}

 3.2 使用@ResponseBody

如果使用JSON格式数据与前端进行交互,那么也就意味着抛弃了混合开发的模式,所以需要用到@ResponseBody注解,这个注解让解析器不会去找视图层,而是直接返回数据。

对于handler方法而言,使用注解只需要在方法上进行定义。

@GetMapping("/accounts/{id}")
@ResponseBody
public Object handle() {// ...return obj;
}
@RequestMapping(value = "/user/detail", method = RequestMethod.POST)
@ResponseBody
public User getUser(@RequestBody User userParam) {System.out.println("userParam = " + userParam);User user = new User();user.setAge(18);user.setName("John");//TODO:返回的对象,会使用jackson的序列化工具,转成json返回给前端!return user;
}

通过POSTMAN工具访问后结果如下:

如果每一个方法都需要进行返回JSON格式数据,那么是否可以简化一下呢?打开注解源码

可以看到该注解是可以作用在类上的,也就意味,只需要在 类上直接加上注解即可

//TODO:只需要在类上加上@ResponseBody即可表示所有handler方法都是直接返回数据
@Controller
@ResponseBody
@RequestMapping("appointment")
public class AppointmentController {@RequestMapping("Hello/{name}/{sex}")public String hello(@PathVariable String name, @PathVariable String sex) {System.out.println("name = " + name + ", sex = " + sex);return  "name = " + name + ", sex = " + sex;}@RequestMapping("/JsonTest")
//    TODO:通过设置响应体注解@RequestBody实现接收json数据public String Json(@RequestBody JSONObject jsonObject){System.out.println("成功接受到JSON数据");return  "返回接收到的JSON数据为:"+jsonObject.toJSONString();}@RequestMapping("/save")public String CookieTest(HttpServletResponse servletResponse){Cookie cookie = new Cookie("CookieTestName","AlphaMilk");servletResponse.addCookie(cookie);System.out.println("成功设置好cookie");return  "设置cookie成功";}@RequestMapping("/GetCookie")public String GetCookie(@CookieValue("CookieTestName") String value){return "获取到的Cookie值为"+value;}@RequestMapping("/Header")public String GetHead(@RequestHeader("HOST") String value){return "获取到的HOST值为"+value;}
}

那么既然又需要将类加载在ioc容器中,又要声明为@ResponseBody。是否能够再进一步简化注解呢?答案是有的。

 注解:@ResController = @Controller + @ResponseBody

通过观看源码可以看到


四、返回静态资源

4.1 为什么无法直接查询静态资源

如果在项目下,在WEB-INF外有一个图片,想要通过访问地址去查找。

这里发现通过地址无法进行查找对应的资源,这是为什么呢?

其实是因为在访问时候DispactherServlet老板 会向HandlerMapping秘书询问是否项目下存在这个资源。而HandlerMapping只能查找Handler方法。即那些RequestMapping("路径")的这些对应的方法。而没办法找静态的资源。所以会返回给DIspatcherServlet一个404.


4.2 配置实现静态资源查找

那么应该如何设置才能让DispatcherServlet能够正常获取到静态资源呢? 那就需要用到配置类中继承方法覆写。

 那么这个方法的原理是什么呢?为什么这个方法能够访问到静态资源。在找寻到对应源码后如下:

可以看到,其实原理就是用到前面页面跳转的转发功能,而转发可以访问到项目下的资源。

在配置访问静态资源后之后,这时候访问一个资源的流程变成了

DispatcherServlet首先会询问HandlerMapping是否有对应的资源,如果没有就会去访问DefaultServletHandler是否有对应的路径,如果都没有就会显示404.


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

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

相关文章

应用在便携式多媒体播放器中的音频Codec芯片

便携式多媒体播放器(PMP&#xff0c;Portable Media Player)&#xff0c;也就是通常人们所说的MP4。PMP的主要优点是&#xff1a;携带方便&#xff0c;能够直接播放高品质音/视频文件&#xff1b;也可以浏览图片&#xff0c;以及作为移动硬盘使用&#xff1b;此外&#xff0c;P…

使用matlab实现图像信号的色彩空间转换

利用matlab对图像信号进行读取&#xff0c;并对RGB空间进行转换&#xff0c;如转换到HSI空间等。 下面的这个代码是在使用了rgb2hsi()方法失败后&#xff0c;进行修改的。 rgb2hsi(img)这个方法可以将RGB图像转换为HIS图像&#xff1b;但是爆出了 Untitled5(line 5)hsi rgb2h…

Facebook广告被暂停是什么原因?Facebook广告账号被封怎么办?

许多做海外广告投放的小伙伴经常遇到一个难题&#xff0c;那就是投放的Facebook广告被拒或 Facebook 广告帐户被关闭赞停的经历&#xff0c;随之而来的更可能是广告账户被封&#xff0c;导致资金的损失。本文将从我自身经验&#xff0c;为大家分享&#xff0c;Facebook广告被暂…

哈希竞猜游戏开发源码部署方案

随着互联网技术的发展&#xff0c;越来越多的人开始关注网络安全问题&#xff0c;而哈希算法作为一种重要的加密技术&#xff0c;在网络安全领域得到了广泛应用。其中&#xff0c;哈希竞猜游戏作为一种新型的网络安全挑战赛&#xff0c;也受到了越来越多人的关注。本文将介绍哈…

ISP算法——UVNR

ISP算法——UVNR 概念简介 UVNR也就是经过CSC只有在YUV域对UV两个色域进行降噪&#xff0c;在有些方案里也叫CNR&#xff08;chroma noise reduction&#xff09;。主要就是在YUV域针对彩燥进行特殊处理的一系列算法。 关于噪声产生的原因在前面关于降噪的文章和视频中已经做…

Rust写的爬虫代码抓取精美的图片

Rust是一种系统级编程语言&#xff0c;它的设计目标是安全、并发和高效。Rust的爬虫库非常丰富&#xff0c;例如scraper、select、reqwest等等。这些库提供了许多功能&#xff0c;例如HTML解析、HTTP请求、异步处理等等&#xff0c;使得Rust成为一个非常适合编写爬虫的语言。 以…

Outlook如何删除邮箱账户

Outlook如何删除邮箱账户 说明&#xff1a; 最近有用户询问到“我的Outlook登陆了很多个邮箱账号&#xff0c;不知道怎么退出”接下来将具体操作步骤加以说明 操作指引&#xff1a; 1、首先打开Outlook该软件&#xff0c;然后点击“文件” 2、点击账户设置下拉菜单 3、在下拉…

windows HOOK学习(一)

了解HOOK 一&#xff1a;HOOK是什么&#xff1f;二&#xff1a;HOOK的分类三&#xff1a;HOOK的原理&#xff1f;四&#xff1a;为什么全局钩子HOOK必须写到DLL中&#xff1f;五&#xff1a;HOOK的类型 一&#xff1a;HOOK是什么&#xff1f; hook就是我们平时听到的钩子&…

PCA(主成分分析)数据降维技术代码详解

引言 随着大数据时代的到来&#xff0c;我们经常会面临处理高维数据的问题。高维数据不仅增加了计算复杂度&#xff0c;还可能引发“维度灾难”。为了解决这一问题&#xff0c;我们需要对数据进行降维处理&#xff0c;即在不损失太多信息的前提下&#xff0c;将数据从高维空间…

NFTScan | 11.06~11.12 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.11.06~ 2023.11.12 NFT Hot News 01/ 《辛普森一家》提及 NFT 及区块链&#xff0c;相关 NFT 地板价涨至 0.35 ETH 11 月 6 日&#xff0c;据 Coindesk 报道&#xff0c;美国时间周…

thinkphp8 数据库的连接

账号&#xff1a;root 密码&#xff1a;自己设置 http://localhost:888/index.php当出现这个并且能登陆就算成功了。 回到项目config/database.php .env 里面&#xff08;如果已经.example.env 改成了.env,则改下边&#xff0c;db_name改成你的数据库表名&#xff09; 多个…

HTTP服务器——tomcat的安装和使用

文章目录 前言下载tomcattomcat 文件bin 文件夹conf 文件lib 文件log 文件temp 文件webapps 文件work 目录 如何使用 tomcat 前言 前面我们已经学习了应用层协议 HTTP 协议和 HTTP 的改进版——HTTPS&#xff0c;这些协议是我们在写与服务器相关的代码的时候息息相关的&#x…

STM32两轮平衡小车原理详解(开源)

一、引言 关于STM32两轮平衡车的设计&#xff0c;我想在读者阅读本文之前应该已经有所了解&#xff0c;所以本文的重点是代码的分享和分析。至于具体的原理&#xff0c;我觉得读者不必阅读长篇大论的文章&#xff0c;只需按照本文分享的代码自己亲手制作一辆平衡车&#xff0c…

响应式摄影科技传媒网站模板源码带后台

模板信息&#xff1a; 模板编号&#xff1a;540 模板编码&#xff1a;UTF8 模板颜色&#xff1a;黑白 模板分类&#xff1a;摄像、婚庆、家政、保洁 适合行业&#xff1a; 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c;原创设计、手…

[WSL] 安装hive3.1.2成功后, 使用datagrip连接失败

org.apache.hadoop.ipc.RemoteException:User: xxx is not allowed to impersonate anonymous 下载driver-hive-jdbc-3.1.2-standalone 解决 修改hadoop 配置文件 etc/hadoop/core-site.xml,加入如下配置项 <property><name>hadoop.proxyuser.你的用户名.hosts…

跨越编程界限:C++到JavaSE的平滑过渡

JDK安装 安装JDK 配置环境变量&#xff1a; Path 内添加 C:\Program Files\Java\jdk1.8.0_201\bin 添加 JAVA_HOME C:\Program Files\Java\jdk1.8.0_201 添加 CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 第一个Java程序 HelloWorld.java public class…

Linux之gdb

gdb就是一个Linux的调试工具&#xff0c;类似与vs里面的调试 可执行程序也有格式&#xff0c;不是简单的二进制堆砌

Excel函数-将A1中的字符串剔除B1中的字符串

比如A2中是类型单位&#xff0c;B2中是单位&#xff0c;在C2中体现A2-B2的结果&#xff0c;即大米 公式&#xff1a;SUBSTITUTE(A2,B2,“”) SUBSTITUTE函数功能&#xff1a;将字符串中的部分字符用新字符替换&#xff0c;替换序号忽略说明进行全部替换 结构&#xff1a;SUB…

SSM德庆县乡村教育图书管理系统-计算机毕设 附源码 24668

SSM德庆县乡村教育图书管理系统 摘 要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在德庆县乡村教育图书管理的要求下&…

23种设计模式 - 模板方法模式

1. 认识模板方法模式 1.1 模式定义 定义一个操作算法中的框架&#xff0c;而将这些步骤延迟加载到子类中。 它的本质就是固定算法框架。 1.2 解决何种问题 让父类控制子类方法的调用顺序 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 1.3…