SpringMVC实现对网页的访问,在请求控制器中创建处理请求的方法

目录

测试HelloWorld

@RequestMapping注解

@RequestMapping注解的位置

@RequestMapping注解的value属性

@RequestMapping注解的method属性

SpringMVC支持路径中的占位符(重点)

SpringMVC获取请求参数

1、通过ServletAPI获取

2、通过控制器方法的形参获取请求参数

@RequestParam注解


浏览器发送请求,若请求地址符合前端控制器的url-pattern,该请求就会被前端控制器

DispatcherServlet处理。

前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器,将请求地址和控制器中@RequestMapping注解的value属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。

处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf对视图进行渲染,最终转发到视图所对应页面。

测试HelloWorld

实现对首页的访问

@Controller
public class HelloController {
    // @RequestMapping注解:处理请求和控制器方法之间的映射关系
    // @RequestMapping注解的value属性可以通过请求地址匹配请求,/表示的当前工程的上下文路径
    // localhost:8080/springMVC/
    @RequestMapping("/")
    public String index(){
//        return类似请求转发
        return "first";
    }
}

通过超链接跳转到指定页面

在主页first.html中设置超链接

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>首页</title>
</head>
<body>
  <h1>首页</h1>
  <a th:href="@{/hello}">HelloWorld</a><br/>
</body>
</html>

在请求控制器中创建处理请求的方法

@RequestMapping("/hello") 
public String HelloWorld() {
	return "target";
}

点击主页面中HelloWorld链接时就会依据请求控制器中跳转到target页面中。

@RequestMapping注解

@RequestMapping:处理请求和控制器方法之间的映射关系

SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。

@RequestMapping注解的位置

@RequestMapping标识一个类:设置映射请求的请求路径的初始信息

@RequestMapping标识一个方法:设置映射请求请求路径的具体信息

@Controller
@RequestMapping("/test")
public class RequestMappingController {
    //此时请求映射所映射的请求的请求路径为:/test/testRequestMapping 
    @RequestMapping("/testRequestMapping")
    public String testRequestMapping(){ 
    	return "success";
    }
}

html跳转链接如下:

<a th:href="@{/test/testRequestMapping}">测试@RequestMapping</a><br>

@RequestMapping注解的value属性

@RequestMapping注解的value属性通过请求的请求地址匹配请求映射

value属性可以有多个请求地址,表示其中任意一个地址都可以请求映射

value属性必须要设置

@RequestMapping(value = {"/testRequestMapping","/test"})
public String testRequestMapping(){
   return "success";
}

表示以下这两个跳转链接都可以映射到此控制器

<a th:href="@{/test/testRequestMapping}">测试@RequestMapping的value属性-->/testRequestMapping</a><br>
<a th:href="@{/test/test}">测试@RequestMapping的value属性-->/test</a><br>

@RequestMapping注解的method属性

@RequestMapping注解的method属性通过请求的请求方式(get或post)匹配请求映射

@RequestMapping注解的method属性是一个RequestMethod类型的数组,表示该请求映射能够匹配多种请求方式的请求

若当前请求的请求地址满足请求映射的value属性,但是请求方式不满足method属性,则浏览器报错405:Request method 'POST' not supported

@RequestMapping(
    value = {"/testRequestMapping", "/test"}, 
    method = {RequestMethod.GET, RequestMethod.POST})
public String testRequestMapping(){ 
	return "success";
}

<form th:action="@{/test/test}" method="post">
    <input type="submit" value="提交">
</form>

SpringMVC支持路径中的占位符(重点)

SpringMVC路径中的占位符常用于RESTful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参。

//SpringMVC支持路径中的占位符,也就是某些需要传输的数据通过路径传输到服务器中
@RequestMapping("/testRest/{id}/{username}")
                    //通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参
public String testRest(@PathVariable("id") String id,
                       @PathVariable("username") String username){
    System.out.println("id:"+id+",username:"+username);
    return "success";
}
//最终输出的内容为-->id:1,username:admin

