Spring Web

news2024/11/20 8:46:41

目录

概述

SpringMVC的组件

DispatcherServlet

HandlerMapping

HandlerAdapter

 SpringWeb的运行流程

Controller类的编写

@RestController注解

@RequestMapping注解

SpringWeb搭建

获取请求参数

解决POST请求中文乱码问题

Ajax返回JSON数据

跨域问题的解决

拦截器

拦截器搭建

配置拦截器


概述

Spring Web 是Spring框架中提供Web控制层功能,能够替代传统的Servlet功能,进行接收请求,处理数据,响应参数的处理

SpringWeb与spring无需通过中间层进行整合,能够进行配置直接使用

SpringWeb是基于SpringMVC架构的Web功能,但是在现在的前后端分离的架构中,SpringMVC中的部分功能已经不再使用了,比如View视图层的功能已经被前端架构取代,但是其他的功能是继续应用的

SpringMVC的组件

DispatcherServlet

Spring 中提供了org.springframework.web.servlet.DispatcherServlet 类,它从HttpServlet 继承而来,它就是 Spring MVC 中的前端控制器。

DispatcherServlet自己并不处理请求而是,将请求与处理器分发给映射处理器与处理器适配器,由处理器处理数据并返回数据给DispatcherServlet

HandlerMapping

HandlerMapping负责解析请求地址,经过了 HandlerMapping 处理之后,DispatcherServlet 就知道要将请求交给哪个页面控制器来处理了,会找到对应的处理器。

HandlerAdapter

经过了 HandlerMapping 处理之后,DispatcherServlet就获取到了处理器,但是处理器有多种,为了方便调用,DispatcherServlet将这些处理器包装成处理器适配器 HandlerAdapter,HandlerAdapter 调用真正的处理器的功能处理方法,完成功能处理

 SpringWeb的运行流程

1.DispatcherServlet接收所有的前端请求,并且负责将资源分发地址给映射处理器,与适配器

2.映射处理器解析请求地址,查询对应的Handler处理器返回给DispatcherServlet

3.如果本次请求有对应的拦截器则会经过拦截器

4.处理器适配器是会找到对应的处理器并且封装请求中的参数

5.处理器会将根据请求参数处理数据然后返回给DispatcherServlet

Controller类的编写

Controller类是SpringMVC中留下来的称呼,实际上就是请求的对应的处理器类,负责处理请求的数据开发者实际上编写的主要处理数据的程序就是Controller类

Controller类需要被两个注解进行修饰,包含@RestController与@RequestMapping

@RestController注解

        @RestController用于修饰一个Controller类对象,类似于的@Service注解,将该类的对象注入进spring容器

        在之前的SpringMVC中使用@Controller注解进行修饰,而@RestController中集成了@Controller与@ResponseBody注解,在现在的SpringWeb中都是使用该注解进行修饰

        注意@ResponseBody注解会默认返回json格式的数据

         @RestController注解内部结构

@RequestMapping注解

该注解用于解析请求映射的地址,可以用于类与方法上,只有匹配的地址才会进去该类与方法

属性值:

value :请求的路径,这个路径相对于应用的上下文,它是 path 的别名。类型是一个 String[] ,也就是说它可以匹配多个请求路径 ​

method: 请求的方法。RequestMethod.GET代表Http协议中的get请求,RequestMethod.POST代表Http协议中的post请求,如果不指名该属性值,则get请求与post请求都会的匹配

也可以直接用@GetMapping, @PostMapping注解分别代表的get请求与post请求的类型

SpringWeb搭建

1.导入依赖jar

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

2.在web.xml文件中配置DispatcherServlet

<servlet>
    <servlet-name>application</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application.xml</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
</servlet>
<!-- 请求映射 -->
<servlet-mapping>
    <servlet-name>application</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

3.在配置文件中开启SpringMVC的注解(再创建一个xml文件进行配置,导入进主配置文件中)

