【JavaEE】-- Spring Web MVC入门

1. 建立连接

1.1 @RequestMapping

该注解是用来注册接口的路由映射的。

路由映射:当用户访问一个URL时,将用户的请求对应到程序中的某个类的某个方法的过程。

1.2 @RestController

一个项目中,会有很多个类,每个类中可能会有很多的方法,Spring程序时怎么知道要执行哪个方法呢?

Spring会对所有的类进行扫描,如果类加了注解@RestController,Spring才会去看这个类中的方法有没有加@RequestMapping注解。

2. 请求

2.1 传递单个参数

java 复制代码
@RequestMapping("/request")
public class RequestController {
    
    @RequestMapping("/r1")
    public String r1(Integer age){//包装类型
        return "接收到参数 age:" + age;
    }

     
    @RequestMapping("/r2")
    public String r2(int age){//基本类型
        return "接收到参数 age:" + age;
    }
}

注意:

  1. 使用基本数据类型来接收参数时,参数必须传(除boolean类型),否则会报500错误。

  2. 对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null ;所以企业开发中,对于参数可能为空的数据,建议使⽤包装类型。

2.2 传递多个参数

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/r3")
    public String r3(String name, String password){
        return "接收到参数 name:" + name + ", password:"+ password;
    }
}

2.3 传递对象

Person类

java 复制代码
public class Person {
    private String name;
    private String password;
    private Integer age;

    public Person() {
    }

    public Person(String name, String password, Integer age) {
        this.name = name;
        this.password = password;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

Controller:

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/r4")
    public String r4(Person person){
        return "接收到参数 person:" + person;
    }
}

2.4 后端参数重命名(后端参数映射)

假设:

  1. 前端传的参数名:q

  2. 后端接收的参数名:keyword

这种传递参数和接收参数的变量名不一致的情况,就可以使用@RequestParam来重命名前后端的参数名。

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/r5")
    public String r5(@RequestParam(value = "q") String keyword){
        return "搜索词为 :" + keyword;
    }
}

注意: 使用@RequestOaram注解进行参数重命名时,参数就变成了必填参数。

2.4.1 非必填参数设置

只需要设置@RequestParam中的required = false

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/r5")
    public String r5(@RequestParam(value = "q", required = false) String keyword){
        return "搜索词为 :" + keyword;
    }
}

2.5 传递数组

Spring MVC可以自动绑定数组参数的赋值。

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/r6")
    public String r6(String[] arr){
        return "数组:" + Arrays.toString(arr) + ", length:" + arr.length;
    }
}

2.6 传递集合

集合参数:和数组类似,同一个请求参数名有为多个,且需要使用 @RequestParam 绑定参数关系。

默认情况下,请求中参数名相同的多个值,是封装到数组.如果要封装到集合,要使用@RequestParam 绑定参数关系。

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/r7")
    public String r7(@RequestParam(required = false) List<String> list){
        StringBuilder builder = new StringBuilder();
        for (String s: list){
            builder.append(s).append(",");
        }
        return "集合:" + builder.toString();
    }
}

2.7 传递JSON数据

接收JSON对象,需要使用@RequestBody注解。

RequestBody:请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中。

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/r8")
    public String r8(@RequestBody Person person){
        return "接收json数据:" + person;
    }
}

2.8 获取URL中参数@PathVariable

@PathVariable:这个注解主要作用是在请求URL路径的数据绑定。

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/article/{articleId}")
    public String r9(@PathVariable("articleId") Integer articleId){
        return "r9 文章ID:" + articleId;
    }

    @RequestMapping("/article/{articleId}/{type}")
    public String r10(@PathVariable("articleId") Integer articleId, @PathVariable String type){
        return "r10 文章ID:" + articleId + ", type:" + type;
    }
}

2.9 上传文件@RequestPart

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/r11")
    public String r11(@RequestPart("file111") MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        File destFile = new File("D:\\temp\\"+ originalFilename);
        //上传文件
        file.transferTo(destFile);
        return "存储文件成功";
    }

    @RequestMapping("/r12")
    public String r12(@RequestParam("file111") MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        File destFile = new File("D:\\temp\\"+ originalFilename);
        //上传文件
        file.transferTo(destFile);
        return "存储文件成功";
    }
}

2.10 获取Cookie

