ActionForm空字段问题和struts类型转化器

ActionForm空字段问题

ActionForm空字段问题是指:当表单中没有这个输入域,使用EL表达式去取值的情况和采用jsp脚本去取值的情况。另一种是表单中有这个输入域,但是没有值,使用EL表达式去取值的情况和采用jsp脚本去取值的情况。结果如下:

在表单中没有input输入域,jsp脚本接收到的值为null,字符串是null,整型是0。el表达式接收到的值为空串
如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串

 

 

 

ActionForm之struts类型转化器

Struts对ActionForm的自动搜集过程:
  * 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值
  * 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性
    根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型

对于java.util.Date 需要自定义类型转换器

由于页面传过来的数据都是String类型,在后台使用的是不同的类型,故需要转换器来对页面传过来的数据进行转换。

以实例来演示:

在首页里填数据:

 <li>测试ActionForm类型转换器</li><br>
    <form action="typeconvert.do" method="post">
     intValue:<input type="text" name="intValue"><br>//测试整型,即输入值之后让类型转换器将其转换成int
     doubleValue:<input type="text" name="doubleValue"><br>//测试双精度值,输入值之后让类型转换器将其转换成double

     booleanValue:<input type="text" name="booleanValue"><br>//测试布尔值,输入值之后让类型转换器将其转换成boolean
     java.sql.Date:<input type="text" name="sqlDate"><br>//测试sql.Date
     java.util.Date:<input type="text" name="utilDate"><br>//测试util.Date
     <input type="submit" value="提交">
    </form>

 建立ActionForm,用于数据收集:

 

/**
 * struts中的类型转换测试
 * @author Administrator
 *
 */
public class TypeConvertActionForm extends ActionForm {

 private int intValue;
 
 private double doubleValue;
 
 private boolean booleanValue;
 
 private java.sql.Date sqlDate;//数据类型为java.sql.Date 
 
 private java.util.Date utilDate;

 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 boolean isBooleanValue() {
  return booleanValue;
 }

 public void setBooleanValue(boolean booleanValue) {
  this.booleanValue = booleanValue;
 }

 public java.sql.Date getSqlDate() {
  return sqlDate;
 }

 public void setSqlDate(java.sql.Date sqlDate) {
  this.sqlDate = sqlDate;
 }

 public java.util.Date getUtilDate() {
  return utilDate;
 }

 public void setUtilDate(java.util.Date utilDate) {
  this.utilDate = utilDate;
 }
}

 

 建立Action:

 

/**
 * struts中的类型转换测试
 * @author Administrator
 *
 */
public class TypeConvertTestAction extends Action {

 @Override
 public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  return mapping.findForward("success");
 }

}

 

建立显示页面:

在这个页面取值:如果能正确取出,则转化就没问题,否则就有问题。

<body>
 intValue:${typeconvertForm.intValue }<br>//可以自动转换
 doubleValue:${typeconvertForm.doubleValue }<br>//可以自动转换
 booleanValue:${typeconvertForm.booleanValue }<br>//可以自动转换
 java.sql.dateValue:${typeconvertForm.sqlDate }<br>//可以自动转换
 java.util.utilValue:${typeconvertForm.utilDate }<br>//不可以自动转换,需要自己写转换器
</body>

做相关的配置:

<form-bean name="typeconvertForm" type="com.mine.struts.TypeConvertActionForm"/>

<action path="/typeconvert"
    type="com.mine.struts.TypeConvertTestAction"
    name="typeconvertForm"
    scope="request"
  >
   <forward name="success" path="/typeconvert_success.jsp"/> 
  </action>

 

启动测试,得到结果如下:

boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false
Date类型的转换:
如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换(必须以横线隔开)
如果是java.util.Date,默认情况下struts无法转换

自定义转换器的实现步骤
实现converter接口,实现convert方法
将实现的conerter注册,通常情况采用servlet注册(struts自带的转换器的注册是在struts.jar包中的action里的ActionServlet.class中,在这个方法里面有一个init()方法,在这个方法里调用了很多方法,其中有个inintOther()方法,转换器就是在这里面注册的)
采用servlet注册需要注意标签的配置,<load-on-startup>10</load-on-startup>(也可以采用struts plugin注册)

 自定义转化器的过程:(一自定义java.util.Date类型转换器为例)

 

 

首先写一个类,实现converter接口,实现convert方法:

 

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.beanutils.Converter;

/**
 * java.util.Date类型转换器
 * @author Administrator
 *
 */
public class UtilDateConverter implements Converter {

 public Object convert(Class type, Object value) {
  System.out.println("UtilDateConverter.value=" + value);
  if (value == null) {
   return value;
  }
  if (value instanceof Date) {
   return value;
  }
  Date d = null;
  if (value instanceof String) {
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化格式
   try {
    d = sdf.parse((String)value);
   } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  return d;
 }

}

 

 写一个servlet来注册自定义的转换器:

 

import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.commons.beanutils.ConvertUtils;

/**
 * 注册java.util.date转换器
 * @author Administrator
 *
 */
public class UtilDateConverterInitWithServlet extends HttpServlet {

