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 ...
随机推荐
- 955 不加班的公司名单:955.WLB
前两天说到,韩老师的 Github 总 star 数量超过了 20000!全球排名第 232! 他,TypeScript GitHub Star 上海第一,全国第四!GitHub 总标星超两万! 其实 ...
- python内置模块-datetime
摘录 廖雪峰网站 datetime是python内置的处理日期和时间的标准库 获取当前日期和时间 >>> from datetime import datetime >> ...
- java对象的实例化过程
简单类对象的实例化过程 1.在方法区加载类: 2.在栈内存申请空间,声明变量P: 3.在堆内存中开辟空间,分配对象地址: 4.在对象空间中,对对象的属性进行默认初始化,类成员变量显示初始化: 5.构造 ...
- Python 使用中出现错误:ImportError: No module named _sqlite3
解决办法: 1.先安装sqlite3 从sqlite官网:https://www.sqlite.org/download.html 上下载linux环境下的安装包:sqlite-autoconf ...
- NPOI 工作簿一般设置
HSSFWorkbook workbook = new HSSFWorkbook(); //声明一个空白的工作簿,也可以将已有文件转化为文件流作为参数声明一个工作簿,这样这个工作簿里就会有已有文件中的 ...
- 学习SQL注入---1
开始接触SQL注入了,最开始根据网上的思路做了两道注入的题,但对于SQL注入如何实现,怎么一个流程还是不理解.后来,在网上查找了很多资料,现在一点点去理解. 1.利用sqlmap注入的时候,不是所有页 ...
- c++11多线程笔记
1 thread类thread f;线程等待join()线程分离detach() thread类不可拷贝复制 std::this_thread::yield(); 2 bind 与lambda表达式 ...
- vue项目 npm run dev在Linux 持久运行
touch run.dev.logchmod u+w run.dev.log 记录日志文件 nohup npm run dev > run.dev.log 2>run.dev.log &a ...
- 一文读懂AOE到底是什么!
一.背景 1.1 AoE是什么 AoE (AI on Edge) 是一个滴滴开源的终端侧AI集成运行时环境(IRE).以 “稳定性.易用性.安全性” 为设计原则,帮助开发者将不同框架的深度学习算法轻松 ...
- 腾讯云大学 x CODING | 当 DevOps 邂逅云原生
2019 年经济减速的阴云笼罩了所有行业,势如破竹的发展势头被打破,小微创新型企业生存艰难.越来越多的企业更加关注客户和业务之间的交付价值,精益化公司运营,降低成本,驱动业务发展.是否要拥抱云原生?开 ...