Welcome 微信登录

首页 / 软件开发 / JAVA / 层层递进Struts1(三)之Struts组成

层层递进Struts1(三)之Struts组成2013-12-07 csdn 李达这篇博客我们来说一下Struts的主要组成我们,通过前几篇博客,我们知道这个框架最重要的几个步骤: 获取路径、封装表单、获取转向列表、转向逻辑处理、转向,与此对应的是:ActionServlet、ActionForm、 ActionMapping、Action、ActionForward。

ActionServlet

这个在上篇博客已经说明,可以访 问《 预加载ActionServlet》。

ActionForm

ActionForm的主要作用是对表单数据进行封装,这 个.NET开发中的实体类有些类似,它的使用有以下限制:ActionForm中的get/set属性名必须和表单字段一致 ;必须继承自org.apache.struts.action.ActionForm。

ActionForm除了封装数据意外,还可以进行对 数据进行校验、组装前初始化属性,当然这分别需要实现validate和reset函数。

ActionForm转换器

它还可以数据自动进行逻辑转换,使用的是bean-utils的转换器,这个在上篇博客中提到了一次,它 位于ActionServlet中的initOther()中,如下:

if (convertNull) { ConvertUtils.deregister(); ConvertUtils.register(new BigDecimalConverter(null), BigDecimal.class); ConvertUtils.register(new BigIntegerConverter(null), BigInteger.class); ConvertUtils.register(new BooleanConverter(null), Boolean.class); ConvertUtils.register(new ByteConverter(null), Byte.class); ConvertUtils.register(new CharacterConverter(null), Character.class); ConvertUtils.register(new DoubleConverter(null), Double.class); ConvertUtils.register(new FloatConverter(null), Float.class); ConvertUtils.register(new IntegerConverter(null), Integer.class); ConvertUtils.register(new LongConverter(null), Long.class); ConvertUtils.register(new ShortConverter(null), Short.class); }
这个代码段的作用是将转换器初始化到一个map中,它们都实现了Convert接口的方法:

public Object convert(Class type, Object value);
如boolean类型的转换器,代码如 下:

以boolean的转换器为例public Object convert(Class type, Object value) {if (value == null) {if (useDefault) {return (defaultValue);} else {throw new ConversionException("No value specified");}}if (value instanceof Boolean) {return (value);}try {String stringValue = value.toString();if (stringValue.equalsIgnoreCase("yes") ||stringValue.equalsIgnoreCase("y") ||stringValue.equalsIgnoreCase("true") ||stringValue.equalsIgnoreCase("on") ||stringValue.equalsIgnoreCase("1")) {return (Boolean.TRUE);} else if (stringValue.equalsIgnoreCase("no") || stringValue.equalsIgnoreCase("n") || stringValue.equalsIgnoreCase("false") || stringValue.equalsIgnoreCase("off") || stringValue.equalsIgnoreCase("0")) {return (Boolean.FALSE);} else if (useDefault) {return (defaultValue);} else {throw new ConversionException(stringValue);}} catch (ClassCastException e) {if (useDefault) {return (defaultValue);} else {throw new ConversionException(e);}}}
可以看到它转换的类型有限,如果我想转换其它的类型怎么办?还好,这里提供了自定义转换 器的功能,具体见博客《自定义转换器》。

动态ActionForm

它是以配置文件的形式存在的,例 如在struts-config中配置:

<form-beans><form-bean name="dynaForm"type="org.apache.struts.action.DynaActionForm" ><form-property name="username" type="java.lang.String" /><form-property name="age" type="java.lang.Integer" /></form-bean></form-beans>
需要注意的是动态ActionForm的读取方式稍有不同:

<body>用户名:${dynaForm.map.username }; 注意它的获取方式年龄:${dynaForm.map.age }</body>