目录
概述
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】可获取本节源码。