Spring MVC 常用注解详细解析

350 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

前言

上一篇文章我们介绍了MVC的特性和工作流程并带大家完成了一个简单的MVC入门案例。其实在实际完成的过程中,坑点非常的多,如果调不通或者有不懂的地方欢迎大家留言,我看到了就会力所能及为大家解答疑问。这篇文章我来介绍下Spring MVC常用的注解。

MVC 常用注解

其实在我们之前的入门案例中就用到了几个注解,不知道大家还记不记得,下面我来详细介绍MVC常用注解的用法。

@Controller

@Controller 在类定义处添加,将该类交给 IoC 容器来管理,与spring自动扫描同时使用,使其成为一个控制器,并检测该方法是否使用了 @RequestMapping 注解。

@Controller只是定义了一个控制器类,只有使用 @RequestMapping 注解的方法才是处理请求的处理器。可以接收客户端请求。

@Controller 
public class FirstHandler { 
    @RequestMapping("/homepage") 
    public String homepage(){ 
        System.out.println("打开homepage");
        return "homepage"; 
    } 
}

必须经过spring的xml配置文件中context:component-scan的扫描之后才能成为控制器。

@RequestMapping

@RequestMapping注解也是我们在之前的MVC入门案例中使用过的,相信大家已经了解过其基本特性了,这篇文章我们还会介绍到我们没有用到过的属性。

主要作用,把请求的URL映射到一个处理器的方法上,RequestMappingHandleMapping处理器映射器针对该注解来完成URL到处理器方法的映射,它返回的是方法对象,因此对应的处理器适配器就知道去执行哪个方法。

@Controller 
public class FirstHandler { 
    @RequestMapping("/homepage") 
    public String homepage(){ 
        System.out.println("打开homepage");
        return "homepage"; 
    } 
}

我们之前使用@RequestMapping注解是作用在方法上设置的是请求路径的具体信息,如我们让它作用在类上设置的又是什么呢?

我们在HelloWorldHandler类上加上@RequestMapping("/hello")这时候我们设置的就是请求路径的初始信息。这时候我们启动项目后访问的路径就不是http://localhost:8080/homepage了,这时候我们的访问路径就是http://localhost:8080/hello/homepage。是不是有些疑惑,为什么要这么写多了一层路径不是更加麻烦吗?这是因为在我们实际开发项目中会有很多的类,不同类中可能会有相同的路径,比如每个类中基本都会有/homepage这个路径,这样就会造成冲突,所以为了区分,我们通常就会在类上在加一个@RequestMapping注解设置一个请求路径的初始信息。

相关属性

value:指定 URL 请求的实际地址,是 @RequestMapping 的默认值。我们之前只有一个属性,所以可以省略value

@RequestMapping("/hello")
//等同于
@RequestMapping(value="/hello")

method:指定请求的方式,其中包含GET、POST、PUT、DELET四种常用的请求方式,它的取值决定了当前方法只能处理什么方式的请求。默认是GET。

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

params :规定请求中必须有指定的参数,否则将无法正常的发出请求。

可以指定参数的值,如果指定了参数的值,则访问时该参数的值必须为指定值,否则无法访问。也可以不指定值,不指定值的话,访问时只要有该参数即可。

@RequestMapping(value = "/hello",method = RequestMethod.GET,params = "id")

这时候我们再访问http://localhost:8080/homepage就是下面这样:

微信截图_20221010160255.png 正确的访问路径是http://localhost:8080/homepage?id=1id的值我们并没有指定,所以可以是任意值。

上面是只有一个参数的示例,下面我们来写一个两个参数的。

@RequestMapping(value = "/index",method = RequestMethod.GET,params ={"id=1","name"})

两个参数需要写在{}中,我们指定了id=1访问时必须为1,name没有指定可以是任意值,正确的访问路径是http://localhost:8080/homepage?id=1&name=xyj

在实际开发中,我们会需要取到路径传参的值Spring MVC取路径传参的值非常的方便。

@Controller 
public class FirstHandler { 
    @RequestMapping(value = "/index",method = RequestMethod.GET,params ={"id","name"})
    public String homepage(int id,String name){ 
        System.out.println(id);
        System.out.println(name);
        System.out.println("打开homepage");
        return "homepage"; 
    } 
}

访问http://localhost:8080/homepage?id=1&name=xyj

打印结果:

1
xyj
打开homepage

这种就是直接在方法参数列表中获取,需要变量名与路径参数名相同。如果想定义不同的于路径参数的变量名称则需要使用@RequestParam注解进行映射。

@Controller 
public class FirstHandler { 
    @RequestMapping(value = "/index",method = RequestMethod.GET,params ={"id","name"})
    public String homepage(@RequestParam("id") int uid,@RequestParam("name") String uname){ 
        System.out.println(uid);
        System.out.println(uname);
        System.out.println("打开homepage");
        return "homepage"; 
    } 
}

访问http://localhost:8080/homepage?id=1&name=xyj

打印结果:

1
xyj
打开homepage

这样也可以实现相同的效果。这样的取参方式相比于使用JavaWeb的方式方便太多了,这些都是有MVC在内部实现的,我们使用起来就非常的方便。

总结

看了这篇文章,相信大家已经对MVC有所了解了,也知道了使用MVC很方便,在后面的文章中,我会持续更新Spring MVC 的内容,希望大家多多支持。