SpringMVC(2)参数绑定及自定义类型转换

1、请求参数的绑定

1.1、 请求参数的绑定说明

1.1.1、绑定机制

  1. 表单提交的数据都是k=v格式的 username=haha&password=123
  2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
  3. 要求:提交表单的name和参数的名称是相同的

例子:

请求的html

<a href="param/testParam?username=wf&password=123">参数绑定</a>

对应方法

@RequestMapping("/testParam")
public String testParam(String username,String password){
System.out.println("请求成功....");
System.out.println("username = " + username + ",password = " + password);
return "success";
}

1.1.2、支持的数据类型

  1. 基本数据类型和字符串类型
  2. 实体类型(JavaBean)
  3. 集合数据类型(List、map集合等)

SpringMVC 绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。

1.1.3、使用要求

如果是基本类型或者 String 类型:

要求我们的参数名称必须和控制器中方法的形参名称保持一致。 (严格区分大小写)

如果是 POJO 类型,或者它的关联对象:

要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。

如果是集合类型,有两种方式

第一种:

要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。

给 List 集合中的元素赋值, 使用下标。

给 Map 集合中的元素赋值, 使用键值对。

第二种:

接收的请求参数是 json 格式数据。需要借助一个注解实现

1.2、参数绑定示例

1.2.1、对基本类型的绑定

请求的html

<a href="param/testParam?username=wf&password=123">参数绑定</a>

对应方法

@RequestMapping("/testParam")
public String testParam(String username,String password){
System.out.println("请求成功....");
System.out.println("username = " + username + ",password = " + password);
return "success";
}

1.2.2、对实体类型的绑定(pojo)

实体类:

public class Account implements Serializable {
private String username;
private String password;
private Double money;
/*getting和setting*/
}

请求的html

<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br>
密码:<input type="text" name="password"/><br>
金额:<input type="text" name="money"/><br>
<input type="submit" name="提交">
</form>

接收请求的方法

@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("请求成功....");
System.out.println(account);
return "success";
}

1.2.3、对实体类型中包含集合类型的绑定(pojo)

实体类:

public class Account implements Serializable {
private String username;
private String password;
private Double money; private List<User> list;
private Map<String,User> map;
/*getting和setting*/
} public class User implements Serializable {
private String uname;
private Integer age;
/*getting和setting*/
}

请求的html

<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br>
密码:<input type="text" name="password"/><br>
金额:<input type="text" name="money"/><br> 用户姓名:<input type="text" name="list[0].uname"/><br>
用户年龄:<input type="text" name="list[0].age"/><br> 用户姓名:<input type="text" name="map['1'].uname"/><br>
用户年龄:<input type="text" name="map['1'].age"/><br>
<input type="submit" name="提交">
</form>

接收请求的方法

@RequestMapping("/saveAccount")
public String saveAccount(Account account){
System.out.println("请求成功....");
System.out.println(account);
return "success";
}

1.3、自定义类型转换器

注意:

它还可以实现一些数据类型自动转换。 内置转换器全都在:

org.springframework.core.convert.support 包下。 有:

java.lang.Boolean -> java.lang.String : ObjectToStringConverter

java.lang.Character -> java.lang.Number : CharacterToNumberFactory

java.lang.Character -> java.lang.String : ObjectToStringConverter

java.lang.Enum -> java.lang.String : EnumToStringConverter

java.lang.Number -> java.lang.Character : NumberToCharacterConverter

java.lang.Number -> java.lang.Number : NumberToNumberConverterFactory

java.lang.Number -> java.lang.String : ObjectToStringConverter

java.lang.String -> java.lang.Boolean : StringToBooleanConverter

java.lang.String -> java.lang.Character : StringToCharacterConverter

java.lang.String -> java.lang.Enum : StringToEnumConverterFactory

java.lang.String -> java.lang.Number : StringToNumberConverterFactory

java.lang.String -> java.util.Locale : StringToLocaleConverter

java.lang.String -> java.util.Properties : StringToPropertiesConverter

java.lang.String -> java.util.UUID : StringToUUIDConverter

java.util.Locale -> java.lang.String : ObjectToStringConverter

java.util.Properties -> java.lang.String : PropertiesToStringConverter

java.util.UUID -> java.lang.String : ObjectToStringConverter



如遇特殊类型转换要求,需要我们自己编写自定义类型转换器

mvc中的类型转换的内部转换器可以实现1999/11/11的字符串转为日期类型,但是如果1999-11-11字符串那么就不能被自动转换,需要我们自定义类型转换器。

实现步骤

1、定义类实现Converter接口,并在其中必须类型转换的方法

import org.springframework.core.convert.converter.Converter;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* 字符串转日期
*/
public class StringToDateConverter implements Converter<String , Date> { /**
*
* @param source 传入的字符串
* @return 转换后的日期类型
*/
@Override
public Date convert(String source) {
if (source == null){
throw new RuntimeException("请传入数据");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
return df.parse(source);
} catch (Exception e) {
throw new RuntimeException("数据转换异常");
}
}
}

2、在配置文件中开启对自定义类型转换器的支持

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="wf"></context:component-scan> <!--配置视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean> <!--自定义类型转换器-->
<bean id="conversionService2" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="wf.untils.StringToDateConverter"></bean>
</set>
</property>
</bean> <!--开启springMVC框架注解的支持-->
<!--conversion-service属性表示把自定义的类型转换器添加到环境中-->
<mvc:annotation-driven conversion-service="conversionService2"></mvc:annotation-driven> </beans>

3、测试

使用的实体类

import java.io.Serializable;
import java.util.Date; public class User implements Serializable {
private String uname;
private Integer age;
private Date date;
}

