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
struts自定义类型转换器
关键字: java.util.date类型转换器* 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值
* 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性
根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型
对于java.util.Date 需要自定义类型转换器
1、实现converter接口
- 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;
- }
- }
2、通过servlet注册
- 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);
- }
- }
3、在web.xml中配置(load-on-startup在web服务器启动时候初始化,只要大于0的值就行)
- <servlet>
- <servlet-name>UtilDateConverterInitWithServlet</servlet-name>
- <servlet-class>com.twh.struts.UtilDateConverterInitWithServlet</servlet-class>
- <load-on-startup>4</load-on-startup>
- </servlet>
----------------------------------------------------------------------
另一种方法
2、实现PlugIn接口
- 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中配置
- <plug-in className="com.twh.struts.UtilDateConverterInitWithPlugIn"/>