SSM框架之SpringMVC(2)参数绑定及自定义类型转换
SpringMVC(2)参数绑定及自定义类型转换
1、请求参数的绑定
1.1、 请求参数的绑定说明
1.1.1、绑定机制
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
- 要求:提交表单的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、支持的数据类型
- 基本数据类型和字符串类型
- 实体类型(JavaBean)
- 集合数据类型(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)参数绑定及自定义类型转换的更多相关文章
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_1 请求参数绑定入门
请求参数的绑定 参数绑定 创建新的页面 给方法加上注解 前面没有斜线 重新部署项目 传递一个username的值 后台方法接收 重新部署项目 再传一个password的值 再输出password ja ...
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_7 获取Servlet原生的API
控制器里面获取常用的request对象或者Response对象. 想拿到谁, 就在参数上写上谁 再获取servletConetext并输出
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_3 配置解决中文乱码的过滤器
输入中文 中文后台接收到 全部乱码 springMvc提供了过滤器 配置过滤器 characterEncodingFilter是首字母小写当做起的名称.当然这里也可以任意起名字.为了对应所以修改类名首 ...
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_2 请求参数绑定实体类型
参数封装到javaBean对象中 创建新的包domain.在下面新建Account 实现序列化 的接口,定义几个属性 生成get和set.还有toString的方法 表单 重新发布tomcat jav ...
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_6 自定义类型转换器代码编写
mvc是基于组件的方式 类型转换的接口Converter,想实现类型转换,必须实现这个接口 Ctrl+N搜索 converter 这是一个接口类 它有很多的实现类.S是字符串.后面T是指要转换类型 新 ...
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_5 自定义类型转换器演示异常
后端自动进行类型的转换.前端输入的年龄都是字符串的形式传递到后端. user的实体类 加一个Date日期类型格式的字段.生成get和set还有toString的方法 重新部署程序 日期用横线的方式 ...
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_4 请求参数绑定集合类型
jabaBean里面有集合的情况 把account里面的user对象先注释掉.get和set都注释掉.然后toString方法需要重写 List和Map这两种对象.生成get和set方法 toStri ...
- 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器
springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...
- springmvc(三) 参数绑定、
前面两章就介绍了什么是springmvc,springmvc的框架原理,并且会简单的使用springmvc以及ssm的整合,从这一章节来看,就开始讲解springmvc的各种功能实现,慢慢消化 --W ...
随机推荐
- Python基础-day02-2
运算符 目标 算数运算符 比较(关系)运算符 逻辑运算符 赋值运算符 运算符的优先级 数学符号表链接:https://zh.wikipedia.org/wiki/数学符号表 01. 算数运算符 是完成 ...
- d3.js 入门指南
说到数据可视化,我们会行到很多优秀的框架,像echarts.highcharts,这些框架很优雅,健壮,能满足我们对可视化的大部分需求,但是缺点也很明显,就是这些框架几乎是不可定制化的,当遇到特殊的需 ...
- springmvc: No converter found for return value of type
刚开始学习springmvc的童鞋,相信很多都需要过这种情况,报错信息如下 org.springframework.http.converter.HttpMessageNotWritableExcep ...
- Linux文本处理三剑客之sed
推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...
- Vim 基本的使用
三种模式 按 ESC 进入命令模式 命令模式下输入 Shift + : 进入末行模式 命令模式下输入插入命令,如(i,a,o) 进入输入模式 进入 vim 文件名 vim直接编辑一个文件,如果是已经存 ...
- Linux 按 Ctrl + S 卡死的解决办法
ctrl + s 的作用是暂停屏幕输出 ctrl + q 恢复屏幕输出即可 恢复之后会出现在暂停期间输入的字符
- 2.Redux学习2----redux-thunk
UI组件:只展示UI,不处理业务逻辑,又称傻瓜组件,因为只需要展示UI,没有状态,我们通常用函数组件(无状态组件)作为UI组件 容器父组件:只处理业务逻辑,不展示UI,又称聪明组件 redux-thu ...
- SpringBoot系列-整合Mybatis(注解方式)
目录 一.常用注解说明 二.实战 三.测试 四.注意事项 上一篇文章<SpringBoot系列-整合Mybatis(XML配置方式)>介绍了XML配置方式整合的过程,本文介绍下Spring ...
- CSS transition 的默认值
语法 transition: property duration timing-function delay|initial|inherit; 示例: div { width: 100px; ...
- ServerSocket类的常用方法
1.accept:侦听并接受此套接字的连接:此方法在连接传入之前一直阻塞. 2.setSoTimeout(timeout)方法的作用时设置超时时间,通过指定超时timeout值启用/禁用超时功能,以m ...