程序员社区

17. Spring MVC 注解

Spring MVC 注解

SpringMVC 框架提供了功能强大的注解,大大简化了代码开发的同时也提升了程序的可扩展性。

1. 注解参数详解

  Spring MVC 通过 @RequestMapping 注解将 URL 请求与业务方法进行映射,在 Handler 的类定义处以及方法定义处都可以添加 @RequestMapping,在类定义处添加,相当于客户端多了一层访问路径。

@Controller
@RequestMapping("/hello")
public class HelloHandler {
    
    @RequestMapping(value="/index")
    public String index(){
        System.out.println("Hello World!");
        return "index";
    }
}

在这里插入图片描述

参数详解:

  1. value:指定 URL 请求的实际地址,是 @RequestMapping 的默认值;

  2. method:指定请求的 method 类型,包括 GET、POST、PUT、DELETE等;

@Controller
@RequestMapping("/hello")
public class HelloHandler {

    @RequestMapping(value = "/index",method = RequestMethod.POST)
    public String index(){
        System.out.println("Hello World!");
        return "index";
    }
}

浏览器地址栏只能向服务器发送 GET 请求,但是 method 表示只有 POST 请求可以方法该方法,若使用 GET 请求访问,则直接报错。

在这里插入图片描述

但是可以通过 Postman 工具发送不同类型的请求:

在这里插入图片描述

其他几种方式类似,可以在 @RequestMapping 注解的参数 method 中限定了请求的类型,我们常用的测试类型是 GET 和 POST。

  1. params:指定 request 中必须包含某些参数值,否则无法调用该方法;
@Controller
@RequestMapping("/hello")
public class HelloHandler {

    @RequestMapping(value = "/index",method = RequestMethod.GET,params = {"name","id=1"})
    public String index(){
        System.out.println("Hello World!");
        return "index";
    }
}

在这里插入图片描述

URL 请求中必须同时包含 name 和 id 两个参数,并且 id 的值必须为1,才能调用业务方法。否则会有如下的报错提示:

在这里插入图片描述


2. 参数绑定

方式一:@RequestParam 注解的参数绑定

params 是对 URL 请求的参数进行限制,不满足条件的 URL 无法达到该业务方法,这个特性并不是我们开发中常用的。我们需要用到的是在业务方法中获取 URL 的参数,实现这一步很简单。

  1. 在业务方法定义时声明参数列表;
  2. 给参数列表添加 @RequestParam 注解;

在形参列表中通过添加 @RequestParam 注解完成 HTTP 请求参数与业务方法形参的映射。

@Controller
@RequestMapping("/hello")
public class HelloHandler {

    @RequestMapping(value = "/index")
    public String paramsBind(@RequestParam String name,@RequestParam Integer id){
        System.out.println("执行了index方法...");
        System.out.println(name);
        id = id + 10;
        System.out.println(id);
        return "index";
    }
}

在这里插入图片描述

将 URL 请求的参数 name 和 id 分别赋值给形参 name 和 id(参数名默认对应赋值),同时进行了数据类型的转换,因为浏览器地址栏输入的参数都是字符串文本类型,数据类型转换、JavaBean 封装等工作由 HandlerAdapter 默认完成了,所以根据形参的数据类型,将 id 转换为 Integer 类型,可以看到打印的 id 值为 11,完成了数学运算。

关于数据绑定,也可以在形参列表中通过添加 @RequestParam 注解完成 HTTP 请求参数与业务方法形参的映射。

@Controller
@RequestMapping("/hello")
public class HelloHandler {

    @RequestMapping(value = "/index")
    public String paramsBind(@RequestParam("name") String uname,@RequestParam("age") Integer id){
        System.out.println("执行了index方法...");
        System.out.println(uname);
        id = id + 10;
        System.out.println(id);
        return "index";
    }
}

方式二:SpringMVC 同时也支持 restful 风格的 URL

@Controller
@RequestMapping("/hello")
public class HelloHandler {

    @RequestMapping(value = "/restful/{id}/{name}")
    public String paramsBind(@PathVariable("name") String name, @PathVariable("id") Integer id){
        System.out.println("执行了index方法...");
        System.out.println(id);
        System.out.println(name);
        return "index";
    }
}

浏览器地址栏 REST 风格的参数内容:http://localhost:8080/hello/restful/12/张三

在这里插入图片描述

通过 @PathVariable 注解完成请求参数与形参的映射。

方式三:Spring MVC 通过映射可以直接在业务方法中获取 Cookie 的值

package com.trainingl.handler;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/hello")
public class HelloHandler {

    @RequestMapping("/cookie")
    public String cookie(@CookieValue(value = "JSESSIONID")String sessionId){
        System.out.println(sessionId);
        //5882BBB96E5CAE743566E7903EBE6463
        return "index";
    }
}

方式四:使用 JavaBean 绑定参数

Spring MVC 会根据请求参数名和 JavaBean 属性名进行自动匹配,自动为对象填充属性值,同时支持级联属性。

1、创建实体类 User、Address 并进行级联设置;

package com.trainingl.entity;

public class User {
    private long id;
    private String name;
    private Address address;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}
package com.trainingl.entity;

public class Address {
    private Integer id;
    private String region;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getRegion() {
        return region;
    }

    public void setRegion(String region) {
        this.region = region;
    }

    @Override
    public String toString() {
        return "Address{" +
                "id=" + id +
                ", region='" + region + '\'' +
                '}';
    }
}

2、创建页面 addUser.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>添加新用户</title>
    </head>
    <body>
        <form action="/hello/addUser" method="post">
            编号:<input type="text" name="id"><br/>
            姓名:<input type="text" name="name"><br/>
            地址:<input type="text" name="address.region"><br/>
            <input type="submit" value="提交"/>
        </form>
    </body>
</html>

3、编写控制器的业务方法

package com.trainingl.handler;

import com.trainingl.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/hello")
public class HelloHandler {
    
    @RequestMapping("/addUser")
    public String addUser(User user){
        System.out.println(user);
        return "index";
    }
}

4、启动 Tomcat 服务器,运行 Web 应用程序

在这里插入图片描述

可以观察到页面发生跳转,并且 IDEA 的控制台有如下的信息输出:

在这里插入图片描述

出现了中文乱码的问题,Spring MVC 解决中文乱码很简单,只需在 web.xml 中添加过滤器即可。

<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

注意:如果<web-app>标签标红线,则在写代码时<filter> 标签要写在 <servlet> 标签前面。

在这里插入图片描述


3. 页面跳转

JSP 页面跳转有两种方式:请求转换和重定向,Spring MVC 默认以转发的形式响应 JSP,也可以手动设置。

1、重定向

@Controller
@RequestMapping("/hello")
public class HelloHandler {
    @RequestMapping("/redirectTest")
    public String redirectTest(){
        return "redirect:/index.jsp";
    }
}

通过地址栏可以看到 localhost:8080/hello/redirectTest,地址改变,重定向跳转。

需要注意的是在业务方法中,设置重定向不能写逻辑视图,必须写明目标资源的物理路径,比如本例中的 “redirect:/index.jsp” 。

在这里插入图片描述

2、请求转发

@Controller
@RequestMapping("/hello")
public class HelloHandler {
    @RequestMapping("/forwardTest")
    public String forwardTest(){
        return "forward:/index.jsp";
    }
}

在这里插入图片描述

可以看到请求前后,地址栏没有发生改变,这次请求是以转发的方式跳转。

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 17. Spring MVC 注解

一个分享Java & Python知识的社区