Spring MVC数据绑定的几种方法(一)

这篇文章包含spring mvc的默认数据类型绑定和简单数据类型绑定。内容来自实验。


准备:

(1)在IDEA环境中从archetye创建webapp类型的maven项目exp6。

(2)在src\main目录下创建并标注java源代码文件夹和resources资源文件夹。

(3)在pom.xml文件中,添加Spring MVC的相关依赖。

XML 复制代码
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.2.8.RELEASE</version>
    </dependency>

(4)在resources文件夹下创建配置文件spring-mvc.xml并完成相关配置。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
      https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 配置创建 springMVC 容器要扫描的包  -->
    <context:component-scan base-package="com.itheima.controller"></context:component-scan>
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

(5)配置web.xml文件。

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置初始化参数,读取Spring MVC的配置文件 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

(6)配置Maven启动项。在pom.xml文件中引入tomcat插件:

XML 复制代码
<plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <port>8080</port>
            <path>/exp6</path>
          </configuration>
      </plugin>

添加Maven启动项,使用命令tomcat7:run启动应用程序。

项目目录结构如下:


数据绑定:

1.默认数据类型绑定

在src\main\java文件夹下创建com.itheima.controller的类包,在类包中创建UserController类,在UserController类中定义方法getUserId( ),用于获取客户端请求中userid参数的值。

java 复制代码
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class UserController {
    	@RequestMapping("/getUserId")
    	public void getUserId(HttpServletRequest request){
        	String userid= request.getParameter("userid");
        	System.out.println("userid="+userid);
    	}
}

启动项目后,访问地址http://localhost:8080/exp6/getUserId?userid=2,控制台打印userid信息如下:

2.简单数据类型绑定

(1)在UserController类中新增getUserNameAndId( )方法,用来接收客户端请求中的用户名和id参数。

java 复制代码
@RequestMapping("/getUserNameAndId")
    public void getUserNameAndId(String username,Integer id) {
        System.out.println("username="+username+", id="+id);
    }

访问地址http://localhost:8080/exp6/getUserNameAndId?username=Spring\&id=1,运行结果如下:

(2)@RequestParam注解来定义参数的别名,完成请求参数名称和处理器的形参名称不一致时的数据绑定。在UserController类中新增getUserName ( )方法,给username形参定义了别名name,同时设定了请求的name参数不是必须的,访问没携带name参数时会将defaultValue属性设定的值赋给形参username。

java 复制代码
@RequestMapping("/getUserName")
    public void getUserName(@RequestParam(value="name", required = false,defaultValue = "itheima") String username){
        System.out.println("username="+username);
    }

访问http://localhost:8080/exp6/getUserName?name=Spring,运行结果如下:

(3)使用@PathVariable注解将URL中占位符参数绑定到处理器的形参中。在UserController类中新增getPathVariable( )方法, value属性将占位符参数"name"和处理方法的参数username进行绑定。

java 复制代码
@RequestMapping("/user/{name}")
    public void getPathVariable(@PathVariable(value = "name") String username){
        System.out.println("username="+username);
    }

(4)POJO绑定:POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中,然后在方法中直接使用该POJO作为形参来完成数据绑定。

在src\main\java目录下,创建一个com.itheima.pojo包,在该包下创建一个User类封装用户信息。

