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. CefSharp禁止弹出新窗体,在同一窗口打开链接,或者在新Tab页打开链接,并且支持带type="POST" target="_blank"的链接

    说明:在同一窗口打开链接,只要稍加改造就可以实现,这里实现的是在新Tab页打开链接,并且支持带type="POST" target="_blank"的链接 gi ...

  2. Gradle Java 插件

    Java 插件是构建 JVM 项目的基础,它为项目增加了很多能力,例如编译,测试,打包,发布等等. 很多插件都是基于 Java 插件实现的,例如 Android 插件. 用法 使用 id 应用插件 p ...

  3. <深度学习>Tensorflow遇到的坑之一

    AttributeError: module 'tensorflow' has no attribute 'random_normal' AttributeError: module 'tensorf ...

  4. Eclipse——关联源代码

    Eclipse——关联源代码 摘要:本文主要说明了如何在Eclipse里关联源代码. 下载源码包 首先去想要关联的jar包的官网下载对应jar包的源代码,拿Tomcat的类库举例,先去官网下载源码包: ...

  5. Netty如何监控内存泄露

    目录 Netty如何监控内存泄露 前言 JDK的弱引用和引用队列 Netty的实现思路 代码实现 分配监控对象 追踪和检查泄露 Netty如何监控内存泄露 前言 一般而言,在Netty程序中都会采用池 ...

  6. mysql事务隔离级别、脏读、幻读

    Mysql事务隔离级别本身很重要,再加上可能是因为各大公司面试必问的缘故,在博客中出现的概率非常高,但不幸的是,中国的技术博客要么是转载,要么是照抄,质量参差不齐,好多结论都是错的,对于心怀好奇之心想 ...

  7. Cortex-M7,A8,A9,A15与ADI的BlackFin以及SHARC的DSP性能PK

    说明:1.通过此贴让我们对M4和M7的DSP性能有个全面的认识.2.测试数据来源于DSP Concepts,对于这家公司的名字,大家可能比较陌生.我们现在用的CMSIS-DSP软件就是由ARM委托这家 ...

  8. Vue---记一次通过{{}}获取json数据-页面渲染不出来的坑

    前两天干活儿的时候碰到一个Vue的问题,让我这个菜鸡完全摸不到头脑,需求如下:前端页面点击表格中的某一行的详情按钮,会弹出一个Dialog,然后Dialog中有选项卡,选项卡中再有具体的table来展 ...

  9. mysql-5.7.27安装

    1,下载5.7.27安装包   百度网盘   (注:5.7.27要安装net faframework4.5.2) 2,创建my.ini及data文件 下载5.7.27后解压,在创建my.ini文件及d ...

  10. js 淡入淡出的tab选项卡

    代码如下 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...