springWeb

springweb就是spring框架中的一个模块,对web层进行了封装,使用起来更加方便。如何方便?参数接收框架进行封装
SpringWeb拥有控制器,接收外部请求,解析参数传给服务层。

SpringWeb运行流程

在这里插入图片描述

  1. 用户发起请求 ip:端口/项目名/类地址/方法地址/,表示所有的请求都可以到达DispatcherServlet
  2. DispatcherServlet,请求分发,核心的,在springweb底层就是一个servlet,接收用户所有请求,并分发给对应的映射处理器、适配器
  3. HandlerMapping 映射处理器,用来解析请求中的地址,有没有对应的处理器类;如果本次请求有对应的拦截器,会执行相应的拦截器
  4. HandlerAdapter 适配器,封装请求中的参数
  5. Handler 到达自己创建的处理器,接收参数、处理、响应

搭建SpringWeb

1.导入jar包

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

2.在 web.xml 文件中配置 DispatcherServlet
配置 spring 核心请求分发器

<!--配置DispatcherServlet(请求分发servlet),负责接收前端所有的请求-->
<servlet><servlet-name>application</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--配置读取spring配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></init-param><!--控制servlet创建初始化的时间,-1第一次访问时创建,>=0是服务器启动时创建--><load-on-startup>0</load-on-startup>
</servlet>
<!--配置映射地址-->
<servlet-mapping><servlet-name>application</servlet-name><url-pattern>/</url-pattern>   <!--/ 表示所有的请求都会进入到DispatcherServlet-->
</servlet-mapping>

3.开启 springmvc 注解

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--配置开启使用springweb中的注解--><mvc:annotation-driven></mvc:annotation-driven>
</beans>

4.spring.xml中导入springmvc配置文件

<!--导入springmvc配置文件-->
<import resource="classpath:spring-mvc.xml"></import>

5.创建自己的处理器,为类和方法定义地址

package com.ffyc.ssm.web;@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象
@RequestMapping(path = "/loginCtl")//用来为类和方法定义一个映射地址
public class LoginController {@AutowiredLoginService loginService;@RequestMapping(path = "/test")public String test(Integer num){System.out.println(num);System.out.println("hello springweb");loginService.login(new Admin());return "springweb";}
}

6.将ssm项目发布到Tomact中访问
Edit Configurations中
在这里插入图片描述
在这里插入图片描述
在服务器启动成功后,输入以下地址:
在这里插入图片描述

接收请求

springweb层的控制器类中如何使用?web层 :接收 处理 响应

1、@RestController 修饰控制器

2、@RequestMapping(path =“/loginCtl”)

