jstl标签的自定义函数库&struts实现java.util.Date转换器的几种方式
前言
在Struts框架中表单的自动收集与转换,当表单bean中属性的类型与表单请求来的参数不一致时,struts会自动调用转换器进行转换。但是对于比较灵活的java.util.Date
类型,struts是没有提供相应转换器的,因此我们需要自定义java.util.Date
类型的转换器。以下是几种该类型的转换器添加方式,下面案例仅供参考
提示:以下是本篇文章正文内容,下面案例可供参考
一、通过filter实现
filter是当用户发请求访问web组件时,就会根据web.xml文件中的配置,对相应的请求进行拦截。可以在其 init()方法中将转换器进行注册。
1.提供一个类myUtilDateConverter.java
实现Converter接口,并实现它的public Object convert(Class type, Object value)
方法
package com.cn.myStruts;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.beanutils.Converter;
/***
* 自定义一个java.util.Date类型转换器
* 需要实现Converter接口
*/
public class myUtilDateConverter implements Converter{
@Override
public Object convert(Class type, Object value) {
System.out.println("**********myUtilDateConverter********"+value);
if(value==null) {
return value;
}
if(value instanceof Date) {
return value;
}
Date date=null;
if(value instanceof String) {
SimpleDateFormat format=new SimpleDateFormat("yyyy:MM:dd");
try {
//将表单来的数据先转换成String类型,再看能不能根据format格式转换
date=format.parse((String)value);
}catch(ParseException e) {
e.printStackTrace();
//一定要返回null,因为struts会判断,如果返回的是null就不进行该同名参数的收集
return null;
}
}
return date;
}
}
2.写一个filter的实现类:MyFilter_struts.java
主要是在它的init()方法中将转换器注册进去,并且在其doFilter()方法中应当将请求通过chain.doFilter(request, response)
进行下传,其他的方法可以空实现。关键语句:
ConvertUtils.register(new myUtilDateConverter(), Date.class)
package com.cn.myStruts;
import java.io.*;
import java.util.Date;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.beanutils.ConvertUtils;
/***
*该拦截器实现将java.util.Date类型转换器装配在ActionServlet的initOther()初始化方法中
*/
public class MyFilter_struts implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("*********MyFilter_struts的init()**********");
//将转换器及转换器需要转换的类型,通过ConvertUtils类的静态方法,添加到静态的Map中
ConvertUtils.register(new myUtilDateConverter(), Date.class);
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)resp;
chain.doFilter(request, response);
}
}
3.提供一个表单:myUtilDate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>自定义转换器的输入页面</title>
</head>
<body>
<h2>自定义转换器的输入页面</h2>
<form name="text" action="UtilDate.do" method="post">
输入inValue:<input type="text" name="intValue"><br><br>
输入doubleValue:<input type="text" name="doubleValue"><br><br>
输入sqlDateValue:<input type="text" name="sqlDateValue"><br><br>
输入utilDateValue:<input type="text" name="utilDateValue"><br><br>
<input type="submit" value="提交">
</form>
</body>
</html>
4.提供一个对表单数据进行收集的表单bean,继承ActionForm的:MyUtilForm.java
package com.cn.bean;
import org.apache.struts.action.ActionForm;
import org.apache.struts.actions.DispatchAction;
/***
* 实现表单中数据的收集,注意两个Date的格式
*/
public class MyUtilForm extends ActionForm{
private int intValue;
private double doubleValue;
private java.sql.Date sqlDateValue;
//该类型在struts框架中是没有提供相应的转换器的
private java.util.Date utilDateValue;
public MyUtilForm() {
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public double getDoubleValue() {
return doubleValue;
}
public void setDoubleValue(double doubleValue) {
this.doubleValue = doubleValue;
}
public java.util.Date getUtilDateValue() {
return utilDateValue;
}
public void setUtilDateValue(java.util.Date utilDateValue) {
this.utilDateValue = utilDateValue;
}
public java.sql.Date getSqlDateValue() {
return sqlDateValue;
}
public void setSqlDateValue(java.sql.Date sqlDateValue) {
this.sqlDateValue = sqlDateValue;
}
}
5.提供一个继承Action的类,主要用于实现跳转: UtilDateAction.java
package com.cn.myStruts;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/***
* 业务层前端控制器
*/
public class UtilDateAction extends Action{
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
//设置跳转信息中的name
return mapping.findForward("show");
}
}
6.提供一个显示界面:showMyUtilDate.java
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="fun" uri="http://www.zte.com/functions"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>自定义转换器结果显示页面</title>
</head>
<body>
<h2>转换后的各个值显示</h2><br>
intValue=${myUtilForm.intValue}
<br><br>
doubleValue=${myUtilForm.doubleValue}
<br><br>
sqlDateValue=${myUtilForm.sqlDateValue}
<br><br>
utilDateValue=${myUtilForm.utilDateValue}
</body>
</html>
7.在struts-config.xml中的配置
<!-- 自定义转换器用到的表单 -->
<action path="/UtilDate"
type="com.cn.myStruts.UtilDateAction"
name="myUtilForm"
scope="request"
validate="true">
<forward name="show" path="/showMyUtilDate.jsp"/>
</action>
8.在web.xml中的过滤器配置
<!-- 利用过滤器实现java.util.Date转换器 -->
<filter>
<filter-name>my</filter-name>
<filter-class>com.cn.myStruts.MyFilter_struts</filter-class>
</filter>
<filter-mapping>
<filter-name>my</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
9.运行结果图
1)表单中输入
2)结果
二、使用jstl自定义函数库&struts实现
1.自定义函数:UtilFunction.java
注意函数是由类调用的,要用public static
修饰
package com.cn.myStruts;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/***自定义函数库
*/
public class UtilFunction {
public static java.util.Date Myutil(String d) {
//进入自定义函数
System.out.println("进入自定义函数,准备进行转换器装配");
Date date=null;
SimpleDateFormat sdf=new SimpleDateFormat("yyyy:MM:dd");
try {
date=sdf.parse(d);
} catch (ParseException e) {
e.printStackTrace();
System.out.println("转换异常!");
}
return date;
}
}
2.在相应的myfunctions .tld文件中做配置
<short-name>fun</short-name>
<uri>http://www.ttt.com/functions</uri>
<function>
<name>utilDate</name>
<function-class>com.cn.myStruts.UtilFunction</function-class>
<function-signature>java.util.Date Myutil(java.lang.String)</function-signature>
</function>
3.提供一个表单,用于输入数据:myUtilDate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>自定义转换器的输入页面</title>
</head>
<body>
<h2>自定义转换器的输入页面</h2>
<form name="text" action="UtilDate.do" method="post">
输入inValue:<input type="text" name="intValue"><br><br>
输入doubleValue:<input type="text" name="doubleValue"><br><br>
输入sqlDateValue:<input type="text" name="sqlDateValue"><br><br>
输入utilDateValue:<input type="text" name="utilDateValue"><br><br>
<input type="submit" value="提交">
</form>
</body>
</html>
4.收集表单数据的表单bean: MyUtilForm .java
package com.cn.bean;
import org.apache.struts.action.ActionForm;
import org.apache.struts.actions.DispatchAction;
/***
* 实现表单中数据的收集,注意两个Date的格式
*/
public class MyUtilForm extends ActionForm{
private int intValue;
private double doubleValue;
private java.sql.Date sqlDateValue;
//将类型改为String,在自定义函数中进行转换
private String utilDateValue;
public MyUtilForm() {
}
public void setUtilDateValue(String utilDateValue) {
this.utilDateValue = utilDateValue;
}
public String getUtilDateValue() {
return utilDateValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public double getDoubleValue() {
return doubleValue;
}
public void setDoubleValue(double doubleValue) {
this.doubleValue = doubleValue;
}
public java.sql.Date getSqlDateValue() {
return sqlDateValue;
}
public void setSqlDateValue(java.sql.Date sqlDateValue) {
this.sqlDateValue = sqlDateValue;
}
}
5.提供一个继承Action的类,主要用于实现跳转: UtilDateAction.java
package com.cn.myStruts;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/***
* 业务层前端控制器
*/
public class UtilDateAction extends Action{
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) throws Exception {
//设置跳转信息中的name
return mapping.findForward("show");
}
}
6.结果显示界面:showmyUtilDate.jsp
注意要引入自定义函数库
<%@taglib prefix=“fun” uri=“http://www.ttt.com/functions”%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="fun" uri="http://www.ttt.com/functions"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>自定义转换器结果显示页面</title>
</head>
<body>
<h2>转换后的各个值显示</h2><br>
<h2>自定义函数库,转换后的各个值显示</h2><br>
intValue=${myUtilForm.intValue}
<br><br>
doubleValue=${myUtilForm.doubleValue}
<br><br>
sqlDateValue=${myUtilForm.sqlDateValue}
<br><br>
注册转换器:${fun:utilDate(myUtilForm.utilDateValue)}
</body>
</html>
7.运行结果
1)
2)运行结果
总结
以上两个简单的例子,仅供参考,希望对您有帮助哦!
其实还有其他的几个方式:
方式一:写一个Servlet,不接受任何的请求,只要覆写init()方法,将代码
ConvertUtils.register(new myUtilDateConverter(), Date.class)
写在它的init()方法体中实现转换器的注册;
方式二:用listener实现,具体步骤与filter类似;
方式四:插件
方式五:写个Servlet框架,继承ActionServlet,覆写initOther()方法,在该方法中将转换器注册进去;
注意:在子类覆写父类的方法中,需要加上super.initOther();并且在web.xml中需要配置自己的框架。
附:如果有其他的想法,欢迎留言~~