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

news2024/12/21 10:52:26

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注解即可

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

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

相关文章

复合式统计图绘制方法(3)

复合式统计图绘制方法&#xff08;3&#xff09; 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 在统计图的应用方面&#xff0c;有时候有两个关联的统计学的样本值要用统计图来表达&#xff0…

Python电能质量扰动信号分类(六)基于扰动信号特征提取的超强机器学习识别模型

目录 往期精彩内容&#xff1a; 前言 1 数据集和特征提取 1.1 数据集导入 1.2 扰动信号特征提取 2超强模型XGBoost——原理介绍 2.1 原理介绍 2.2 特征数据集制作 3 模型评估和对比 3.1 随机森林分类模型 3.2 支持向量机SVM分类模型 3.3 XGBoost分类模型 代码、数据…

windows7怎么改ip地址?win7设置ip地址的步骤

随着网络的普及和技术的不断发展&#xff0c;IP地址对于计算机用户来说&#xff0c;已经不再是一个陌生的概念。在Windows 7操作系统中&#xff0c;根据网络环境和个人需求&#xff0c;有时我们需要手动修改IP地址。本文旨在向读者介绍如何在Windows 7系统中修改IP地址&#xf…

Redis常用指令,jedis与持久化

1.redis常用指令 第一个是key的常用指令&#xff0c;第二个是数据库的常用指令 前面的那些指令都是针对某一个数据类型操作的&#xff0c;现在的都是对所有的操作的 1.key常用指令 key应该设计哪些操作 key是一个字符串&#xff0c;通过key获取redis中保存的数据 对于key…

keil 中使用了cks32F103C8T6的芯片如何安装pack

首先是本来想使用stm32的芯片&#xff0c;结果商家给发过来的无法写入&#xff0c;一查是因为商家把cks的芯片给磨皮了&#xff0c;冒充stm来卖 那就花点时间来研究一下这个cks怎么在keil中写入 好不容易找到一个下载包 Keil.CS32F1xx_DFP.pack 【免费】中科芯CKSF103的PACK…

网络安全: Kali Linux 使用 hping3 阻塞目标主机

目录 一、实验 1.环境 2. 物理机测试远程连接 Windows server 3.Kali Linux 使⽤ hping3 ⼯具 二、问题 1. 常见的 DoS ⽅式有哪些 2.hping3 测试⼯具的命令格式和选项参数 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本IP备注Kali Linux2024.…

Python实现向量自回归移动平均模型(VARMA算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 向量自回归移动平均模型&#xff08;Vector Autoregressive Moving Average, VARMA&#xff09;是一种…

在 Rust 中实现 TCP : 2.解析原始字节

解析原始字节 现在已经设置了虚拟网络接口并且它接收了数据位&#xff0c;实现 TCP 之旅的下一步是从接收到的数据字节中解析出数据包。默认情况下&#xff0c;除了从虚拟网络接口发送和接收的数据包之外&#xff0c;还会在数据包前面附加 4 个字节的数据。 Tun/TAP documenta…

Flutter混合栈管理方案对比

1.Google官方&#xff08;多引擎方案&#xff09; Google官方建议的方式是多引擎方案&#xff0c;即每次使用一个新的FlutterEngine来渲染Widget树&#xff0c;存在的主要问题是每个引擎都要有比较大的内存等资源消耗&#xff0c;虽然Flutter 2.0之后的FlutterEngineGroup通过在…

AI学习集合-前瞻

AI学习前瞻 工作岗位 算法工程师机器学习工程师图像算法工程师ai工程师NLP高级算法工程师 学习路线 应用场景 计算机视觉技术应用场景 自然语言应用 AI流程 AI拟人流程 机器人历史数据经验模型规律依据模型预测未来依据规律做出判断 AI基本流程 术语所用到的技术手段数据数…

收藏4款免费又好用的甘特图软件

zz-plan zz-plan&#xff08;https://zz-plan.com/&#xff09; 是一款基于甘特图的项目管理协作软件。无论项目大小、简单复杂都能轻松管理。任务、进度、工时、资源、周期、依赖关系都能一目了然。支持私有化部署&#xff0c;可完全控制、灵活定制、确保数据安全&#xff0c…

峟思测斜仪:工程斜坡稳定性的精确守护者

在工程建设领域&#xff0c;斜坡的稳定性始终是一个关键的安全问题。斜坡失稳不仅可能导致工程项目的延误&#xff0c;更可能威胁到人们的生命安全。为了有效监测和评估斜坡的稳定性&#xff0c;工程师们依赖于一种先进的设备——峟思测斜仪。 测斜仪的工作原理 峟思测斜仪采用…

分层解耦-IOCDI

内聚&#xff1a;软件中各个功能模块内部的功能联系。 耦合&#xff1a;衡量软件中各个层/模块之间依赖、关联的程度 软件设计原则&#xff1a;高内聚低耦合 控制反转&#xff1a;Inversion Of Control&#xff0c;简称IOC。对象的创建控制权由程序自身转移到外部&#xff08;…

c++ primer学习笔记(一)

目录 第一章、c快速入门 重点&#xff1a;类的简介 第二章 1、基本内置类型 2、字面值常量 1、整型字面值规则 2、浮点字面值规则 3、布尔字面值 4、字符字面值 5、非打印字符的转义序列 ​编辑 6、字符串字面值 3、变量 1、变量标识符 2、定义和初始化对象 3、…

javaWebssh网上超市销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh网上超市销售管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCA…

【深度学习笔记】计算机视觉——多尺度目标检测

多尺度目标检测 在 sec_anchor中&#xff0c;我们以输入图像的每个像素为中心&#xff0c;生成了多个锚框。 基本而言&#xff0c;这些锚框代表了图像不同区域的样本。 然而&#xff0c;如果为每个像素都生成的锚框&#xff0c;我们最终可能会得到太多需要计算的锚框。 想象一…

第十四届蓝桥杯大赛B组 JAVA 蜗牛 (递归剪枝)

题目描述&#xff1a; 这天&#xff0c;一只蜗牛来到了二维坐标系的原点。 在 x 轴上长有 n 根竹竿。它们平行于 y 轴&#xff0c;底部纵坐标为 0&#xff0c;横坐标分别为 x1, x2, …, xn。竹竿的高度均为无限高&#xff0c;宽度可忽略。蜗牛想要从原点走到第 n 个竹竿的底部也…

css样式元素的相对定位,绝对定位,固定定位等元素定位运用技巧详解

文章目录 1.相对定位 relative2.绝对定位 absolute3.固定定位4.display 转换元素5.float浮动6.float产生内容塌陷问题7.overflow CSS样式学习宝典&#xff0c;关注点赞加收藏&#xff0c;防止迷路哦 在CSS中关于定位的内容是&#xff1a;position:relative | absolute | static…

消防主机报故障时发出故障及原因及解决办法!

本文以青鸟消防JBF-11SF为例。 其他型号或品牌的消防主机也可参考。 开机前&#xff0c;必须先测量系统接线的绝缘电阻&#xff0c;确保各绝缘电阻满足以下要求&#xff1a; 1&#xff09;空载时各电路信号线之间的绝缘值应大于5K欧姆。 2&#xff09;正常天气条件下&#x…

C++:函数模板整理

函数模板: 找到函数相同的实现思路&#xff0c;区别于函数的参数类型。 使用函数模板使得函数可容纳不同类型的参数实现函数功能&#xff0c;而不是当类型不同时便编译大量类型不同的函数&#xff0c;产生大量重复代码和内存占用 函数模板格式&#xff1a; template<typ…