第03章 SpringBoot获取请求参数

我们首先创建 “SpringBootRequestDemo” 工程。

然后我们修改编码格式以及Maven仓库地址,我们省略这个过程了。 接着我们再添加spring-boot-starter-parent,spring-boot-starter-web,spring-boot-starter-thymeleaf依赖库

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.demo</groupId>
    <artifactId>SpringBootRequestDemo</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.13</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.7.18</version>
            </plugin>
        </plugins>
    </build>

</project>

我们继续创建“Application”的入口类

package com.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {

        SpringApplication.run(Application.class, args);
    }
}

这个文件基本上也是固定不变的。

接下来,我们创建 “resources\static\index.html” 入口文件

<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>index</title>
</head>
<body>

<p><a href="/test">test</a></p>

</body>
</html>

我们做了一个 “/test” 的请求,然后我们创建 TestController 来处理这个请求

package com.demo;

import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

    @RequestMapping("/test")
    public String hello(Map<String, Object> map) {

        map.put("message", "hello test!");
        return "test";
    }
    
}

我们向“test.html” 输出一个 “message” 的数据,继续创建 “resources\templates\test.html” 文件。

<!doctype html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>test</title>
</head>
<body>

<h1 th:text="${message}"></h1>

</body>
</html>

我们使用上一章节的 “Thymeleaf” 模版输出列表数据。

我们运行整个项目。

Spring Boot获取前端页面参数的几种方式总结

第一,指定前端url请求参数名称与方法参数名一致, 适用get方式,而不适用post方式。

例如请求:http://localhost:8080/test01?name=zhang&age=30
    @RequestMapping("/test01")
    public String test01(String name, String age, Map<String, Object> map){

        map.put("message", name + "-" + age);
        return "test";
    }

这种方式,就是将请求参数作为方法参数,SpringBoot会自动匹配完成数据的填入,我们只需要直接使用方法参数,就可以使用请求参数了。但是,这种方式仅适用于Get请求,运行效果如下

第二,通过HttpServletRequest来获取前端页面参数,适用get和post方式。

例如请求:http://localhost:8080/test02?name=zhang&age=30
    @RequestMapping("/test02")
    public String test02(HttpServletRequest request, Map<String, Object> map){

        String name = request.getParameter("name");
        String age = request.getParameter("age");
        map.put("message", name + "-" + age);
        return "test";
    }

我们可以看出,SpringBoot集成了SpringMVC注解的优点,方法参数可以自定义,这个对我们帮助很大。使用 HttpServletRequest 对象可以获取到用户提交的任何数据,都在期API方法里面。

第三,通过建立一个请求数据对象来获取参数,适用get和 post方式。

例如请求:http://localhost:8080/test03?name=zhang&age=30
package com.demo;

public class TestRequest {

    public String name;
    public int age;

    // 省略get/set方法
}

大家注意到了,请求数据对象里面的属性变量就是请求参数,两者保持一致。

    @RequestMapping("/test03")
    public String test03(TestRequest request, Map<String, Object> map){

        String name = request.getName();
        int age = request.getAge();
        map.put("message", name + "-" + age);
        return "test";
    }

这种方式与第一种差不多,但是支持post请求,不过需要我们手动定义请求数据对象。

对于请求参数比较多的情况下,推荐这种方式(尤其是post请求方式)。

第四,用注解@RequestParam获取请求参数,仅适用get方式。

例如请求:http://localhost:8080/test04?name=zhang&age=30
    @RequestMapping("/test04")
    public String test04(@RequestParam("name") String paramName,
                         @RequestParam("age") String paramAge,
                         Map<String, Object> map){

        map.put("message", paramName + "-" + paramAge);
        return "test";
    }

这种方式还不如第一种简单,但是它可以解决请求参数名和方法参数名不一致的问题。

第五,通过PathVariable注解来获取请求路径的参数,仅适用get方式。

例如请求:http://localhost:8080/test06/zhang/30

