SpringMVC--03获取请求数据

获取请求数据

使用原生Servlet API获取

这里的原生Servlet API即为使用HttpServletRequest对象来获取参数

    @RequestMapping("/login")
    public String login(HttpServletRequest request, HttpServletResponse response){
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        if(username.equals("admin") && password.equals("123456")){
            return "success";
        }else {
            return "error";
        }

注意这里的HttpServletRequest等对象是由web容器创建的

使用@RequestParam注解获取参数

    @RequestMapping("/login")
    public  String login(
            @RequestParam(required = true)
            String username,
            @RequestParam
            String password
    ){
        if(username.equals("admin") && password.equals("admin")){
            return "success";
        }else {
            return "error";
        }
    }
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    // name同value用于指定前端数据的name
    // 若形参名与参数name相同则不需要指定
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";

    // 用于指定该参数是否必须,默认为必须
    boolean required() default true;

    // 用于设置该参数的默认值
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

使用控制器方法上的形参名接收

若请求参数名和控制器方法上的形参名相同,那么可以省略@RequestParam注解

当使用的是Spring6+版本,则需要在pom.xml文件中指定编译参数-parameter

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <!-- maven版本 -->
            <version>3.9.8</version>
            <configuration>
                <!-- 生成java字节码版本 -->
                <source>21</source>
                <target>21</target>
                <compilerArgs>
                    <!-- 指明在生成字节码时保留方法参数名称 -->
                    <arg>-parameters</arg>
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

使用javabean接受请求参数

若前端使用json提交那么需要在形参处添加@RequestBody注解

@Data
public class User {
    private String username;
    private String password;
}
    // 使用javabean接收参数
    @RequestMapping("/login")
    public String login(User user){
        if(user.getUsername().equals("admin") && user.getPassword().equals("admin")){
            return "success";
        }else{
            return "error";
        }
    }

底层先通过扫描文件,通过isAnnotationPresent()方法判断该类是否被@Controller注解;若被注解,则通过该类的getMethod()方法来获取每一个方法,同时用方法对象的getAnnotation()方法判断该方法是否是一个requestMapping;若此方法是一个requestMapping,则使用该方法对象的getParameters()方法,来获取参数类型。获取到参数类型后利用invoke()来为该参数赋值,所赋予的值是通过对参数类的class对象使用newInstance()方法所创建,并利用参数类的class对象的getMethod()方法获取到该类的所有方法后,再利用这些方法中所有的setter方法名去掉set且首字母小写作为前端请求参数名通过httprequest对象来获取这些参数的值,并使用这些setter对象invoke()方法来进行赋值

若对上述分析理解还不够深刻,则去看之前spring6中手写ioc的部分

使用@RequestHeader注解获取请求头

使用方法与@RequestParam相同,其value为请求头中属性的名称

使用@CookieValue注解获取提交的cookie

使用方法与@RequestParam相同,其value为cookie中属性的名称

发送一个cookie

<script type="text/javascript">
    function sendCookie(){
        document.cookie = "id=1; expires=Thu,18 Dec 2025 12:00:00 UTC; path=/";
        document.location = "/springmvc/login";
    }
</script>
<button onclick="sendCookie()">发送cookie</button>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值