java 复制代码
public class User {
    private String username;		//用户名
    private String password;		//用户密码
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

在UserController.java类中,定义registerUser( )方法用于接收用户注册信息。

java 复制代码
// 接收表单用户信息
    @RequestMapping("/registerUser")
    public void registerUser(User user) {
        String username = user.getUsername();
        String password = user.getPassword();
        System.out.println("username="+username+",password="+password);
    }

在src\main\webapp目录下,创建register.jsp文件,编写用户注册表单。

html 复制代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
    	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    	<title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/registerUser" method="post">
    	用户名:<input type="text" name="username" /><br />
    	密&nbsp;&nbsp;&nbsp;码:<input type="password" name="password" /><br />
    	<input type="submit" value="注册"/>
</form>
</body>
</html>

启动后访问地址http://localhost:8080/exp6/register.jsp,结果如下:

分别填写注册的用户名和密码,点击"注册"按钮完成数据的提交,控制台打印信息:

注:输入的用户名为中文时,控制台打印信息可能会出现乱码,可以使用Spring提供的编码过滤器来统一编码,只需要在web.xml中添加如下代码:

XML 复制代码
<filter>
    <filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

(5)自定义类型转换器:Spring MVC默认提供了一些常用的类型转换器,然而默认类型转换器并不能将提交的参数转换为所有的类型。此时需要开发者自定义类型转换器,来将参数转换为程序所需要的类型。

①下面演示自定义类型转换器转换特殊数据类型并完成数据绑定,实现Date类型的数据绑定。

在项目src\main\java目录下,创建一个com.itheima.convert包,在该包下创建日期转换类DateConverter,并在DateConverter类中定义convert()方法, 实现String类型转到Date类型的转换。

java 复制代码
import org.springframework.core.convert.converter.Converter;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateConverter implements Converter<String, Date> {
    private String datePattern = "yyyy-MM-dd";//定义日期格式
    @Override
    public Date convert(String source) {
        SimpleDateFormat sdf = new SimpleDateFormat(datePattern);
        try {
            return sdf.parse(source);
        } catch (Exception e) {
            throw new IllegalArgumentException("无效的日期格式,请使用这种格式:"+datePattern);}
    }
}

还需要在配置文件spring-mvc.xml中配置类型转换器。

XML 复制代码
<!-- 配置类型转换器工厂 -->
    <bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <!-- 给工厂注入一个新的类型转换器,配置自定义类型转换器 -->
    <property name="converters">
        <array><bean class="com.itheima.convert.DateConverter"/></array>
    </property>
    </bean>
    <mvc:annotation-driven conversion-service="converterService"/>

在UserController.java类中定义方法getBirthday(),用于绑定客户端请求中的日期数据。

java 复制代码
/**
     * 使用自定义类型数据绑定日期数据
     */
    @RequestMapping("/getBirthday")
    public void getBirthday(Date birthday) {
        System.out.println("birthday="+birthday);
    }

启动后访问地址http://localhost:8080/exp6/getBirthday?birthday=2020-11-11,控制台打印信息:

②上述方法中日期类型的格式转换是基于XML配置自定义转换器实现的。除了XML方式之外,还可以通过@DateTimeFormat注解来简化日期类型的格式转换,无需自定义转换器,也无需在配置文件中定义转换器工厂或格式化工厂。

将上述在spring-mvc.xml中配置的转换器工厂和自定义类型转换器都删除,由于注解方式的类型转换依赖注解驱动的支持,配置文件中必须显式定义<mvc:annotation-driven>元素,此时spring-mvc.xml中的代码如下:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!-- 配置创建 springMVC 容器要扫描的包  -->
    <context:component-scan base-package="com.itheima.controller"></context:component-scan>
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!-- 配置注解驱动 -->
    <mvc:annotation-driven />
</beans>

修改UserController.java类中getBirthday()方法,修改后的具体代码如下。

java 复制代码
/**
     * 使用@DateTimeFormat注解绑定日期数据
     */
    @RequestMapping("/getBirthday")
    public void getBirthday(@DateTimeFormat(pattern = "yyyy-MM-dd")Date birthday) {
        System.out.println("birthday="+birthday);
    }

启动项目,访问http://localhost:8080/exp6/getBirthday?birthday=2020-11-11,控制台打印信息:


复杂数据类型绑定下次再写。


加油加油^_^

相关推荐
方圆想当图灵10 分钟前
缓存之美:万文详解 Caffeine 实现原理(下)
java·redis·缓存
栗豆包24 分钟前
w175基于springboot的图书管理系统的设计与实现
java·spring boot·后端·spring·tomcat
等一场春雨1 小时前
Java设计模式 十四 行为型模式 (Behavioral Patterns)
java·开发语言·设计模式
萧若岚1 小时前
Elixir语言的Web开发
开发语言·后端·golang
Channing Lewis1 小时前
flask实现重启后需要重新输入用户名而避免浏览器使用之前已经记录的用户名
后端·python·flask
Channing Lewis1 小时前
如何在 Flask 中实现用户认证?
后端·python·flask
酱学编程2 小时前
java中的单元测试的使用以及原理
java·单元测试·log4j
我的运维人生2 小时前
Java并发编程深度解析:从理论到实践
java·开发语言·python·运维开发·技术共享
一只爱吃“兔子”的“胡萝卜”2 小时前
2.Spring-AOP
java·后端·spring
HappyAcmen2 小时前
Java中List集合的面试试题及答案解析
java·面试·list