可以在方法上使用。在类上面使用,整个项目中必须是唯一的,不能重复;在方法上使用时,同一个类中地址也必须是唯一的,可以使用path/value来定义地址。
类中必须要定义请求方式:get/post。@RequestMapping(value = “/test”,method = RequestMethod.POST);@RequestMapping(value =“/test")。没有指定请求方式,get/post请求都可以访问。
@GetMapping(path =“/test”),get请求
@PostMapping(path = “/test”),post请求

3、如何接收请求中的数据

1.使用request对象接收,req.getParameter()

<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope>
</dependency>
@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象
@RequestMapping(path = "/loginCtl")//用来为类和方法定义一个映射地址
public class LoginController {@AutowiredLoginService loginService;@RequestMapping(path = "/test")public String test(HttpServletRequest request, HttpServletResponse response){System.out.println(request.getParameter("num"));return "springweb";}
}

2.直接在参数列表中,定义形参接收,还可以帮助我们进行数据类型转换。
请求中的键名称与形参名一致,如果接收不一致需要通过注解标签@RequestParam进行绑定。例如java中参数是userName,请求的参数是user-name
请求头中的数据用:@RequestHeader

@RequestMapping(path = "/test")
public String test(Integer num, @RequestParam("user-name") String userName,@RequestHeader("User-Agent")String userAgent){System.out.println(num);System.out.println(userName);System.out.println(userAgent);return "springweb";
}

3.使用对象接收。
把请求中的数据直接封装到对象里面,前提是请求中的数据和类中的属性名字一致
(保存,提交表单数据,数量比较多的时候用)
400,请求数据类型转换有问题

@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象
@RequestMapping(path = "/loginCtl")//用来为类和方法定义一个映射地址
public class LoginController {@AutowiredLoginService loginService;@GetMapping(path = "/login")public String login(Admin admin,Integer mark){System.out.println(admin);System.out.println(mark);return "springweb";}
}

在这里插入图片描述
在这里插入图片描述
前端的日期类型是字符串,后端是Date类型,需要加@DateTimeFormat(pattern = “yyyy-MM-dd”) 进行格式化

@Data
public class Admin {private Integer id;private String account;private String password;@DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;
}

中文乱码处理

post请求方式中,中文会乱码,以前自己创建一个过滤器
SpringMVC 中已经为我们提供了这个编码过滤器,只需要在 web.xml 中配置好即可:

<!--配置spring框架中提供的编码过滤器-->
<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

package com.ffyc.ssm.common;public class CommonResult {private int code;//自定义的状态码private Object data;//数据 对象 集合private String message;//消息public CommonResult(int code, Object data, String message) {this.code = code;this.data = data;this.message = message;}public CommonResult(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}
@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象
@RequestMapping(path = "/loginCtl")//用来为类和方法定义一个映射地址
public class LoginController {@AutowiredLoginService loginService;@GetMapping(path = "/login")public CommonResult login(Admin admin, Integer mark){CommonResult commonResult=new CommonResult(200,"保存成功");return commonResult;}
}

@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象。集成了两个注解标签

  • @Controller
  • @ResponseBody:方法的返回值会自动的转为JSON字符串,并将返回的内容写入到响应体中,为Ajax请求使用的
    控制器中返回结果,由于使用@RestController,里面包含@ResponseBody的注解标签,所以方法返回结果默认是json格式,并将json字符串写入到响应体中。返回一个对象时,必须加入一个转json的第三方组件
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version>
</dependency>

跨域配置

加入依赖

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

在 web.xml 中配置跨域过滤器

<!--配置跨域过滤器-->
<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>

拦截器

拦截器—>过滤器,功能类似,但是有区别
过滤器是java Servlet规范中定义的,是当请求进入到servlet之前,可以对请求进行拦截,可以加入一些逻辑处理。
拦截器与过滤器是有区别的,拦截器是spring框架中自己定义的功能,和过滤器的位置不同;拦截器只拦截进入到自己控制器中的请求,其余的不拦截。

搭建拦截器

1.创建一个类,实现HandlerInterceptor接口,重写接口中preHandle()方法;剩下两个方法是在MVC架构中使用(postHandle:当控制器执行完成后调用;afterCompletion:当响应结束后执行)。
预处理:当请求经过映射处理器检测对应的控制器是存在,判断该请求可以进入到该拦截器,执行调用。preHandle方法,如果返回true–>请求继续向下执行;返回false–>请求就不再向下执行。
其余两种是在MVC架构中使用的,当控制器执行完成后调用。

//自定义token验证的拦截器
public class TokenInterceptor implements HandlerInterceptor {//预处理@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");return false;}
}

2.配置拦截器。在spring-mvc.xml中

<!--配置拦截器-->
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/> <!--配置哪些请求进入到拦截器--><mvc:exclude-mapping path="/loginCtl/login"/>  <!--配置哪些请求不进入到拦截器--><bean class="com.ffyc.ssm.common.TokenInterceptor"></bean>  <!--配置拦截器实现类--></mvc:interceptor>
</mvc:interceptors>

3.测试。如果preHandle方法返回的是false的话,test方法不执行;如果返回true,先执行preHandle()后执行test()

@GetMapping(path = "/test")
public CommonResult test(){System.out.println("test method");CommonResult commonResult=new CommonResult(200,"保存成功");return commonResult;
}

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

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

相关文章

晶尔忠产业集团全面启动暨表彰大会

八月下旬&#xff0c;三伏已尽&#xff0c;初秋遂至。夏日的余热还没有完全散去&#xff0c;初秋的热浪随之席卷而来&#xff0c;大地依旧绿意盎然&#xff0c;万物正是生长最猛烈的时期&#xff0c;为秋天的收获做最后的冲刺&#xff0c;这是一个充满生机的时节&#xff0c;也…

设计模式之桥接模式、组合模式与享元模式

目录 桥接模式 简介 优缺点 结构 实现 运用场景 组合模式 简介 优缺点 结构 实现 运用场景 享元模式 简介 优缺点 结构 实现 运用场景 桥接模式 简介 将抽象与实现分离&#xff0c;使它们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降…

基于springboot的图片文字识别,支持中英文识别

概述 基于springboot的图片文字识别,支持中英文识别. 页面上传图片即可转换为中文或者英文. 详细 1.需求&#xff08;要做什么&#xff09; 识别图片文字, 实现页面上传图片即可转换为中文或者英文. 2.理论概述 OCR&#xff0c;即Optical Character Recognition&#xff…

数据结构与算法:概述

目录 算法 评价标准 时间的复杂度 概念 推导原则 举例 空间的复杂度 定义 情形 运用场景 数据结构 组成方式 算法 在数学领域&#xff0c;算法是解决某一类问题的公式和思想&#xff1b; 计算机科学领域&#xff0c;是指一系列程序指令&#xff0c;用于解决特定的…

数据结构插入排序

好久不见&#xff0c;这几天有点事情&#xff0c;都快一个礼拜没有学习&#xff0c;对键盘都要陌生起来了&#xff0c;今天也是刚刚学了一点排序&#xff0c;在这里也给大家更新一个插入排序&#xff0c;后面也会渐渐的把八大排序更新完的&#xff0c;还有就是二叉树&#xff0…

Vivado 2017.04版本安装教程

文章目录 前言一、vivado 简介二、vivado 下载三、vivado 安装四、vivado 申请证书五、关闭升级提醒六、资源自取 前言 本文记录了在 windows 11 下安装 vivado 2017 的详细步骤。 一、vivado 简介 Vivado 是 Xilinx 公司于 2012 推出的新一代集成设计环境&#xff0c;虽然目…

学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义

文章目录 1.定时器的作用和意义定时器中断定时器是定时器和计数器的统称。 2.STC32G单片机定时器使用原理2.1 先设置功能为定时器/计数器(本质都是加法计数器)2.2、在定时器模式下&#xff0c;设置不分频或者12分频∶Tips&#xff1a;选择不分频还是12分频2.3、定时器的工作模式…

算法竞赛个人注意事项

浅浅记录一下自己在算法竞赛中的注意事项。 数据类 注意看数大小&#xff0c;数学库中的函数尽量加上 * 1.0&#xff0c;转成double&#xff0c;防止整型溢出。&#xff0c;int型相乘如果可能溢出&#xff0c;乘 * 1LL。 数据范围大于1e6&#xff0c;注意用快读。 浮点数输…

HCIP自我重修总笔记

第一章.复习OSITCP/IP 模型 &#xff08;2023 9/5&#xff09; OSI 模型: 开放式系统互联参考模型 应用层&#xff1a;抽象语言-->编码表示层&#xff1a;编码--->二进制会话层&#xff1a;提供会话地址&#xff0c;建立应用程序端到端的会话 上三层为应用程序对数据加…

初识Python

初识Python Python背景知识1. 编程语言2. Python优缺点 搭建Python环境1.找到官网2. 下载3.安装4.检查 安装PyCharm1.找到官网下载2. 安装3. 检查 Python官网文档学习 Python背景知识 1. 编程语言 编程语言通常可以分为以下三类&#xff1a; 高级语言&#xff08;High-Level…

PostgreSQL 查询修改max_connections(最大连接数)及其它配置

文章目录 查询max_connections(最大连接数)修改max_connections(最大连接数)其他配置 查询max_connections(最大连接数) SHOW max_connections;修改max_connections(最大连接数) 要设置PostgreSQL数据库的最大连接数&#xff0c;你需要修改数据库的配置文件 postgresql.conf。…

el-table中加图标文字提示

<el-table :data"tableData" style"width: 100%" max-height"250"><el-table-column fixed prop"aaa" label"日期" width"150" /><el-table-column prop"bbb" label"日期" wi…

【技能树笔记】网络篇——练习题解析(二)

目录 前言 一. 数据链路层的作用 1.1 数据链路层作用 1.2 数据链路层封装 1.3 数据链路层功能 1.4 数据帧格式 二. MAC地址及分类 2.1 MAC地址 2.2 MAC地址分类 三. 交换机的作用 3.1 交换机的作用 3.2 交换机作用 四.交换机的工作原理 4.1 交换机的工作原理 4.…

决策树算法学习笔记

一、决策树简介 首先决策树是一种有监督的机器学习算法&#xff0c;其采用的方法是自顶向下的递归方法&#xff0c;构建一颗树状结构的树&#xff0c;其具有分类和预测功能。其基本思想是以信息熵为度量构造一棵熵值下降最快的树&#xff0c;到叶子节点处的熵值为零。决策树的构…

MVC,MVP,MVVM的理解和区别

MVC MVC &#xff0c;早期的开发架构&#xff0c;在安卓里&#xff0c;用res代表V&#xff0c;activity代表Controller层&#xff0c;Model层完成数据请求&#xff0c;更新操作&#xff0c;activity完成view的绑定&#xff0c;以及业务逻辑的编写&#xff0c;更新view&#xf…

51单片机项目(9)——基于51单片机的电子琴设计

简易电子琴设计设计内容: 1.用矩阵键盘代表琴键&#xff0c;至少能弹出8个音符&#xff0c;分别是:音符1.23.4.,5,6, 2.键按下的时间长短表征节拍的长短&#xff0c;用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 &#xff08;代码及其工程文件放在最后&#xff09; …

pycharm使用

在使用pycharm时&#xff0c;有时一个回车或者一个tab键&#xff0c;缩进的长度不符合预期可以调整设置tab键缩进的长度&#xff1a; 平时工作中&#xff0c;不同的人在编辑代码缩进的时候&#xff0c;有的人喜欢按四个或者六个空格&#xff0c;有的人喜欢按tab键&#xff0c;而…

ostringstream 多线程下性能问题探究

文章目录 背景火焰图ostringstream 的结构引用 背景 在实习过程中&#xff0c;有一个业务场景需要用到 ostringstream&#xff0c;但经过导师提醒&#xff0c;ostringstream 在多线程关系下&#xff0c;竞态消耗较大&#xff0c;但对于当前业务场景&#xff0c;每次操作&#…

使用 Python 的高效相机流

一、说明 让我们谈谈在Python中使用网络摄像头。我有一个简单的任务&#xff0c;从相机读取帧&#xff0c;并在每一帧上运行神经网络。对于一个特定的网络摄像头&#xff0c;我在设置目标 fps 时遇到了问题&#xff08;正如我现在所理解的——因为相机可以用 mjpeg 格式运行 30…

PhpStorm软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 PhpStorm是一款由JetBrains开发的专业PHP集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在提供全面的PHP开发支持。它是基于IntelliJ IDEA平台构建的&#xff0c;具有强大的功能和工具&#xff0c;可以帮助开发人员提高…