数据转换
1、自己写的转换类 StringToUserConverter.java
import org.springframework.core.convert.converter.Converter;
// 将请求参数字符串直接转化为自己写的User对象,比如 userName:password:realName形式的字符串
public class StringToUserConverter implements Converter<String, User>{
@Override
public User convert(String source) {
// TODO Auto-generated method stub
User user = new User();
if(source != null){
String[] items = source.split(":");
user.setUserName(items[0]);
user.setPassword(items[1]);
user.setRealName(items[2]);
}
return user;
}
}
2、在Controller 类的配置文件baobaotao-servlet.xml中添加数据转换的bean
<!-- 装配自定义的ConversionService -->
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 自己写的字符串转User类的转换器 -->
<bean class="com.domain.StringToUserConverter"></bean>
</list>
</property>
</bean>
3、UserController.java中某个方法
@RequestMapping(value="/handle81")
public String handle81(@RequestParam("user") User user ,ModelMap modelMap){
modelMap.put("user", user);
return "/user/showUser";
}
4、showUser.jsp
<head>
<title>用户信息</title>
</head>
<body>
当前用户是${user.userName}
</body>
5、测试
在浏览器输入http://localhost:8080/easy_springmvc_test/user/handle81.html?user=tom:1234:tomason 验证结果
6、分析
浏览器地址中给了user信息,但是是字符串形式,在访问handle81方法时,由数据转换器自动把String转换成了User,从而传给了handle81的参数,再由modelMap把user信息传出来,jsp页面可以接收到。
数据格式化
spring3.0引入的格式化框架,位于org.springframework.format包中
例:
1、还是上面自己的StringToUserConverter.java
2、在Controller的配置文件 baobaotao-servlet.xml中加上:
<!-- 加上格式化bean:FormattingConversionServiceFactoryBean -->
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 自己写的字符串转User类的转换器 -->
<bean class="com.domain.StringToUserConverter"></bean>
</list>
</property>
</bean>
3、实体类User.java中的注解驱动格式化
// 其中的两行@DateTimeFormat(pattern="yyyy-MM-dd")和@NumberFormat(pattern="#,###.##")就是注解驱动格式化
@XStreamAsAttribute
@Past
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date birthday;
@XStreamAsAttribute
@DecimalMin(value="1000.00")
@DecimalMax(value="100000.00")
@NumberFormat(pattern="#,###.##")
private long salary;
4、UserController.java中加方法
@RequestMapping(value = "/handle82")
public String handle82(User user) {
return "/user/showUser";
}
5、测试UserControllerTest.java
@Test
public void testhandle82() {
RestTemplate restTemplate = new RestTemplate();
MultiValueMap<String, String> form = new LinkedMultiValueMap<String, String>();
form.add("userName", "tom");
form.add("password", "123456");
form.add("birthday", "1980-01-01");
form.add("salary", "4,500.00");
String html = restTemplate.postForObject(
"http://localhost:8080/easy_springmvc_test/user/handle82.html",form,String.class);
Assert.assertNotNull(html);
System.out.println(html);
}
6、结果及分析
测试里最终的html得到的是user/showUser.jsp的页面代码
测试方法里的数据form传递给了handle82方法的参数user
使用@InitBinder和WebBindingInitializer装配自定义编辑器
首先是com.domain/UserEditor.java
import java.beans.PropertyEditorSupport;
// 自定义编辑器
public class UserEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
User user = new User();
if (text != null) {
String[] items = text.split(":");
user.setUserName(items[0]+"by propertyeEditor");
user.setPassword(items[1]);
user.setRealName(items[2]);
}
setValue(user);
}
}
法1:在控制器UserController.java中添加自定义编辑器
// 在控制器初始化时调用
@InitBinder
public void initBinder(WebDataBinder binder) {
// 注册指定自定义的编辑器
binder.registerCustomEditor(User.class, new UserEditor());
}
法2:使用WebBindingInitializer装配全局范围使用的编辑器
com.web/MyBindingInitializer.java
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.WebRequest;
import com.domain.User;
import com.domain.UserEditor;
public class MyBindingInitializer implements WebBindingInitializer{
public void initBinder(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(User.class, new UserEditor());
}
}
再在baobaotao-servlet.xml中配置
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"
p:messageConverters-ref="messageConverters">
<property name="webBindingInitializer">
<bean class="com.web.MyBindingInitializer" />
</property>
</bean>