关于struts1中字符串和时间转化方式

来源:互联网 发布:shell编程的特点 编辑:程序博客网 时间:2024/06/06 14:11

由于strust1 的内部转化机制对于java.util.date 和 字符串 的转化没有进行处理,需要自己去写相关的实现类去完成相关数据转发工作。

jsp前台中接收的均是string类型的数据,struts中有内至的转换器,能转换常规类型的数据,如int,float, double, string, boolean(Y/N 1/0 true/false on/off), .时间型:java.sql.Date(2009-12-23)可以转换。但java.util.Date不能转换。那我们就写一个utilDate的转换器。

若数据为空,int, 默认是0 , double默认是0.0, boolean默认是false.
java.sql.Date 前台不能为空,且格式必须是yyyy-MM-dd类型
java.sql.Timestamp 要求:Timestamp format must be yyyy-mm-dd hh:mm:ss.fffffffff 如:2010-02-12 12:25:20.0

实现步骤如下

第一种注册方式 servlet

 1. 利用servlet 加载 进行类型转换类的预注册(web容器加载servler是通过初始化方法进行注册)

     注意web.xml中的加载顺序要慢于ActionServlet

public class ConverterInitWithServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
        ConvertUtils.register(new UtilStringConverter(), java.lang.String.class);
    }
  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>convertNull</param-name>
      <param-value>yes</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet>
      <servlet-name>ConverterInitWithServlet</servlet-name>
      <servlet-class>org.struts.www.web.utils.ConverterInitWithServlet</servlet-class>
      <load-on-startup>3</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>


2 写自己的相关数据转换实现类 需要实现Converter接口 以及内部的convert()方法[org.apache.commons.beanutils.Converter;]

下例是通过Date 格式转换

public class UtilDateConverter implements Converter {

    public Object convert(Class clazz, Object value) {
        //System.err.println("clazz:" + clazz);
        //System.out.println("value:" + value);
        if (value == null) {
            return null;
        } else if (value instanceof Date) {
            return value;
        } else if (value instanceof String) {
            String str = value.toString();

            if (str.trim().equals("")) {
                return null;
            }
            try {
                return new SimpleDateFormat("yyyy-MM-dd").parse(str);
            } catch (ParseException e) {

                e.printStackTrace();
                throw new ConverterException("类型解析异常" + e);
            }
        }
        return null;
    }



第二种注册方式是用plugin加载


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;

/**
* PlugIn方式加载 java.util.Date转换器
* @author dell
*
*/
public class UtilDatePlugIn implements PlugIn {


public void init(ActionServlet servlet, ModuleConfig config)
    throws ServletException {
   ConvertUtils.register(new UtilDateConverter() , Date.class );
}

public void destroy() {
   // TODO Auto-generated method stub

}


}

struts-config.xml

<!-- 嵌入java.util.Date类型转换器 -->
<plug-in className="com.util.UtilDatePlugIn" />

第三种注册方式自定义struts Converter解决不能输入空日期

在Struts中的时间类型转换
在struts中前台页面只能传String类型的值,时间类型就需要在后面转换了。DateConvertUtil类:

private java.util.Date saveDate;
              //普通的set/get方法
              public void setSaveDate(java.util.Date saveDate){
                  this.saveDate=saveDate;
              }
              public java.util.Date getSaveDate(){
                  return this.saveDate;
              }
              //为Struts准备的方法,时期的格式假定是 2000-12-31 23:59:59
              public void setSaveDateAsString(String saveDate){
                 java.text.DateFormat dateFormat =new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                 this.saveDate=dateFormat.parse(saveDate);
              }
              public String getSaveDateAsString(){
                 java.text.DateFormat dateFormat =new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                 return dateFormat.Format(this.saveDate);            

在action里面获得时间类型的字符串,然后调用转换方法就可以了。

     
       }



原创粉丝点击