深入了解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对应的视图解析器
    @Override
    public 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.


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

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

相关文章

45 深度学习(九):transformer

文章目录 transformer原理代码的基础准备位置编码Encoder blockmulti-head attentionFeed Forward自定义encoder block Deconder blockEncoderDecodertransformer自定义loss 和 学习率mask生成函数训练翻译 transformer 这边讲一下这几年如日中天的新的seq2seq模式的transform…

简洁高效的微信小程序分页器封装实践

前言 在现今的移动应用开发中&#xff0c;微信小程序已经成为了一个备受欢迎的平台。然而&#xff0c;随着应用的复杂性增加&#xff0c;数据的管理和加载成为了一个问题。本文将探讨微信小程序中的一个关键概念&#xff1a;封装分页器&#xff0c;它是提升小程序性能和用户体验…

Windows如何正确设置PHP环境变量以在Git Bash中运行命令

1、随便找一个目录&#xff0c;鼠标右键打开git bash here 2、cd的根目录 3、找到php安装目录 4、 在根目录下打开 vim .bash_profile &#xff0c;添加环境变量&#xff0c;php地址根据自己的本地地址而定 PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.3.4nts 添加后保存…

计算机网络期末复习-Part5

1、CRC计算 看例题&#xff1a;待发送序列为101110&#xff0c;生成多项式为X31&#xff0c;计算CRC校验码 先在待发送序列末尾添加与生成多项式次数相同的零&#xff0c;在上述例子中&#xff0c;生成多项式是X^3 1&#xff0c;所以需要添加3个零&#xff0c;待发送序列变成…

使用JAVA pdf转word

使用spire.pdf 非常简单。 查看 https://mvnrepository.com/artifact/e-iceblue/spire.pdf 注意&#xff0c;这个包在 e-iceblue 下。 下面开始撸代码 先来pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mav…

设置VS编译选项使程序不需要带DLL在任意Windows系统上正常运行

针对VS上编译控制台程序和DLL程序的编译设置 之所以把控制台和DLL程序的编译设置放在一起&#xff0c;是因为它们的设置都已一样的。现在&#xff0c;我们以VS2013开发环境为例&#xff0c;想大家描述一下操作步骤。 在打开项目工程之后&#xff0c;右击项目工程&#xff0c;选…

数据运营基础:用户场景营销

一、概述 场景营销模型是顶层模型&#xff0c;是站在用户经营和用户场景角度来制定经营策略的模型。本质上&#xff0c;场景营销模型是在用户使用产品的每个细分场景中通过分析用户需求整合功能、实体和体验等为用户提供服务的模型。 二、场景的起源和特点 数据运营体系在发展…

页面的动静分离

动静分离&#xff1a; 访问静态和动态页面分开 实现动态和静态页面负载均衡 实验1&#xff1a; 准备三台虚拟机&#xff1a; 1台nginx代理服务器&#xff1a; 192.168.120.30 2台tomcat&#xff1a; tomcat1&#xff1a;192.168.120.20 tomcat2&#xff1a;192.168.12…

【C++】日期类实现,与日期计算相关OJ题

文章目录 日期类的设计日期计算相关OJ题HJ73 计算日期到天数转换KY111 日期差值KY222 打印日期KY258 日期累加 在软件开发中&#xff0c;处理日期是一项常见的任务。为了方便地操作日期&#xff0c;我们可以使用C编程语言来创建一个简单的日期类。在本文中&#xff0c;我们将介…

027 - STM32学习笔记 - ADC初识(一)

026- STM32学习笔记 - ADC初识&#xff08;一&#xff09; 前几天不小心把板子掉地上了&#xff0c;液晶屏摔坏了&#xff0c;暂时先停一下液晶屏的学习&#xff0c;等新的板子来了再继续学习。 一、ADC介绍 ADC指的是Analog to Digital Converter&#xff08;模数转换器&…

​2005/2008-2022逐年道路网分布数据

道路网&#xff08;road network&#xff09;指的是在一定区域内&#xff0c;由各种道路组成的相互联络、交织成网状分布的道路系统。全部由各级公路组成的称公路网。在城市范围内由各种道路组成的称城市道路网。 城市道路网由城镇管辖范围内的各种不同功能的干道和区域…

vmware 修改主机名称 hadoop 服务器环境配置(一)

如何在虚拟机配置主机名称&#xff1a; 1. 如图所示在/etc 文件夹下有个hosts文件。追加映射关系&#xff1a; #关系 ip地址 名称 192.168.164.20 hadoop20 2. 保存后&#xff0c;重启reboot即可

GoldWave 6.78中文免费激活版功能特色2024最新功能解析

GoldWave 6.78中文免费激活版是一款多功能、强大且用户友好的音频编辑工具。它为音乐制作人、播客主持人以及音频编辑爱好者提供了全面的编辑功能&#xff0c;让你能够创造出高质量的音频作品。无论你是在音乐制作、音频修复还是播客制作&#xff0c;GoldWave 都是一个值得一试…

第1关:构造函数与析构函数的实现

题目&#xff1a;根据.h写出.cpp 考点&#xff1a; 1.链表的默认构造&#xff0c; 拷贝构造&#xff0c;传参构造以及析构函数等。 代码&#xff1a; /********** BEGIN **********/ #include <cstdlib> #include <cstring> #include "LinkedList.h&…

卷积神经网络(1)

目录 卷积 1 自定义二维卷积算子 2 自定义带步长和零填充的二维卷积算子 3 实现图像边缘检测 4 自定义卷积层算子和汇聚层算子 4.1 卷积算子 4.2 汇聚层算子 5 学习torch.nn.Conv2d()、torch.nn.MaxPool2d()&#xff1b;torch.nn.avg_pool2d()&#xff0c;简要介绍使用方…

服务器常见问题排查(一)—cpu占用高、上下文频繁切换、频繁GC

一般而言cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的&#xff0c;可以使用jstack来分析对应的堆栈情况。 使用jstack排查占用率问题 当使用jstack排查占用率问题时&#xff0c;可以…

如何下载全国水系、铁路、土地、交通设施和运输相关数据?

​ 通过以下方法可以将全国水系、铁路、土地、交通设施和运输相关数据下载到本机。 方法/步骤 下载GIS地图下载器 http://www.geosaas.com/download/mapdownloader.exe&#xff0c;安装完成后桌面上出现”GIS地图下载器“图标。 2、双击桌面图标打开”GI…

11-13 spring整合web

spring注解 把properties文件中的key注入到属性当中去 xml配置文件拆分 -> import标签 注解开发中 import 实现 搞一个主配置类&#xff0c;其他配置类全部导入进来这个这个主配置类 而且其他配置类不需要 加上configuration注解 之前这个注解用于表示这是一个配置文件 …

【论文精读】Pose-Free Neural Radiance Fields via Implicit Pose Regularization

今天读的是一篇发表在ICCV 2023上的文章&#xff0c;作者来自NTU。 文章地址&#xff1a;点击前往 文章目录 Abstract1 Intro2 Related Work3 Preliminary4 Proposed Method4.1 Overall Framework4.2 Scene Codebook Construction4.3 Pose-Guided View Reconstruction4.4 Train…

Windows 微PE WePE_64_V2.3 PE模式下启用账号和修改密码

启动PE后&#xff0c;进入桌面打开运行dism程序 选择带有系统的盘符&#xff08;默认选的是PE盘&#xff09;&#xff0c;然后打开会话 选择左侧工具箱&#xff0c;然后右侧找到账户管理 然后就可以对已有账号进行管理了 结束。