当页面数据提交到服务器端,页面提交的任何数据,它都是字符串类型的,可是我们后台的javabean里面的属性,却不都是字符串类型的,这就牵扯到类型转换啦。
SpringMVC内部帮我们进行了类型转换
但是框架帮我们进行的类型转换,是有限制的。比如说 字符串类型 -> 日期类型,SpringMVC内部默认只支持2007/09/03
这种类型格式。但是我们就想用别的格式呢???
这就牵扯到自定义类型转换器
类型转换器
先来看一个小栗子
1、给出实体类User.java
public class User implements Serializable{
private String uname;
private Integer age;
private Date date;
//getset方法
//ToString方法
}
2、给出 Account.java
public class Account implements Serializable{
private String username;
private String password;
private Double money;
private List<User> list;
private Map<String,User> map;
//getset方法
//ToString方法
}
3、给出控制器 ParamController.java
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/saveUser")
public String saveUser(User user){
System.out.println("执行了...");
System.out.println(user);
return "success";
}
}
4、给出 param.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<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" value="提交" />
</form>
</body>
</html>
5、给出springmvc.xml 和 web.xml 以及 success.jsp
运行结果:
可以看出来运行没一点毛病
当换一种格式输入生日时:
控制台都没有打印出来,说明这个方法还没执行呢。它在进行数据封装的时候,在类型转换的时候,出问题啦!!!
上面这个案例在类型转换的时候出错了,那怎么解决呢???SpringMVC框架为我们提供了 可以自定义数据类型的转换器。
自定义类型转换器实现代码的改写
步骤:
1)定义一个类,实现 Converter 接口,该接口有两个泛型。
public interface Converter<S, T> {//S:表示接受的类型,T:表示目标类型
/**
* 实现类型转换的方法
*/
@Nullable
T convert(S source);
}
2)注册类型转换器
具体的代码:
1)给出一个工具类 StringToDateConverter.java 用来把字符串转换日期
public class StringToDateConverter implements Converter<String,Date>{
/**
* String source 传入进来字符串
* @param source
* @return
*/
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("数据类型转换出现错误");
}
}
}
注意:
- 接口Converter 是
org.springframework.core.convert.converter.Converter
包下的,不要导错包。 - DataFormat接口 用来 字符串转日期的
2)在springmvc.xml 中 注册类型转换器
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="utils.StringToDateConverter"/>
</set>
</property>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven conversion-service="conversionService"/>
这次我们自定义的类型转换器,生效了,成功实现了 字符串 到 Date类型 的转换!
获取servlet原生的API
假如我们想在控制器的方法中,想拿到原生的servlet的API,这个该怎么做??
很简单,在控制器里面这样写:
@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";
}