【Java EE】Spring MVC 的使用

发布于:2025-07-09 ⋅ 阅读:(19) ⋅ 点赞:(0)

1. 路由映射:

        @RequestMapping:当用户访问某个 URL 时,该注解会根据 URL 的路径映射到具体的程序中对应的类或方法(路由映射)。修饰方法时,路径为类路径 + 方法路径。默认情况下同时支持 GET 和 POST,也可以显式指定,如下:

// 此时只支持 GET 方法
@RequestMapping(value = "/m2", method = RequestMethod.GET)

        @GetMapping:和上面等价,只支持 GET 的另一种写法。

2. 接收请求中的参数:

        首先,请求报文中有哪些地方可能带有后端需要的参数?

        从 HTTP 协议传过来的参数均是字符串,Spring 会根据后端定义的参数类型进行转换,若无法转换则会报 400。

2.1 接收查询字符串中的数据

        接收单个参数:

public String r1(String keyword)

        @RequestParam:用于重命名,此时前端的参数名为 keyword。一旦使用该注解则默认该参数为必传参数,如果客户端没有传此参数会报 400

public String r1(@RequestParam("keyword") String key)

        也可以显式指定该参数为非必传参数,此时不传参数会为 null。对于可能为空,且并未自动初始化的参数,应该使用包装类型,因为包装类型可以为 null,而基本数据类型不可以为 null。

public String r2(@RequestParam(value = "q", required = false)

        接收数组:Spring 会帮我们自动绑定数组中参数的值。

public int[] r3(int[] arr)

         下面两种方法都可以:

        接收集合:需要使用 @RequestParam 绑定参数关系,也就是告知 Spring 要将传来的数据构造为集合。

public String r4(@RequestParam List<Integer> list)

2.2 接收 body 中的数据

        @RequestBody:该注解用于绑定请求正文中的数据。

        接收 JSON:直接使用 Java 对象就可以轻松接收 JSON。这是因为 Spring 已经帮我们内置了 JSON 和 Java 对象相互转换的工具(Jackson)。

public String r5(@RequestBody UserInfo userInfo)

        接收文件:可以使用 @RequestPart 来重命名。

    public String r11(MultipartFile file) throws IOException {
        // 得到文件名
        String filename = file.getOriginalFilename();
        // transferTo 内部封装了 InputStream 和 OutputStream
        file.transferTo(new File("D:\\", "UserFile.jpg"));
        return "已接收:" + filename;
    }

2.3 接收 header 中的数据

        @RequestHeader:通过 header 中的键名获取。

public String getUserAgent2(@RequestHeader("User-Agent") String ua)

       @CookieValue:获取 cookie 中的某一个值。如果想要获取很多 cookie 就要写很多注解,所以也可以采用下面的方法。

public String r13(@CookieValue("name") String name)

        使用 HttpServletRequest 类:HttpServletRequest 和 HttpServletResponse 是 Servlet 提供的接口,由 Tomcat 为我们实现。SpringWebMVC 是在 Servlet 的基础上构建的框架,这两个 Servlet 的核心类作为 SpringWebMVC 的内置对象存在,HttpServletRequest 中封装了 HTTP 请求的全部信息,HttpServletResponse 中封装了 HTTP 响应的全部信息。在高级 Web 框架出现前,使用这两个类就可以获取通信的全部数据,虽然现在 SpringWebMVC 为我们提供了许多方便的注解,但有些情况下使用 HttpServletRequest 更优雅。

    public String r12(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        StringBuilder builder = new StringBuilder();
        if (cookies == null) return "无 Cookie 设置!";
        for (Cookie c : cookies) builder.append(c.getName()).append(":").append(c.getValue()).append(",");
        return "Cookie 信息为:" + builder;
    }
    public String getUserAgent(HttpServletRequest request) {
        return request.getHeader("User-Agent");
    }

        获取 Session:并不是指从客户端获取 Session,因为 Session 是保存在服务器内存中的,这里实际上是在获取 Cookie 中的 sessionId,然后根据 sessionId 获取服务器中对应的 Session 对象。

        需要实例 HttpServletRequest 类,调用其提供的 getSession 方法,这个方法就是封装了上面提到的两步。如果检索到 Cookie 中有 sessionId,则表示服务器已经在内存中保存了该 Session,该方法会返回现有的Session。如果不存在,则会生成 sessionId,创建新的 Session,在响应中返回该 sessionId 给客户端。因此 getSession 默认返回非空 Session,若需避免创建新 Session,应指定参数为 getSession(false)。

HttpSession session = request.getSession();

        也可以不实例 HttpServletRequest 类,直接使用 HttpSession 类获取,此时不存在 Session 会自动创建。

public String r15(HttpSession session)

        针对 Session 的进一步操作:

session.setAttribute(使用字符串命名, 需要绑定到该会话的对象);
session.getAttribute(指定的名称);

2.4 获取 URL 中资源定位部分的参数

        取路径参数的情况并不多,{ } 里的数据即要取的值。

        @PathVariable:意为路径中的变量,取路径参数需要加此注解,可以填参数来重命名。

    @RequestMapping("/r6/{r7}")
    public String r6(@PathVariable String r7)

网站公告

今日签到

点亮在社区的每一天
去签到