@RequestMapping注解中使用占位符表示传输数据,那么请求参数在html中应该写在路径中如下:

<a th:href="@{/test/testRest/1/admin}">测试路径中的占位符-->/testRest</a><br>

SpringMVC获取请求参数

1、通过ServletAPI获取

HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象。

@RequestMapping("/testParam")
public String testParam(HttpServletRequest request){ 
    String username = request.getParameter("username"); 
	String password = request.getParameter("password");
    System.out.println("username:"+username+",password:"+password); 
	return "success";
}

此方式有一个缺点:不管形参是什么类型接收到的都是String类型,但通过控制器方法的形参获取请求参数就没有这个困扰。

2、通过控制器方法的形参获取请求参数

@RequestMapping("/testParam")
public String testParam(String username, String password){ 
	System.out.println("username:"+username+",password:"+password); 
    return "success";
}

问题一:若请求所传输的请求参数中有多个同名的请求参数(一个参数名有不止一个值)应该怎么获取请求参数呢?

<!--springmvc获取请求参数-->
<a th:href="@{/test/testParam(username='admin',password=123456, hobby='打篮球', hobby='看书', hobby='发呆')}">测试获取请求参数-->/testParam</a><br>

上述的html代码,hobby有三个值。

1、若控制器方法的形参使用字符串类型,则接收到的参数的值为每个数据中间使用逗号拼接

2、若使用字符串数组类型的形参,此参数的数组中包含了每一个数据

注意:通过控制器方法的形参获取请求参数,形参名必须要和传输的请求参数名字一致

(@RequestParam注解可以解决形参名和请求参数名字不一致的情况)

@RequestParam注解

@RequestParam是将请求参数和控制器方法的形参创建映射关系

@RequestParam 注解一共有三个属性:

value:指定为形参赋值的请求参数的参数名

required:设置是否必须传输此请求参数,默认值为true。

若设置为true时,没有传输该请求参数时,页面报错400:Required String parameter 'xxx' is not present;若设置为false,则可以不传输该请求参数,形参的值为null。

defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""时,则使用默认值为形参赋值。

相关推荐

  1. 简单分析SpringMVC处理请求流程

    2024-02-01 08:22:01       42 阅读
  2. 网站建设HTTP 请求方法

    2024-02-01 08:22:01       46 阅读
  3. springMVC获取请求参数方式

    2024-02-01 08:22:01       63 阅读
  4. 如何Flutter实现网络请求

    2024-02-01 08:22:01       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-01 08:22:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-01 08:22:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-01 08:22:01       87 阅读
  4. Python语言-面向对象

    2024-02-01 08:22:01       96 阅读

热门阅读

  1. HG/T 3830-2022 预涂卷材涂料检测

    2024-02-01 08:22:01       53 阅读
  2. 物流无人机在哪些场景最适合应用?

    2024-02-01 08:22:01       45 阅读
  3. Flink 集成和使用 Hive Metastore

    2024-02-01 08:22:01       55 阅读
  4. C++ 结构体的构造函数

    2024-02-01 08:22:01       50 阅读
  5. 面阵相机拍摄运动的物体怎样保证图像清晰

    2024-02-01 08:22:01       63 阅读
  6. TensorFlow2实战-系列教程14:Resnet实战2

    2024-02-01 08:22:01       64 阅读
  7. 3D Gaussian Splatting-实时辐射场渲染技术

    2024-02-01 08:22:01       49 阅读
  8. TensorFlow2实战-系列教程15:Resnet实战3

    2024-02-01 08:22:01       65 阅读
  9. CSS 中的 :is(), :where(), 和 :has() 选择器简介

    2024-02-01 08:22:01       54 阅读
  10. 使用certbot申请https通配符证书【阿里云篇】

    2024-02-01 08:22:01       64 阅读