15.4 处理方法的数据绑定

数据转换

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值