<mvc:annotation-driven></mvc:annotation-driven>

获取请求参数

1.注入HttpServletRequest类对象与HttpServletResponse类对象

将两个类的对象引用作为形参传入方法中,在方法中使用HttpServletRequest类的对象即可获取请求参数,类似于Servlet中的做法

    @GetMapping(path = "/test2")
    public String test2(HttpServletRequest request, HttpServletResponse response){
    //注意此时的HttpServletRequest类与HttpServletResponse类是自动注入进来的
        request.getParameter("account");//获取参数
​
        return "springWeb";
    }

2.使用形参进行接收,在方法中的形参列表中直接使用对应类型的参数即可接收请求中的数据

@GetMapping(path = "/test")
    public String test(Integer num,
                       @RequestParam("user-name") String account,
                       String password){
    //接收参数可以直接定义形参进行接收,参数名需要与形参名一致,如果参数名不合法则使用@RequestParam修饰
    //@RequestHeader("Host")接收请求头中的数据
        System.out.println("hello springWeb");
        System.out.println(num);
        Admin admin = new Admin();
        admin.setAccount(account);
        admin.setPassword(password);
        loginService.login(admin);
​
        return "springWeb";
    }

注意请求参数名在java中不合法的情况,例如人为的设置或者是请求头中的数据

此时使用@RequestParam("请求参数名")来绑定形参即可接收

@RequestHeader("Host")可以获取请求头中的数据

3.使用对象类型接收

使用前提是model类中的属性名与参数名一致,spring框架会自动将参数进行组装

@GetMapping(path = "/test1")
    public String test1(Admin admin ,@RequestHeader("Host")String host ){
       
        System.out.println("hello springWeb");
        System.out.println(host);
        loginService.login(admin);
​
        return "springWeb";
    }

解决POST请求中文乱码问题

在servlet中学习过POST请求参数中的中文字符传入后端时会出现中文乱码的问题,当时解决的方式是通过过滤器进行解决的。

SpringWeb中已经提供了该过滤器解决该问题,该类已经被SpringWeb封装过了,我们只需要直接进行配置即可

配置编码的servlet

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Ajax返回JSON数据

程序员在SpringWeb中返回的响应数据,只需要在controller类中使用return关键子进行返回即可

JSON数据格式一般是通过将引用类型的数据转换为JSON字符串进行返回,JSON格式现在已经是前后端交互传输数据格式的标准了所以在返回引用类型的数据时SpringWeb会默认返回JSON格式的数据,如果没有引入JSON转换的jar包的话会报出JSON格式转换的异常

@responseBody注解的作用就是将 controller 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到 response 对象的 body 区,@responseBody已经集成进入@RestController类中了

引入JSON转换的jar依赖

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <!--JSON-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.3</version>
        </dependency>

跨域问题的解决

1.添加jar依赖

<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>2.5</version>
</dependency>

2.配置过滤器

通过过滤器实现的跨域问题的解决

<filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CORS</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

拦截器

拦截器是对已经进入了SpringMVC中的请求进行拦截,可以对这些请求的Handler类进行拦截

拦截器是SpringWeb中定义的功能,不同于过滤器是对servlet中定义的功能

拦截器搭建

SpringMVC 定义了拦截器接口 HandlerInterceptor,该接口中定义了三个方法,其中后两个方法是针对与视图进行处理的,在现在的软件架构中已经不应用了,只需要重写boolean preHandle( )方法

preHandle:

该方法是在预处理方法,就是在处理器方法执行之前这个方法会被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三个参数为被拦截的处理器方法。如果preHandle方法返回true表示继续流程(如调用下一个拦截器或处理器方法),返回 false 表示流程中断,不会继续调用其他的拦截器或处理器方法,此时我们需要通过 response 来产生响应;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return false;
    }

配置拦截器

