zoukankan      html  css  js  c++  java
  • 层层递进Struts1(六)自定义转换器

         Struts提供的类型转换有限,如果我们强行使用没有的类型转换,则会出现错误,以Date类型为例:

    org.apache.catalina.core.StandardWrapperValve invoke
    严重: Servlet.service() for servlet action threw exception
    
    java.lang.IllegalArgumentException: Cannot invoke com.tgb.struts1.TypeCovertActionForm.setUtilDate - argument type mismatch

        在此我们来建立java.util.Date的转换器。

    Servlet版

        Converter

        数据转换器,代码如下:

    package com.tgb.struts1;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.apache.commons.beanutils.ConversionException;
    
    import com.sun.org.apache.commons.beanutils.Converter;
    
    public class UtilDateConverter implements org.apache.commons.beanutils.Converter {
    
    	public Object convert(Class type, Object value) {
    
    
            if (value instanceof Date) {
                return (value);
            }
            Date date=null;
        if (value instanceof String) {
    		try {
    			date=new SimpleDateFormat("yyy-MM-dd").parse((String)value);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
            }
        return date;
    	}
    }
    

        Servlet

        为的是将上面的转换器注册到ConvertUtils中:

    package com.tgb.struts1;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    
    import org.apache.commons.beanutils.ConvertUtils;
    
    public class UtilServlet extends HttpServlet {
    	
    	public void init()throws ServletException
    	{
    			ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
    	}
    }
    

        配置文件

        在web.xml中添加配置,因为转换器在Tomcat启动之时就加载,所以此处要将load-on-startup设置为大于0的值:

    <servlet>
      		<servlet-name>UtilServlet</servlet-name>
      		<servlet-class>com.tgb.struts1.UtilServlet</servlet-class>
      		<load-on-startup>10</load-on-startup>
      </servlet>

        测试

        jsp

    	<h4>测试struts的转换器</h4>
    	<form action="typeconvert.do" method="post" >
    		int value:<input type="text"  name="intValue" /> <br/>
    		double value:<input type="text"  name="doubleValue" /> <br/>
    		boolean value:<input type="text"  name="booleanvVlue" /> <br/>
    		java.sql.date:<input type="text"  name="sqlDate" /> <br/>
    		java.util.date:<input type="text"  name="utilDate" /> <br/>
    		<input type="submit"  value="提交" /> <br/>
    	</form>

        结果

        

    plugin版

        plugin

    package com.tgb.struts1;
    
    import javax.servlet.ServletException;
    
    import org.apache.commons.beanutils.ConvertUtils;
    import org.apache.struts.action.ActionServlet;
    import org.apache.struts.action.PlugIn;
    import org.apache.struts.config.ModuleConfig;
    
    public class UtilDateConverterPlugin implements PlugIn {
    
    	public void destroy() {
    		// TODO Auto-generated method stub
    	}
    	public void init(ActionServlet servlet, ModuleConfig config)
    			throws ServletException {
    		ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
    	}
    }
    

        配置文件

        在struts-config中放入:

    <plug-in className="com.tgb.struts1.UtilDateConverterPlugin" />
    

        测试结果

        

    总结

        在此体会到面向抽象编程所带来的可扩展的好处,这篇博客中的两个自定义的转换器过程基本一致:实现接口写出转换器、更改配置文件保证可以在Tomat加载即注册。

        更多相关博客,请至《层层递进Struts1(八)之总结》



  • 相关阅读:
    资源放送丨《Oracle存储过程中的性能瓶颈点》PPT&视频
    警示:一个update语句引起大量gc等待和业务卡顿
    周末直播丨细致入微
    Java VS Python:哪个未来发展更好?
    【LeetCode】279.完全平方数(四种方法,不怕不会!开拓思维)
    事件驱动
    Android初级教程以动画的形式弹出窗体
    Android简易实战教程--第五话《开发一键锁屏应用》
    迎战大数据-Oracle篇
    Android初级教程获取手机位置信息GPS与动态获取最佳方式
  • 原文地址:https://www.cnblogs.com/aukle/p/3225883.html
Copyright © 2011-2022 走看看