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代碼
- 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 block
- e.printStackTrace();
- }
- }
- return d;
- }
-
- }
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代碼
- 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 {
-
- @Override
- public void init() throws ServletException {
- //註冊java.util.Date轉換器
- ConvertUtils.register(new UtilDateConverter(), java.util.Date.class);
- }
-
-
- }
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代碼
- <servlet>
- <servlet-name>UtilDateConverterInitWithServlet</servlet-name>
- <servlet-class>com.twh.struts.UtilDateConverterInitWithServlet</servlet-class>
- <load-on-startup>4</load-on-startup>
- </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代碼
- 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);
- }
-
- }
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代碼
- <plug-in className="com.twh.struts.UtilDateConverterInitWithPlugIn"/>