 @Override
 public void init() throws ServletException {//复写初始化的方法。
  //System.out.println("UtilDateConverterInitWithServlet.init()");
  ConvertUtils.register(new UtilDateConverter(), Date.class);//参照struts自带的转换器注册方法,第一个参数是自定义的转换器对象,第二个是类型。这样就把我们自己写的转换器注册到map里面
 }

}

 

 最后一步就是配置起来:在web.xml中配置(load-on-startup在web服务器启动时候初始化,只要大于0的值就行)

  <servlet>
   <servlet-name>UtilDateConverterInitWithServlet</servlet-name>
   <servlet-class>com.bjsxt.mine.UtilDateConverterInitWithServlet</servlet-class>
   <load-on-startup>3</load-on-startup>//意思是当tomcat启动的时候就初始化
  </servlet>

 

 

 另一种方法
建一个类,实现PlugIn接口 ,在这个接口中有一个init方法,可以在这里实现。

 

import java.util.Date;

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 UtilDateConverterInitWithPlugin implements PlugIn {

 public void destroy() {
 }

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

 

然后在在struts-config.xml中配置 :(在最后面了)

<plug-in className="com.mine.struts.UtilDateConverterInitWithPlugin"/>//使用plug-in标签,写入完整的路径
</struts-config>

 

 

 

 

 

 也可以参考:http://twh1224.javaeye.com/blog/266929

2008-11-14

struts自定义类型转换器

关键字: java.util.date类型转换器
Struts对ActionForm的自动搜集过程:
  * 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值
  * 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性
    根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型

对于java.util.Date 需要自定义类型转换器

1、实现converter接口
Java代码 复制代码
  1. package com.twh.struts;   
  2.   
  3. import java.text.ParseException;   
  4. import java.text.SimpleDateFormat;   
  5. import java.util.Date;   
  6.   
  7. import org.apache.commons.beanutils.Converter;   
  8.   
  9. /**  
  10.  * java.util.Date类型转换器  
  11.  * @author Administrator  
  12.  *  
  13.  */  
  14. public class UtilDateConverter implements Converter {   
  15.   
  16.     public Object convert(Class type, Object value) {   
  17.         System.out.println("value= " + value);   
  18.         if (null == value) {   
  19.             return value;   
  20.         }   
  21.         if (value instanceof Date) {   
  22.             return value;   
  23.         }   
  24.         Date d = null;   
  25.         if (value instanceof String) {   
  26.             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");   
  27.             try {   
  28.                 d = sdf.parse((String)value);   
  29.             } catch (ParseException e) {   
  30.                 // TODO Auto-generated catch block   
  31.                 e.printStackTrace();   
  32.             }   
  33.         }   
  34.         return d;   
  35.     }   
  36.   
  37. }  


2、通过servlet注册
Java代码 复制代码
  1. package com.twh.struts;   
  2.   
  3. import javax.servlet.ServletException;   
  4. import javax.servlet.http.HttpServlet;   
  5.   
  6. import org.apache.commons.beanutils.ConvertUtils;   
  7.   
  8. /**  
  9.  * 注册java.util.Date转换器  
  10.  * @author Administrator  
  11.  *  
  12.  */  
  13. public class UtilDateConverterInitWithServlet extends HttpServlet {   
  14.   
  15.     @Override  
  16.     public void init() throws ServletException {   
  17.         //注册java.util.Date转换器   
  18.         ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);   
  19.     }   
  20.   
  21.        
  22. }  


3、在web.xml中配置(load-on-startup在web服务器启动时候初始化,只要大于0的值就行)
Java代码 复制代码
  1. <servlet>   
  2.     <servlet-name>UtilDateConverterInitWithServlet</servlet-name>   
  3.     <servlet-class>com.twh.struts.UtilDateConverterInitWithServlet</servlet-class>   
  4.     <load-on-startup>4</load-on-startup>   
  5. </servlet>  


----------------------------------------------------------------------
另一种方法
2、实现PlugIn接口
Java代码 复制代码
  1. package com.twh.struts;   
  2.   
  3. import javax.servlet.ServletException;   
  4.   
  5. import org.apache.commons.beanutils.ConvertUtils;   
  6. import org.apache.struts.action.ActionServlet;   
  7. import org.apache.struts.action.PlugIn;   
  8. import org.apache.struts.config.ModuleConfig;   
  9.   
  10. /**  
  11.  * 注册java.util.Date转换器  
  12.  * @author Administrator  
  13.  *  
  14.  */  
  15. public class UtilDateConverterInitWithPlugIn implements PlugIn {   
  16.   
  17.     public void destroy() {   
  18.     }   
  19.   
  20.     public void init(ActionServlet servlet, ModuleConfig config)   
  21.             throws ServletException {   
  22.         //注册java.util.Date转换器   
  23.         ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);   
  24.     }   
  25.   
  26. }  


3、在struts-config.xml中配置
Java代码 复制代码
  1. <plug-in className="com.twh.struts.UtilDateConverterInitWithPlugIn"/>  

 

 

 

 

posted @ 2009-03-12 11:57  刘阳  阅读(731)  评论(0)    收藏  举报