在springMVC的配置文件中进行该配置

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/statics/**"/>
        <mvc:exclude-mapping path="/loginCtl/checklogin"/>
        <bean id="demo" class="com.ff.springMVC.util.DemoInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

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

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

相关文章

LabVIEW与SQL Server 2919 Express通讯

LabVIEW与SQL Server 2919 Express通讯 ​LabVIEW与数据库通讯&#xff0c;可以使用数据库连接工具包。一般小型数据库用Access就可以了。但是对于长时间&#xff0c;需要存储空间较大的场合&#xff0c;Access一般不超过2G。这样就需要更换其他数据了。 SQL Server不同版本存…

MDC Service 基于 ESP32 推出树莓派 4 形态的 EsPiFF

当您的应用在树莓派 4 上运行不够稳定或耗电量过大时&#xff0c;您可以考虑使用 EsPiFF。这是一款由 MDC-Service 基于乐鑫 ESP32 构建的开发板。EsPiFF 配备有线和无线以太网、SD 卡插槽和 RP2040 协处理器。如果您尚未找到适合您项目的树莓派&#xff0c;不妨尝试一下这款低…

使用 Docker 来快速上手中文 Stable Diffusion 模型:太乙

本篇文章&#xff0c;我们聊聊如何使用 Docker 快速运行中文 Stable Diffusion 模型&#xff1a;太乙。 写在前面 上个月的时候&#xff0c;有朋友和我推荐了一个 “Stable Diffusion” 模型&#xff0c;来自深圳大湾区数字经济研究院(IDEA)的封神榜大模型中的 “太乙” 。 最…

web期末大作业 使用HTML+CSS制作蓝色版爱宠之家带留言板(5页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Metal每日分享,4x4颜色矩阵滤镜效果

本案例的目的是理解如何用Metal实现图像4x4颜色矩阵效果滤镜,通过4x4矩阵对RGBA像素处理; Demo HarbethDemo地址实操代码 // 绿色通道加倍 let filter = C7ColorMatrix4x4(matrix: Matrix4x4.Color.greenDouble)// 方案1: ImageView.image = try? BoxxIO(element: originIm…

【Python开发】Flask中的单点登录解决方案

Flask中的单点登录解决方案1.SSO 和 CAS 单点登录&#xff08;Single Sign On&#xff0c;SSO&#xff09;就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后&#xff0c;即可获得访问单点登录系统中其他关联系统和应用软件的权限&#xff0c;同时这种实现…

E. DS哈希查找--Trie树

目录 题目描述 思路分析 AC代码 题目描述 Trie树又称单词查找树&#xff0c;是一种树形结构&#xff0c;如下图所示。 它是一种哈希树的变种。典型应用是用于统计&#xff0c;排序和保存大量的字符串&#xff08;但不仅限于字符串&#xff09;&#xff0c;所以经常被搜索引擎…

【经验版】Linux相关教程(二)

一、参考资料 二、常用指令 1. 安装run软件包 # 可执行权限 chmod x 软件包名.run# 校验软件包安装文件的一致性和完整性 ./软件包名.run --check# 指定安装路径 ./软件包名.run --install如果用户未指定安装路径&#xff0c;则软件会安装到默认路径下&#xff0c;默认安装路…

kafka一致性保证

1、概念 水位标记&#xff1a; 水位或水印&#xff08;watermark&#xff09;一词&#xff0c;表示位置信息&#xff0c;即位移&#xff08;offset&#xff09;。Kafka源码中使用的名字是高水位&#xff0c;HW&#xff08;high watermark&#xff09;。 副本角色&#xff1a;…

华硕编程竞赛11月JAVA专场 E题太空漫步 题解

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

cleanmymac4.12最新版下载安装教程

cleanmymac2023的“智能扫描”功能略不同于两外两款软件。除垃圾扫描以外&#xff0c;它还连带有搜索mac潜在威胁以及寻找提升系统性能方案的功能。在垃圾文件分类方面&#xff0c;它将垃圾首先分为系统垃圾、iTunes垃圾、照片垃圾3大类&#xff0c;每一类再做具体细分。但这样…

AUTOSAR OTA升级

一、OTA技术概念 随着高级辅助驾驶的发展和自动驾驶的引入&#xff0c;汽车变得越来越智能&#xff0c;这些智能汽车被软件控制&#xff0c;装有巨量的软件程序&#xff0c;当出现一个软件程序问题或者更新时&#xff0c;如果 按照传统的解决方式 &#xff0c;那都将是一项很繁…

美腾科技科创板上市:预计年营收4.7亿到5.7亿 市值44亿

雷递网 雷建平 12月9日天津美腾科技股份有限公司&#xff08;简称&#xff1a;“美腾科技”&#xff0c;股票代码为&#xff1a;“688420”&#xff09;今日在科创板上市。美腾科技此次发行2211万股&#xff0c;发行价为48.96元&#xff0c;募资总额为10.83亿元。美腾科技开盘价…

Leetcode 1691. 堆叠长方体的最大高度 [Java/C++] 排序+动态规划(附详细证明过程)

给你 n 个长方体 cuboids &#xff0c;其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti]&#xff08;下标从 0 开始&#xff09;。请你从 cuboids 选出一个 子集 &#xff0c;并将它们堆叠起来。如果 widthi < widthj 且 lengthi < lengthj 且 h…

计算机网络(自顶向下)—第八章习题

在下面的空格中填入“谁的什么密钥”&#xff1a; &#xff08;1&#xff09; A 向 B 发送一个一次性会话密钥&#xff0c;A 用B的公钥加密该会话密钥。 &#xff08;2&#xff09; Certifier.com 用Certifier.com的私钥 为 foo.com 签发公钥证书。 &#xff08;3&#xff…

红队隧道应用篇之Neo-reGeorg实现内网穿透(四)

简介 reGeorg是一个能够实现内网穿透的工具&#xff0c;基于socks5协议&#xff0c;且能支持众多脚本 由于此工具使用率过高&#xff0c;导致容易被杀毒软件拦截, 现有一个项目是由reGeorg修改而来, 而且做了加密和免杀处理, 这款工具的名字就叫Neo-reGeorg Neo-reGeorg下载…

Python+Selenium+Unittest 之selenium1--环境搭建

对于学习一个新东西来说&#xff0c;最开始就是要搭建环境了&#xff0c;关于python的环境搭建这里就不说了&#xff0c;主要说下selenium的环境搭建相关内容和安装过程中可能遇到的坑&#xff0c;细节不太一致的可以自行百度解决下&#xff0c;本章所使用的版本为python3.9sel…

Xcode安装特定版本系统的模拟器(不支持断点下载所以总是下载失败)

Xcode里下载太慢就算了&#xff0c;他不支持断点下载&#xff0c;一直一直一直下载失败&#xff0c;根本就装不上嘛&#xff01;&#xff01;&#xff01; 添加模拟器、下载需要的iOS版本 添加模拟器 没有要的iOS版本则点击Download more 然而因为Xcode不支持断点下载&…

【C语言】内存操作函数

目录 一、memcpy函数 1、memcpy函数的用途 2、memcpy函数的使用 3、memcpy函数的模拟实现 二、memmove函数 1、memmove函数的用途 2、memmove函数的使用 3、memmove函数的模拟实现 三、memset函数 1、memset函数的用途 2、memset函数的使用 3、memset函数的模拟实现 四、memcmp…

React 入门:实战案例 TodoList 修改 Todo Item的状态

文章目录目标实现效果实现思路实现步骤第一步&#xff1a;定义更改 Todo 状态的方法&#xff0c;以供调用第二步&#xff1a;App 组件传递更改 Todo 状态的方法给子组件 List第三步&#xff1a;List 组件传递更改 Todo 状态的方法给子组件 Item第四步&#xff1a;Item 调用更改…