3 Spring MVC 数据绑定

1 映射 Cookie

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

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

2 使用 JavaBean 绑定参数

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

// 创建实体类:User
package com.southwind.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private long id;
    private String name;
    private Address address;	// 包含实体类 Address 
}
// 创建实体类:Address
package com.southwind.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address {
    private String value;
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="hello/save" method="post">
        用户id:<input type="text" name="id"/><br/>
        用户名:<input type="text" name="name"/><br/>
        用户地址:<input type="text" name="address.value">
        <input type="submit" value="注册">
    </form>
</body>
</html>
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(User user){
    System.out.println(user);
    return "index";
}

如果出现中文乱码情况,只需在 web.xml 添加 Spring MVC 自带的过滤器即可。

<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>

3 JSP 页面的转发和重定向

Spring MVC 默认是以转发的形式响应。

3.1 转发

@RequestMapping("/forward")
public String forward(){
    return "forward:/index.jsp";
    // 等同于 return "index";
}

浏览器输入:http://localhost:8080/hello/forward

在这里插入图片描述

3.2 重定向

@RequestMapping("/redirect")
public String redirect(){
    return "redirect:/index.jsp";
}

浏览器输入:http://localhost:8080/hello/redirect

在这里插入图片描述

4 Spring MVC 数据绑定

数据绑定:在后端的业务方法中直接获取客户端 HTTP 请求中的参数,将请求参数映射到业务方法的形参中,Spring MVC 中数据绑定的工作是由 HandlerAdapter 来完成。

4.1 基本数据类型

package com.southwind.controller;

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

@Controller
@RequestMapping("/data")
public class DataBindHandler {
    @RequestMapping("/baseType")
    public String baseType(int id){
        return id+"";
    }
}

在这里插入图片描述

package com.southwind.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/data")
public class DataBindHandler {
    @RequestMapping("/baseType")
    @ResponseBody
    public String baseType(int id){
        return id+"";
    }
}

在这里插入图片描述

@ResponseBody 表示 Spring MVC 会直接将业务方法的返回值响应给客户端,如果不加 @ResponseBody 注解, Spring MVC 会将业务方法的放回值传递给 DispatcherService,再由 DispatcherServlet 调用 ViewResolver 对返回值进行解析,映射到一个 JSP 资源。

4.2 包装类

@RequestMapping("/packageType")
@ResponseBody
public String packageType(Integer id){
    return id+"";
}

包装类可以接收 null,当 HTTP 请求没有参数时,使用包装类定义形参的数据类型,程序不会抛出异常。

- Java 有八种基本数据类型:byte、short、int、long、float、double、boolean、char
- Java 提供8种对应的包装类:Byte、Short、Integer、Long、Float、Double、Boolean、Character

@RequestMapping("/packageType")
@ResponseBody
public String packageType(@RequestParam(value = "num",required = false,defaultValue = "0") Integer id){
    return id+"";
}

@RequestParam

  • value = “num”:将 HTTP 请求名为 num 的参数赋给形参 id。
  • required:设置 num 是否为必填项, true 表示必填, false 表示非必填,可省略。
  • defaultValue = “0”:如果 HTTP 请求中没有 num 参数,默认值为 0。

4.3 数组

@RestController
@RequestMapping("/data")
public class DataBindHandler {
    @RequestMapping("/array")
    public String array(String[] name){
        String str = Arrays.toString(name);
        return str;
    }
}
// 等同于
@Controller
@RequestMapping("/data")
public class DataBindHandler {
    @RequestMapping("/array")
    @ResponseBody
    public String array(String[] name){
        String str = Arrays.toString(name);
        return str;
    }
}

在这里插入图片描述

  • @RestController 表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析
  • @Controller 表示该控制器的每一个业务方法的返回值都会交给视图解析器进行解析
  • 如果只需要将数据响应给客户端,而不需要进行视图解析,则需要在对应的业务方法定义处添加 @ResponseBody。

4.4 List

Spring MVC 不支持 List 类型的直接转换,需要对 List 集合进行包装。

① 集合封装类

// UserList.java
package com.southwind.entity;

import lombok.Data;
import java.util.List;

@Data
public class UserList {
    private List<User> users;
}

② JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/data/List" method="post">
        用户1编号:<input type="text" name="users[0].id"><br/>
        用户1名称:<input type="text" name="users[0].name"><br/>
        用户2编号:<input type="text" name="users[1].id"><br/>
        用户2名称:<input type="text" name="users[1].name"><br/>
        用户3编号:<input type="text" name="users[2].id"><br/>
        用户3名称:<input type="text" name="users[2].name"><br/>
        <input type="submit" value="提交">
    </form>
</body>
</html>

③ 业务方法

@RequestMapping("/List")
@ResponseBody
public String List(UserList userList){
    StringBuffer str = new StringBuffer();    // StringBuffer 节省内存,提高效率
    for(User user:userList.getUsers()){
        str.append(user);
    }
    return str.toString();
}

在这里插入图片描述

处理 @ResponseBody 中文乱码问题,在 springmvc.xml 中配置消息转换器。
<mvc:annotation-driven>
    <!-- 消息转换器 -->
    <mvc:message-converters register-defaults="true">
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes" value="text/html;charset=UTF-8"></property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

在这里插入图片描述

4.5 Map

① 自定义封装类

package com.southwind.entity;

import lombok.Data;

import java.util.Map;

@Data
public class UserMap {
    private Map<String, User> users;
}

② 业务方法

@RequestMapping("/map")
public String map(UserMap userMap){
    StringBuffer str = new StringBuffer();
    for(String key:userMap.getUsers().keySet()){    // 一个一个取出 Map 的 Key
        User user = userMap.getUsers().get(key);    // 利用 key 去取 value
        str.append(user);
    }
    return str.toString();
}

③ JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/data/map" method="post">
        用户1编号:<input type="text" name="users['a'].id"><br/>
        用户1名称:<input type="text" name="users['a'].name"><br/>
        用户2编号:<input type="text" name="users['b'].id"><br/>
        用户2名称:<input type="text" name="users['b'].name"><br/>
        用户3编号:<input type="text" name="users['c'].id"><br/>
        用户3名称:<input type="text" name="users['c'].name"><br/>
        <input type="submit" value="提交">
    </form>
</body>
</html>

在这里插入图片描述

4.6 JSON

客户端发送 JSON 格式的数据,直接通过 Spring MVC 绑定到业务方法的形参中。

处理 Spring MVC 无法加载静态资源,在 web.xml 中添加配置即可。

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.js</url-pattern>
</servlet-mapping>

① JSP

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script type="text/javascript" src="js/jquery-3.6.0.js"></script>
    <script type="text/javascript">
        $(function(){
            var user = {
                "id":1,
                "name":"张三",
            };
            $.ajax({
                url:"/data/json",
                data:JSON.stringify(user);
                type:"POST",
                contentType:"application/json;charset=UTF-8",
                dataType:"JSON",
                success:function (data){
                    alert(data.id+"---"+data.name);
                }
            })
        })
    </script>
</head>
<body>

</body>
</html>

② 业务方法

@RequestMapping("/json")
@ResponseBody
public User json(@RequestBody User user){
    System.out.println(user);
    user.setId(6);
    user.setName("张柳");
    return user;
}

Spring MVC 中的 JSON 和 JavaBean 的转换需要借助于 fastjson,pom.xml 引入相关依赖。

<dependency>  <!-- fastjson工具,可以将json转成java对象 -->
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.32</version>
</dependency>

springmvc.xml 添加 fastjson 配置

<mvc:annotation-driven>
        <!-- 消息转换器 -->
    <mvc:message-converters register-defaults="true">
        <!-- 配置fastjson -->
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"></bean>
    </mvc:message-converters>
</mvc:annotation-driven>

在这里插入图片描述

需要添加的jar包:
https://pan.baidu.com/s/1iu4n8is6RUkARjN4wCHw2A 提取码:s8eh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值