ActionForm空欄位問題和struts類型轉化器

來源:互聯網
上載者:User

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-14struts自訂類型轉換器

關鍵字: 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. }  
package com.twh.struts;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("value= " + value);if (null == value) {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 blocke.printStackTrace();}}return d;}}

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. }  
package com.twh.struts;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 {@Overridepublic void init() throws ServletException {//註冊java.util.Date轉換器ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);}}

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>  
 <servlet><servlet-name>UtilDateConverterInitWithServlet</servlet-name><servlet-class>com.twh.struts.UtilDateConverterInitWithServlet</servlet-class><load-on-startup>4</load-on-startup></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. }  
package com.twh.struts;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;/*** 註冊java.util.Date轉換器* @author Administrator**/public class UtilDateConverterInitWithPlugIn implements PlugIn {public void destroy() {}public void init(ActionServlet servlet, ModuleConfig config)throws ServletException {//註冊java.util.Date轉換器ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);}}

3、在struts-config.xml中配置 Java代碼

  1. <plug-in className="com.twh.struts.UtilDateConverterInitWithPlugIn"/>  

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.