15.4 处理方法的数据绑定

来源:互联网 发布:js 严格模式 编辑:程序博客网 时间:2024/05/18 15:26

数据转换

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
原创粉丝点击