SpringMVC(8)——格式化转换器Formatter

目录

概述

内置的格式化转换器

自定义格式化转换器

创建实体类

创建控制器类

创建自定义格式化转换器类

注册格式化转换器

其他JSP页面

运行效果


概述

SpringMVC框架的Formatter<T>与Converter<S,T>一样,也是一个可以将一种数据类型转换成另一种数据类型的接口。不同的是,Formatter<T>的源数据类型必须是String类型,而Converter<S,T>的源数据类型是任意数据类型。

在Web应用中由HTTP发送的请求数据到控制器中都是以String类型获取,因此在Web应用中选择Formatter<T>比选择Converter<S,T>更加合理。

内置的格式化转换器

内置的格式化转换器
格式化转换器描述
NumberFormatter实现Number与String之间的解析与格式化。
CurrencyFormatter实现Number与String之间的解析与格式化(带货币符号)。
PercentFormatter实现Number与String之间的解析与格式化(带百分数符号)。
DateFormatter实现Date与String之间的解析与格式化。

自定义格式化转换器

自定义格式化转换器就是编写一个实现Formatter<T>接口的类。

这里的T指由字符串转换的目标数据类型。

该接口有parse和print有两个接口方法,自己实现进行覆盖。

parse方法是指利用指定的Locale将一个String类型转换成目标类型。

print方法是指利用指定的Locale将目标类型转换成String类型。

实例:

创建springmvc项目并按照下图创建文件夹及文件:

创建实体类

Student.java

package springmvcdemo.pojo;

import java.util.Date;

public class Student {
    private int id;
    private String name;
    private String password;
    private String sex;
    private int age;
    private Date birthDate;
    private float score;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    public float getScore() {
        return score;
    }

    public void setScore(float score) {
        this.score = score;
    }
}

创建控制器类

ConverterController.java

package springmvcdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import springmvcdemo.pojo.Student;

@Controller
@RequestMapping("/student")
public class ConverterController {

    @RequestMapping("/formatter")
    public String formatter(Student student, Model model) {
        model.addAttribute("student", student);
        return "showStudent";
    }
}

创建自定义格式化转换器类

package springmvcdemo.formatter;

import org.springframework.format.Formatter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class DateFormatter implements Formatter<Date> {
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");


    @Override
    public Date parse(String s, Locale locale) throws ParseException {
        return dateFormat.parse(s);
    }

    @Override
    public String print(Date date, Locale locale) {
        return dateFormat.format(date);
    }
}

注册格式化转换器

需要在springmvc配置文件中注册格式化转换器。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">

    <!--使用扫描机制扫描控制器类,控制器类都在controller包及其子包下-->
    <context:component-scan base-package="springmvcdemo.controller"/>

    <!--注册类型转换器StudentConverter-->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="formatters">
            <set>
                <bean class="springmvcdemo.formatter.DateFormatter"/>
            </set>
        </property>
    </bean>
    <mvc:annotation-driven conversion-service="conversionService"/>

    <!--配置视图解析器-->
    <!--配置视图解析器成功后,RegisterController和LoginController控制器类的视图路径仅需提供register和login,视图解析器将会自动添加前缀和后缀-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

其他JSP页面

showStudent.jsp

<%@ page import="springmvcdemo.pojo.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>显示学生信息</title>
</head>
<body>
    <%
        Student student = (Student) request.getAttribute("student");
    %>
    学生ID:<%=student.getId()%><br>
    学生姓名:<%=student.getName()%><br>
    学生密码:<%=student.getPassword()%><br>
    学生性别:<%=student.getSex()%><br>
    学生年龄:<%=student.getAge()%><br>
    学生出生日期:<%=student.getBirthDate()%><br>
    学生成绩:<%=student.getScore()%>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--部署DispatcherServlet-->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载Spring MVC的配置文件,配置文件可以放在项目目录的任意位置,使用init-param元素加载配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <!--配置文件的位置-->
            <param-value>/WEB-INF/config/springmvc-config/springmvc-servlet.xml</param-value>
        </init-param>
        <!--表示容器在启动时立即加载servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <!--处理所有URL-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

input.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>输入</title>
</head>
<body>
<form action="/student/formatter" method="post">
    学生ID:<input type="text" name="id"><br>
    学生姓名:<input type="text" name="name"><br>
    学生密码:<input type="password" name="password"><br>
    学生性别:<input type="text" name="sex"><br>
    学生年龄:<input type="text" name="age"><br>
    学生出生日期:<input type="text" name="birthDate" placeholder="如:1996-06-15"><br>
    学生成绩:<input type="text" name="score"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

运行效果

点击【提交】按钮提交(中文乱码)

 

如果对完整源码有兴趣。

可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。

注意:在公众号后台回复【CSDN201911152150】可获取本节源码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值