请注意,我们的请求URL不一样了,这个称之为PathInfo模式的URL。

    @RequestMapping("/test05/{name}/{age}")
    public String test06(@PathVariable("name") String paramName,
                         @PathVariable("age") String paramAge,
                         Map<String, Object> map){

        map.put("message", paramName + "-" + paramAge);
        return "test";
    }

这种方式需要保持url的名称和注解里面的名称保持一致即可。

第六,用注解@RequestBody获取请求参数,仅适用post方式。

@RequestBody主要用来接收前端传递给后端的json字符串中的数据,并且一个请求只有一个RequestBody。后期我们会介绍这种方式。

### 实现获取验证码功能 #### Maven依赖 为了在Spring Boot项目中实现获取验证码的功能,首先需要引入必要的Maven依赖。对于通过电子邮件发送验证码的情况,需加入`spring-boot-starter-mail`用于处理邮件发送逻辑[^1]。 ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> ``` 如果计划使用图形验证码,则可以考虑集成Hutool库来简化开发过程。此时应该添加如下依赖项以支持Hutool中的验证码生成功能[^2]: ```xml <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> ``` 另外,如果是基于短信服务提供商API实现的验证码发送机制,则要按照服务商的要求导入对应的SDK包,并设置好相应的认证信息,比如阿里云短信服务就需要指定访问密钥ID(`accessKeyId`)和秘密(`accessKeySecret`)等参数[^3]。 #### 应用程序配置 无论采用哪种方式生成并分发验证码,在项目的`application.yml`或`application.properties`文件里都应定义好所需的服务端口、数据库连接字符串以及其他第三方平台所需的凭证资料。例如: ```yaml # application.yml 示例 (针对邮件发送) spring: mail: host: smtp.example.com port: 587 username: [email protected] password: your-email-password properties: mail: smtp: auth: true starttls: enable: true ``` 或者当涉及到短信验证码时: ```properties # application.properties 示例 (针对短信发送) sms.accessKeyId=your-access-key-id sms.accessKeySecret=your-access-key-secret sms.signName=YourSignName sms.templateCode=SMS_123456789 ``` #### 编写业务逻辑代码 接下来就是编写具体的Java类和服务方法来完成整个流程的设计。这里给出一个简单的例子展示如何创建控制器接收前端请求、调用服务层生产随机数作为验证码并通过所选渠道将其传递给用户。 ##### 控制器(Controller) ```java @RestController @RequestMapping("/api/v1/auth") public class AuthController { @Autowired private CaptchaService captchaService; /** * 获取验证码接口 */ @PostMapping("/captcha") public ResponseEntity<String> getCaptcha(@RequestParam String emailOrPhone){ try { // 调用服务层的方法生成并发送验证码 boolean result = captchaService.sendCaptcha(emailOrPhone); if(result){ return new ResponseEntity<>("success", HttpStatus.OK); }else{ return new ResponseEntity<>("failed to send captcha", HttpStatus.INTERNAL_SERVER_ERROR); } } catch (Exception e) { log.error(e.getMessage(),e); throw new RuntimeException("Error occurred while sending captcha"); } } } ``` ##### 验证码服务(Captcha Service) ```java @Service @Slf4j public class CaptchaServiceImpl implements CaptchaService { @Value("${spring.mail.username}") private String fromEmail; @Autowired JavaMailSender javaMailSender; @Override public Boolean sendCaptcha(String targetAddress) throws MessagingException, UnsupportedEncodingException { Random random = new Random(); int code = random.nextInt(899999)+100000; // Generate a six-digit number MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message,true); helper.setFrom(fromEmail,"System Notification"); helper.setTo(targetAddress); helper.setSubject("[Verification Code]"); helper.setText("<p>Your verification code is:</p><h1 style='color:red'>"+code+"</h1>",true); javaMailSender.send(message); // Store the generated code somewhere safe and temporarily. storeGeneratedCode(code,targetAddress); return true; } private void storeGeneratedCode(int code,String address){ // Implement storage logic here... } } ``` 以上示例展示了基本框架下的操作步骤,实际应用过程中还需注意安全性考量以及异常情况处理等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值