定义html测试表单

<form action="param/saveUser" method="post">
用户姓名:<input type="text" name="uname"/><br>
用户年龄:<input type="text" name="age"/><br>
用户生日:<input type="text" name="date"/><br> <input type="submit" name="提交">
</form>

2、请求参数乱码问题

2.1、post 请求方式

在 web.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>
<!-- 启动过滤器 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- 过滤所有请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>

在 springmvc 的配置文件中可以配置,静态资源不过滤:

<!-- location 表示路径, mapping 表示文件, **表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>

2.2、get 请求方式:

tomacat 对 GET 和 POST 请求处理方式是不同的, GET 请求的编码问题, 要改 tomcat 的 server.xml配置文件,如下 :

<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>

改为:

<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true"/>

如果遇到 ajax 请求仍然乱码,请把:

useBodyEncodingForURI="true"改为 URIEncoding=“UTF-8”

即可

3、获取servlet原生api

SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:

HttpServletRequest

HttpServletResponse

HttpSession

java.security.Principal

Locale

InputStream

OutputStream

Reader

Writer

我们可以把上述对象,直接写在控制的方法参数中使用。

测试用例:

<a href="param/testServlet">Servlet原生api</a>
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response){
System.out.println("请求成功....");
System.out.println(request);
HttpSession session = request.getSession();
System.out.println(session);
ServletContext servletContext = session.getServletContext();
System.out.println(servletContext);
System.out.println(response);
return "success";
}

SSM框架之SpringMVC(2)参数绑定及自定义类型转换的更多相关文章

  1. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_1 请求参数绑定入门

    请求参数的绑定 参数绑定 创建新的页面 给方法加上注解 前面没有斜线 重新部署项目 传递一个username的值 后台方法接收 重新部署项目 再传一个password的值 再输出password ja ...

  2. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_7 获取Servlet原生的API

    控制器里面获取常用的request对象或者Response对象. 想拿到谁, 就在参数上写上谁 再获取servletConetext并输出

  3. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_3 配置解决中文乱码的过滤器

    输入中文 中文后台接收到 全部乱码 springMvc提供了过滤器 配置过滤器 characterEncodingFilter是首字母小写当做起的名称.当然这里也可以任意起名字.为了对应所以修改类名首 ...

  4. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_2 请求参数绑定实体类型

    参数封装到javaBean对象中 创建新的包domain.在下面新建Account 实现序列化 的接口,定义几个属性 生成get和set.还有toString的方法 表单 重新发布tomcat jav ...

  5. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_6 自定义类型转换器代码编写

    mvc是基于组件的方式 类型转换的接口Converter,想实现类型转换,必须实现这个接口 Ctrl+N搜索 converter 这是一个接口类 它有很多的实现类.S是字符串.后面T是指要转换类型 新 ...

  6. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_5 自定义类型转换器演示异常

    后端自动进行类型的转换.前端输入的年龄都是字符串的形式传递到后端. user的实体类  加一个Date日期类型格式的字段.生成get和set还有toString的方法 重新部署程序 日期用横线的方式 ...

  7. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_4 请求参数绑定集合类型

    jabaBean里面有集合的情况 把account里面的user对象先注释掉.get和set都注释掉.然后toString方法需要重写 List和Map这两种对象.生成get和set方法 toStri ...

  8. 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器

    springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...

  9. springmvc(三) 参数绑定、

    前面两章就介绍了什么是springmvc,springmvc的框架原理,并且会简单的使用springmvc以及ssm的整合,从这一章节来看,就开始讲解springmvc的各种功能实现,慢慢消化 --W ...

随机推荐

  1. linux系统centos7安装最新版本nginx

    一.准备环境 1.安装centos,一般买一个阿里云测试 2.下载nginx,链接http://nginx.org/download/nginx-1.10.2.tar.gz 二.开始安装 1.cent ...

  2. div拖拽效果 JQuery

    <!DOCTYPE html> <html> <head> <meta name="description" content=" ...

  3. kotlin之变量的可空与非空

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/218 kotlin之变量的可空与非空 上面一篇文章,介绍了 ...

  4. Spring Cloud Config实现集群配置中心

    Spring Cloud Config为分布式系统提供了配置服务器和配置客户端,可以管理集群中的配置文件.使用Git.SVN等版本管理系统存放配置文件,配置服务器会到版本管理系统获取配置,集群中的配置 ...

  5. Springboot整合redis步骤

    一.加入依赖 <dependency> <groupId>com.github.spt-oss</groupId> <artifactId>spring ...

  6. linux globbing文件名通配

    globbing:文件名通配 元字符: *:匹配任意长度的任意字符 ?:匹配任意单个字符 []:匹配指定范围内的任意单个字符 [a-z]或者[A-Z]或者[[:alpha:]]:匹配任意一个字母 [[ ...

  7. python字符串与字典转换

    经常会遇到字典样式字符串的处理,这里做一下记录. load load针对的是文件,即将文件内的json内容转换为dict import json test_json = json.load(open( ...

  8. 数据安全管理:RSA加密算法,签名验签流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.RSA算法简介 1.加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用.可以在不直接传递密钥的情况下,完成加 ...

  9. 精通awk系列(4):awk用法入门

    回到: Linux系列文章 Shell系列文章 Awk系列文章 awk用法入门 awk 'awk_program' a.txt awk示例: # 输出a.txt中的每一行 awk '{print $0 ...

  10. Apply Grouping to List View Data 将分组应用于列表视图数据

    This lesson will teach you how to apply grouping to List View data. For this purpose, you will group ...