实现java.util.Date转换器的几种方式

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中需要配置自己的框架。

附:如果有其他的想法,欢迎留言~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值