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,控制台打印信息:


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


加油加油^_^

相关推荐
向前看-2 小时前
验证码机制
前端·后端
xlsw_2 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹2 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭3 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫3 小时前
泛型(2)
java
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石3 小时前
12/21java基础
java
李小白664 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp4 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea