SSM框架,SpringMVC框架的学习(上)

SpringMVC介绍

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。

SpringMVC涉及组件

  1. DispatcherServlet : SpringMVC提供,需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发
  2. HandlerMapping : SpringMVC提供,需要进行IoC配置使其加入IoC容器方可生效,它内部缓存handler(controller方法)和handler访问路径数据,被DispatcherServlet调用,用于查找路径对应的handler
  3. HandlerAdapter : SpringMVC提供,需要进行IoC配置使其加入IoC容器方可生效,它可以处理请求参数和处理响应数据数据,每次DispatcherServlet都是通过handlerAdapter间接调用handler,他是handler和DispatcherServlet之间的适配器
  4. Handler : handler又称处理器,它是Controller类内部的方法简称,是由我们自己定义,用来接收参数,向后调用业务,最终返回响应结果
  5. ViewResovler : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,视图解析器主要作用简化模版视图页面查找的,但是需要注意,前后端分离项目,后端只返回JSON数据,不返回页面,那就不需要视图解析器。所以,视图解析器,相对其他的组件不是必须的

SpringMVC案例:

控制层:

@Controller
public class HelloController {
    @RequestMapping("spring/hello")//对外访问的地址 此注解也会进行在handlerMapping注册的操作
@ResponseBody//不用找视图解析器
public String hello(){
        System.out.println("hello,springmvc");
        return "hello springmvc";
    }
}

配置类:

/**
 *要配置的操作:
* 1.将controller配置到ioc容器
* 2.将handlerMapping和handlerAdapter加入到ioc容器
*
 */
@Configuration
@ComponentScan("com.ergou.controller")
public class MvcConfig {
    @Bean
    public RequestMappingHandlerMapping handlerMapping(){
        return new RequestMappingHandlerMapping();
    }
    @Bean
    public RequestMappingHandlerAdapter handlerAdapter(){
        return new RequestMappingHandlerAdapter();
    }
}

初始化的类:

/**
 *可以被web项目加载,会初始化容器,会设置dispatcherServlet的地址
*/
public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

//设置我们项目对应的配置类
@Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {MvcConfig.class};
    }

//配置springmvc内部自带的servlet访问地址
@Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

SpringMVC接收数据

访问路径设置

@RequestMapping注解的作用就是将请求的 URL 地址和处理请求的方式(handler方法)关联起来,建立映射关系。

将地址写在RequestMapping注解的value属性中即可,同样只有value属性时,value=可以省略

@RequestMapping注解中的地址不是必须斜杆开头,可有可无

