springmvc 09 類型轉(zhuǎn)換與格式化

  • ConversionService是Spring類型轉(zhuǎn)換體系核心借口。
  • 可以利用ConversionserviceFactoryBean在Spring的容器中定義一個ConversionService。Spring將自動識別出IOC容器中的ConversionService,并在Bean屬性配置及SpringMVC處理方法入?yún)⒔壎ǖ葓龊鲜褂盟M行數(shù)據(jù)的轉(zhuǎn)換
  • 可通過ConversionServiceFactoryBean的converters屬性注冊自定義的類型轉(zhuǎn)換器

自定義類型轉(zhuǎn)換器
如果我們想通過一個字符串轉(zhuǎn)換為一個對象類型如

Bruce-1137@qq.com-0-101 -->
Employee

1. 前端頁面

    <form action="${pageContext.request.contextPath}/testConversionServiceConverter" method="post">
        <input type="text" name="employee"/>
        <button type="submit">提交</button>
    </form>

2. 處理器

@Controller
public class TestHandler {
    @Autowired
    private EmployeeDao employeeDao;
    
    @RequestMapping("/testConversionServiceConverter")
    public String testConverter(@RequestParam("employee") Employee employee){
        System.out.println("進來了"+employee);
        employeeDao.save(employee);
        return "redirect:/list";
    }
}

3. 自定義轉(zhuǎn)換器

@Component //實現(xiàn)接口:org.springframework.core.convert.converter.Converter;
public class EmployeeConverter implements Converter<String,Employee> {

//  employeeBruce-1137@qq.com-0-101
    @Override
    public Employee convert(String source) {
        if (source!=null){
            String[] vals = source.split("-");
            if (vals!=null && vals.length==4){
                Employee employee = new Employee();
                employee.setEmpName(vals[0]);
                employee.setEmpEmail(vals[1]);
                employee.setEmpGender(Integer.parseInt(vals[2]));
                employee.setDepartment(new Department(Integer.parseInt(vals[3])));
                return employee;
            }
        }
        return null;
    }
}

4. springmvc.xml配置

      <!--1. 配置mvc標簽的annotation-driven
      2. 配置ConversionService
      -->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

    <!-- 配置ConversionService -->
    <bean id="conversionService" 
    class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="employeeConverter"/>
            </set>
        </property>
    </bean>

數(shù)值類型轉(zhuǎn)換/日期類型格式化
前端表單

birth:<form:input path="empBirth"/><br>
salary:<form:input path="empSalary"/><br>

對應屬性

    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date empBirth;
    
    @NumberFormat(pattern="#,##,###.#")//#代表一個數(shù)字,‘,’會被忽略,‘.’不會
    private Float empSalary;

springmvc.xml配置<mvc:annotation-driven >

<mvc:annotation-driven />

補充:
我們知道

<mvc:annotation-driven />

默認創(chuàng)建的conversionService實例為FormattingConversionServiceFactoryBean,且該bean內(nèi)部已經(jīng)注冊了

  • NumberFormatAnnotationFormatterFactory //Number類型轉(zhuǎn)換
  • JodaDateTimeFormatAnnotationFormatterFactory //Date日期格式化
    如果我們既要自定義類型轉(zhuǎn)換器,又要實現(xiàn)日期的格式化的話,那么便會沖突,因為
    <mvc:annotation-driven conversion-service="conversionService"/>

    <bean id="conversionService" 
    class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="employeeConverter"/>
            </set>
        </property>
    </bean>

該conversionService對應是ConversionServiceFactoryBean,該Bean沒有日期格式化和類型轉(zhuǎn)換的能力;于是我們可以把該bean換成FormattingConversionServiceFactoryBean,這樣魚和熊掌就可以兼得了

    <mvc:annotation-driven conversion-service="conversionService"/>

    <!-- 配置ConversionService -->
    <bean id="conversionService" 
    class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <ref bean="employeeConverter"/>
            </set>
        </property>
    </bean>

數(shù)據(jù)綁定出錯,日期格式化出錯提示
當我們綁定的數(shù)據(jù)出錯,類型不配置,參數(shù)對不上;或日期格式化出錯時,怎么才能得到錯誤信息呢?
只要在處理方法上加上出錯參數(shù)就可以了

    /**添加Employee*/
    @RequestMapping(value="/emp",method=RequestMethod.POST)
    public String save(Employee employee,BindingResult result){     
        if (result.getFieldErrorCount()>0){
            for (FieldError error:result.getFieldErrors()){
                System.out.println(error.getField()+":"+error.getDefaultMessage());
            }
            return "redirect:list";
        }
        employeeDao.save(employee);
        return "redirect:list";
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容