2.10.1 传统获取Cookie

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        if (cookies!=null) {
            for (Cookie cookie: cookies){
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        }
        return "获取cookie成功";
    }
}

Spring MMVC 是基于Servlet API 构建的原始的Web框架,也是在Servlet的基础上实现的。

HttpServletRequest HttpServletResponse是Servlrt提供的两个类, 是Spring MVC 方法的内置对象,需要时直接在方法中添加声明即可。

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

HttpServletResponse对象代表服务器的响应,HTTP响应的信息都在这个对象中,比如向客户端发送的数据,响应头,状态码等。通过这个对象提供的方法,可以获得服务器响应的所有内容。

2.10.2 简洁获取Cookie

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue("name") String name){
        return "获取cookie成功" + name;
    }
}

2.11 获取Session

2.11.1 Session存储

java 复制代码
@RequestMapping("/request")
public class RequestController {
    @RequestMapping("/setSession")
    public String setSession(String name, HttpServletRequest request){
        HttpSession session = request.getSession();
        session.setAttribute("name", name);
        session.setAttribute("age", 1);
        return "设置session成功";
    }

	@RequestMapping("/setSession2")
    public String setSession2(String name, HttpSession session){
//        HttpSession session = request.getSession();
        session.setAttribute("name", name);
        session.setAttribute("age", 1);
        return "获取session成功";
    }
}

2.11.2 Session读取

java 复制代码
@RequestMapping("/request")
public class RequestController {
     @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){
        HttpSession session = request.getSession(false);
        String name = (String)session.getAttribute("name");
        Integer age = (Integer) session.getAttribute("age");
        return "从session中获取信息, name:" +name + ", age:" + age;
    }

    @RequestMapping("/getSession2")
    public String getSession2(HttpSession session){
        String name = (String)session.getAttribute("name");
        Integer age = (Integer) session.getAttribute("age");
        return "从session中获取信息, name:" +name + ", age:" + age;
    }

    @RequestMapping("/getSession3")
    public String getSession3(@SessionAttribute("name") String name){
        return "从session中获取信息, name:" +name;
    }
}

2.12 获取Header

2.12.1 传统获取

java 复制代码
@RequestMapping("/request")
public class RequestController {
     @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request){
        String userAgent = request.getHeader("User-Agent");
        return "从header中获取信息, userAgent:" +userAgent;
    }
}

2.12.2 简洁获取

java 复制代码
@RequestMapping("/request")
public class RequestController {
     @RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("User-Agent") String userAgent){
        return "从header中获取信息, userAgent:" +userAgent;
    }
}

3. 响应

3.1 返回数据@ResponseBody

@ResponseBody既是类注解,也是方法注解。

如果该注解是作用在类上,表示该类的所有方法返回的都是数据,如果作用在方法上,表示该方法返回的数据。

4. @RestController@Controller 有什么关联和区别?

早期的MVC概念中,后端会返回视图。

随着互联网的发展,项目开发变成了"前后端分离"的模式,Java主要是用来做后端项目的开发,所以也就不再处理前端相关的内容了。

MVC的概念也逐渐发生了变化,View不再返回视图,而是返回显示视图时需要的数据。所以 @RestController 返回的是数据;@Controller返回的视图

@RestController = @Controller + @responseBody

@Controller: 定义一个控制器,Spring框架启动时加载,把这个对象交给Spring管理。
@ResponseBody: 定义返回的数据格式为非视图。

相关推荐
uhakadotcom2 小时前
fastapi的最新版本,提供了哪些新api可供使用
前端·面试·github
G***66912 小时前
前端组件单元测试覆盖率,目标与实现
前端·单元测试
天天进步20152 小时前
前端单元测试从入门到精通:Jest与Testing Library实战
前端·单元测试
U***49832 小时前
前端组件单元测试模拟数据,Mock Service Worker
前端·单元测试
珹洺2 小时前
Java-Spring入门指南(三十二)Android SQLite数据库实战
java·数据库·spring
Han.miracle2 小时前
JavaEE ——多线程的线程安全集合类
java·java-ee
ZT_KeBei2 小时前
前端调试利器——pageSpy的使用简易指南
前端
少卿2 小时前
PerformanceObserver 性能条目类型(Entry Types)
前端·javascript
宇余2 小时前
ES2025新特性实战:5分钟get前端高频实用语法
前端·typescript