地址的表示方式

  1. 精准地址
    1. 例:/user/login
    2. 如果有多个地址,就用{}括号括起来,多个地址之间用逗号隔开,例如:@RequestMapping({”地址一”,”地址二”,……}
  2. 模糊地址
    1. *表示一层的任意字符串,**表示任意层任意字符串
    2. 例:/user/* *处的一层的字符串可以是任何字符串
    3. 例:/user/** **处可以有多层字符串,每层的字符串任意

添加@RequestMapping的位置

@RequestMapping注解可以加在方法上,比如一个方法上的RequestMapping注解的地址为/user/login,则通过user/login地址就可以访问到此方法

@RequestMapping注解也可以加在类上,若一个类上的RequestMapping注解的地址为/user,该类的一个方法上的RequestMapping注解的地址为/login,则通过user/login地址就可以先访问地址为/user的类,在访问该类中地址为login的方法

请求方式指定

在@RequestMapping注解的method属性中写指定请求方式的枚举对象即可,如果要指定多个请求方式,也是用{}括起来即可

例:

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping(value = "/login",method = RequestMethod.POST)//只允许使用post方式的请求
public String login(){
        return null;
    }
    @RequestMapping(value = "/register",method = {RequestMethod.GET,RequestMethod.POST})//可以使用get方式的请求,也可以使用post方式的请求
public String register(){
        return null;
    }
}

注解进阶:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping

作用是这些注解比起RequestMapping,直接指定了请求的方式

只能使用在方法上

以@GetMapping为例:

@GetMapping(value = "/exit")

等同于

@RequestMapping(value = "exit",method = RequestMethod.GET)

接收参数

json和param参数

param参数:由key-value形式传递参数,key和value之间用=连接,多个key-value数据之间用&连接,只支持简单数据类型的数据,不支持数据的嵌套,形式:key=value&key=value&……

json参数:也是由key-value形式传递参数,key和value之间用:连接,多个key-value数据之间使用逗号隔开,整体是由一个{}括起来,如果一个value中又包括其他key-value数据,可以使用{}表示此value,{}中写其中的key-value数据,即json参数支持数据的嵌套,json支持复杂数据类型,比如数组、集合、对象等。形式:{key:value,key:{key:value,key,value},key:……}

param参数接收

  • 直接接收

在handler方法的形参列表中,形参的命名和请求的参数名一致,相应的请求参数即会直接传给其同名的形参

@Controller
@RequestMapping("param")
public class ParamController {
    @RequestMapping("data")
		@ResponseBody
    public String data(String name,int age){
        System.out.println("name = " + name + ", age = " + age);
        return "name = " + name + ", age = " + age;
    }
}
  • 注解指定

@RequestParam注解加在形参前,可以指定任意的请求参数名,可以要求参数必须传递或非必须传递,还可以指定不必须传递时设置形参的默认值

@RequestParam注解的属性:

  • value:指定形参要接收的参数的参数名
  • required:指定形参是否必须传递,true为必须传递,false为非必须传递,默认为true
  • defaultValue:非必须传递时设置,当没有请求参数传递过来时,形参的值默认为该属性值

非必须传递时要用defaultValue属性设置默认值,如果形参没有接收到请求参数的数据,会报400异常

例:

@RequestMapping(value = "data1",method = RequestMethod.GET)
@ResponseBody
public String data1(@RequestParam(value = "account") String username,
                    @RequestParam(required = false,defaultValue = "1") int age){
    System.out.println("username = " + username + ", age = " + age);
    return "username = " + username + ", age = " + age;
}
  • 特殊参数值

    • 一个key值有多个value

      • 若param参数中有两个key值相同value值不相同的参数,可以直接使用集合来接收其参数值
      • 设置集合类型的形参时,要在此形参前加上@RequestParam注解,如果不加,会将字符串直接赋值给集合,加了此注解后,才会将多个参数依次加入集合中
      @RequestMapping(value = "data2",method = RequestMethod.GET)
      @ResponseBody
      //若要传递的参数为:hbs=singing&hbs=dancing&hbs=rap&hbs=basketball
      public String data2(@RequestParam List<String> hbs){
          System.out.println(hbs);
          return hbs.toString();
      }
      //客户端收到的结果为[singing, dancing, rap, basketball]
      
    • 使用实体对象接收参数值

      • 准备一个用来接收请求参数的有对应属性和其get、set方法的实体类,要保证请求参数名和实体类的属性名对应一致如果要默认值,直接在实体类中给要设默认值的属性赋值即可
      • 形参列表中写一个此实体类类型的形参即可
      @RequestMapping(value = "data3",method = RequestMethod.GET)
      @ResponseBody
      public String data3(User user){
          System.out.println("user = " + user);
          return user.toString();
      }
      
  • 路径参数接收

    • 路径传参指的是直接将要传递的值写在路径中,即直接将value写在路径中,例如,要将用户名为ergou,密码为1234的数据传递给handler,可以写作:user/login/ergou/1234

    • 路径参数接收步骤:

      • 设置动态路径:

      在@RequestMapping注解的value属性中,在要用来接收参数的路径处写上{},在{}中写上该参数的参数名(以方便handler方法调用)即可,例: @GetMapping("login/{username}/{password}")

      • 接收动态路径参数

      在handler方法的形参列表中写上相应的形参,形参名要和动态路径的{}中的参数名对应一致,且要在形参前加上@PathVariable注解

      • @PathVariable,如果形参名和动态路径中的参数名不一致,可以用value的属性值指定形参要接收的动态路径中的参数(写入要接收的动态参数的参数名)

      例:

      @Controller
      @RequestMapping("path")
      public class PathController {
          @GetMapping("login/{username}/{password}")
          @ResponseBody
          public String login(@PathVariable String username,@PathVariable int password){
              System.out.println("username = " + username + ", password = " + password);
              return "username = " + username + ", password = " + password;
          }
      }
      

json参数接收

接收json参数时,首先要准备一个接收json参数的实体类,其中的属性和参数一一对应。在形参列表中,写一个此实体类类型的形参,并在此形参前加上@RequestBody注解(加上此注解后就可以接收json参数)

@Controller
@RequestMapping("json")
@ResponseBody
public class JsonController {
    @PostMapping("data")
    public String data(@RequestBody Person person){
        System.out.println("person = " + person);
        return person.toString();
    }
}

除此之外,还要项目导入json处理的依赖,以及给handlerAdapter配置json转化器

导入json处理依赖:

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

给handlerAdapter配置json转化器:

在配置类上加上@EnableWebMvc注解即可

@EnableWebMvc//此注解会给handlerAdapter配置json转化器
@Configuration
@ComponentScan({"com.ergou.param","com.ergou.path","com.ergou.json"})
public class MvcConfig {
    @Bean
    public RequestMappingHandlerMapping handlerMapping(){
        return new RequestMappingHandlerMapping();
    }
    @Bean
    public RequestMappingHandlerAdapter handlerAdapter(){
        return new RequestMappingHandlerAdapter();
    }
}

@EnableWebMvc注解的作用:

此注解会自动RequestMappingHandlerMappingRequestMappingHandlerAdapter加入ioc容器中,除此之外还会配置json转化器

所以在配置类上写好@EnableWebMvc注解后,可以省略RequestMappingHandlerMapping和RequestMappingHandlerAdapter的使用@Bean注解进行ioc配置的操作。

@EnableWebMvc//此注解会给handlerAdapter配置json转化器
@Configuration
@ComponentScan({"com.ergou.param","com.ergou.path","com.ergou.json"})
public class MvcConfig {
 new RequestMappingHandlerAdapter();
}

接收cookie数据

在handler方法参数列表中的要接收cookie数据的形参前加上@CookieValue注解,可以在其中的value属性中指定要接收的cookie数据的名称

@Controller
@RequestMapping("cookie")
@ResponseBody
public class CookieController {
    @RequestMapping(value = "data",method = RequestMethod.GET)
    public String data(@CookieValue("cookie") String value){
        System.out.println("value = " + value);
        return value;
    }
    @GetMapping("save")
    public String save(HttpServletResponse response){
        Cookie cookie = new Cookie("cookie","root");
        response.addCookie(cookie);
        return cookie.toString();
    }
}

原生对象获取

在形参中加上相应的注解或直接使用某些实体类的形参,可以获取对应的一些原生对象

Controller method argument 控制器方法参数Description
jakarta.servlet.ServletRequest, jakarta.servlet.ServletResponse请求/响应对象
jakarta.servlet.http.HttpSession强制存在会话。因此,这样的参数永远不会为 null 。
java.io.InputStream, java.io.Reader用于访问由 Servlet API 公开的原始请求正文。
java.io.OutputStream, java.io.Writer用于访问由 Servlet API 公开的原始响应正文。
@PathVariable接收路径参数注解
@RequestParam用于访问 Servlet 请求参数,包括多部分文件。参数值将转换为声明的方法参数类型。
@RequestHeader用于访问请求标头。标头值将转换为声明的方法参数类型。
@CookieValue用于访问Cookie。Cookie 值将转换为声明的方法参数类型。
@RequestBody用于访问 HTTP 请求正文。正文内容通过使用 HttpMessageConverter 实现转换为声明的方法参数类型。
java.util.Map, org.springframework.ui.Model, org.springframework.ui.ModelMap共享域对象,并在视图呈现过程中向模板公开。
Errors, BindingResult验证和数据绑定中的错误信息获取对象!

共享域对象操作

获取共享域对象:

获取request共享域对象和session共享域对象:在形参列表处声明HttpServletRequest类型的对象和HttpSession类型的对象即可

获取ServletContext共享域对象:在Controller层的类中声明ServletContext类型的属性,在其上方加上@Autowired注解即可

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

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

相关文章

十四、Qt主机信息与网络编程

一、主机信息 1、主机信息接口 QHostInfo&#xff1a;获取主机名称和IP地址QNetWorkInterface&#xff1a;获取主机的所有网络接口&#xff0c;包括子网掩码和广播地址等 &#xff08;1&#xff09;使用 项目添加模块QT network2、实现程序 &#xff08;1&#xff0…

Java中几种常见的创建线程的方式

创建线程的几种方式 方法解释Thread()创建线程对象Thread(String name)创建线程对象&#xff0c;并给线程命名&#xff0c;不会影响线程Thread(Runnable runnable)使用Runnable对象创建线程Thread(Runnable runnable, String name)使用Runnable对象创建线程并给线程命名 方式…

直流电压变送器更改从站地址

直流电压变送器采集模块转RS485修改地址 产品图片 产品说明书 修改从站地址 在串口助手上将默认的从站地址01h修改为0Bh 原从站地址&#xff1a;01h 修改参数&#xff1a;10h 通信参数允许修改寄存器&#xff1a;1b fe&#xff08;说明书里7166的十六进制&#xff09; 00 02…

buuctf misc做题笔记

喵喵喵 使用stegsolve.jar&#xff0c;按BGR顺序提取出一个png图片&#xff0c;是一个只显示一半的二维码&#xff0c;修改图片高度显示全部二维码&#xff0c;解析出一个百度网盘地址&#xff0c;https://pan.baidu.com/s/1pLT2J4f 下载得到压缩包flag.rar。解压成功&#xf…

Vue开发实例(二)Vue代码运行及分析配置

Vue项目代码运行及分析 一、项目运行二、目录结构说明1、项目本身结构2、其他可能用到的文件夹 三、建议配置1、启动服务浏览器自动打开页面地址2、关闭eslint校验工具3、 src文件夹的别名的设置 一、项目运行 上篇文件末尾介绍到&#xff0c;进入项目&#xff0c;运行启动命令…

7.WEB渗透测试-Linux基础知识-Linux基础操作(一)

内容参考于&#xff1a; 易锦网校会员专享课 上一篇内容&#xff1a;5.WEB渗透测试-前置基础知识-常用的dos命令-CSDN博客 1.终端 终端&#xff1a;是一种特殊的字符设备&#xff0c;用来向计算机输入数据和显示计算机的输出 2.相对路径、绝对路径 绝对路径&#xff1a;cd/h…

怎么把人物从图中抠出?分享几种好用的抠图方法

在日常生活中&#xff0c;我们时常需要将人物从繁杂的背景中优雅地提取出来&#xff0c;无论是为了制作一张精美的证件照&#xff0c;还是为了设计一幅引人注目的海报或宣传画。然而&#xff0c;对于许多非专业人士来说&#xff0c;这仿佛是一场与细节的捉迷藏游戏&#xff0c;…

Web Tomcat

目录 1 前言2 Tomcat的安装3 Tomcat文件的构成4 Tomcat的使用步骤 1 前言 Tomcat是一个 http(web)的容器&#xff0c;笼统的理解一下所有的网站都叫做web。这个web容器可以把我们的前端(htmlcssjs)和后端(servlet)代码都运行起来。 Tomcat是一个免费的开源的Servlet容器&#…

鸿蒙Harmony应用开发—ArkTS声明式开发(触摸事件)

当手指在组件上按下、滑动、抬起时触发。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 onTouch onTouch(event: (event: TouchEvent) > void) 手指触摸动作触发该回调。 卡片能力&#xff1a; 从…

STM32标准库开发——PWR电源控制

PWR简介 STM32内部供电方案 从图中可以看出VDD供电区域中有个电压调节器&#xff0c;可以降压到1.8V给CPU内部一些比较重要的设备供电&#xff0c;STM32内部不都是3.3V供电。另外还有低电压检测器&#xff0c;能够自动判断当前电压是否满足供电要求以此来灵活调节VBAT的供电电源…

13-Linux部署Kafka集群

Linux部署Kafka集群 简介 Kafka是一款分布式的、去中心化的、高吞吐低延迟、订阅模式的消息队列系统。 同RabbitMQ一样&#xff0c;Kafka也是消息队列。不过RabbitMQ多用于后端系统&#xff0c;因其更加专注于消息的延迟和容错。 Kafka多用于大数据体系&#xff0c;因其更加…

整数和浮点数在内存中的存储(大小端字节序,浮点数的存取)

目录 1.整数在内存中的存储 2.大小端字节序和字节序判断 2.1什么是大小端&#xff1f; 2.2为什么会有大小端 3.浮点数在内存中的存储 3.1浮点数的存储 3.1.1 浮点数存的过程 3.1.2 浮点数取的过程 3.2 解析 3.3 验证浮点数的存储方式 1.整数在内存中的存储 整数的二进…

Tomcat 部署和优化 (一)---------安装Oracle jdk 、tomcat

自 2017 年 11 月编程语言排行榜 Java 占比 13%&#xff0c;高居榜首&#xff0c;Tomcat 也一度成为 Java开发人员的首选。其开源、占用系统资源少、跨平台等特性被深受喜爱。本章主要学习如何部署 Tomcat 服务&#xff0c;根据生产环境实现多个虚拟主机的配置&#xff0c;最后…

『京墨』1.7.0 发布,开源的诗文(名句)、歇后语、成语、绕口令、节日等的阅读 APP

1.7.0 更新日志 优化 UI 显示&#xff1b;优化数据同步&#xff0c;尤其是诗文同步&#xff1b;【诗文名句】【成语】【歇后语】模块添加收藏功能&#xff1b;添加“滑动翻页”功能。 介绍 『京墨』开源的古诗词文&#xff08;名句&#xff09;、歇后语、成语、绕口令、节日…

C++/WinRT教程(第三篇)API的使用

目录 前言 Windows API 在WinRT中的投影 C/WinRT的头文件&#xff08;投影标头&#xff09; 通过对象、接口或通过 ABI 访问成员 投影类型的初始化方法 不要错误地使用延迟初始化 不要错误地使用复制构造 使用 winrt::make 进行构造 标准构造方法 在WinRT组件中实现A…

【Word如何在表格和标题中间插入一行】

目的&#xff1a;主要是为了满足文件设计需求&#xff0c;标题前面要空出一行 操作步骤&#xff1a; 1、将鼠标光标停在标题行的最前方&#xff0c;点击回车&#xff0c;就会在表格和标题中间插入一行空白标题行。 2、因为空白标题行会影响目录的生成&#xff0c;所以将空白行…

基于springboot+vue的实验室管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

对象的组合(java)

组合与复用 Circle类创建圆对象 Circle类创建圆锥对象&#xff0c;Circle类将Circle类声明的对象作为自己的一个成员 圆锥通过调用方法将某个圆的引用传递给圆锥的Circle类型的成员变量 package Absent;public class Chapter3 {public static void main(String[] args) {// …

jupyter 用pyecharts进行数据分析

一、jupyter和pyecharts下载和打开 因为我是用的pycharm&#xff0c;所以我直接在pycharm项目终端中下载pip install jupyter,pip install pyecharts 在你下载的项目路径中输入jupyter notebook 之后会进入页面 Jupyter 具体使用参考这个链接&#xff1a;Jupyter Notebook基本…

基于tomcat的JavaWeb实现

Tomcat服务器 免费&#xff0c;性能一般的服务器 安装配置 基于Java&#xff0c;故需要配置环境变量&#xff0c;新加系统路径JAVA_HOME&#xff0c;路径为jdk的主目录。 而后打开bin目录下的startup.bat文件出现如下窗口说明配置成功 idea继承tomcat服务器 使用java开发…