config包之FormPropertyConfig浅析

原创 2007年09月24日 10:54:00

org.apache.struts.config.FormPropertyConfig类解析

struts-config.xml文件中每一个<form-property>元素对应着一个org.apache.struts.config.FormPropertyConfig对象。FormPropertyConfig类与FormBeanConfig相关联
<form-property>元素中的className是指定和<form-property>元素对应的配置类,默认值为org.apache.struts.config.FormPropertyConfig。
<form-property>元素中的initial是以字符串的形式设置表但字段的初始值。如果没有设置该属性,则基本类型的表单字段的默认值为0,对象类型的表单字段默认值为null,该元素在FormPropertyConfig类对应的属性是String initial。
<form-property>元素中的name是指定表单字段的名字,该属性是必须的,它在FormPropertyConfig类中对应的属性是String name。
<form-property>元素中的type是指定表单字段的类型,如果表但字段为JAVA类,必须给出完整的类名,该属性是必须的,它在FormPropertyConfig类中对应的属性是String type。
<form-property>元素中的size是指定表单字段的输入长度,它在FormPropertyConfig类中对应的属性是int size。

类中方法解析
    public class FormPropertyConfig implements Serializable {

    private static final Log log =
        LogFactory.getLog(FormPropertyConfig.class);

    public FormPropertyConfig() {

        super();

    }

    public FormPropertyConfig(String name, String type, String initial) {

        this(name, type, initial, 0);

    }

    public FormPropertyConfig(String name, String type,
                              String initial, int size) {

        super();
        setName(name);
        setType(type);
        setInitial(initial);
        setSize(size);

    }

    protected boolean configured = false;

    protected String initial = null;

    public String getInitial() {
        return (this.initial);
    }

    public void setInitial(String initial) {
        if (configured) {
            throw new IllegalStateException("Configuration is frozen");
        }
        this.initial = initial;
    }

    protected String name = null;

    public String getName() {
        return (this.name);
    }

    public void setName(String name) {
        if (configured) {
            throw new IllegalStateException("Configuration is frozen");
        }
        this.name = name;
    }

    protected int size = 0;

    public int getSize() {
        return (this.size);
    }

    public void setSize(int size) {
        if (configured) {
            throw new IllegalStateException("Configuration is frozen");
        }
        if (size < 0) {
            throw new IllegalArgumentException("size < 0");
        }
        this.size = size;
    }

    protected String type = null;

    public String getType() {
        return (this.type);
    }

    public void setType(String type) {
        if (configured) {
            throw new IllegalStateException("Configuration is frozen");
        }
        this.type = type;
    }
   
    //获取该表单字段的类型
    public Class getTypeClass() {

        String baseType = getType();//获取类中的type属性的值
        boolean indexed = false;//判断type值所指定的的JAVA类型名,true则为数组类型
        if (baseType.endsWith("[]")) {//判断属性的后缀是不是有“[]”,如果有则为数组类型
            baseType = baseType.substring(0, baseType.length() - 2);//如果属性后缀有“[]”就截掉该后缀
            indexed = true;
        }

        Class baseClass = null;
 //判断type属性值是否为基础类型名
        if ("boolean".equals(baseType)) {
            baseClass = Boolean.TYPE;
        } else if ("byte".equals(baseType)) {
            baseClass = Byte.TYPE;
        } else if ("char".equals(baseType)) {
            baseClass = Character.TYPE;
        } else if ("double".equals(baseType)) {
            baseClass = Double.TYPE;
        } else if ("float".equals(baseType)) {
            baseClass = Float.TYPE;
        } else if ("int".equals(baseType)) {
            baseClass = Integer.TYPE;
        } else if ("long".equals(baseType)) {
            baseClass = Long.TYPE;
        } else if ("short".equals(baseType)) {
            baseClass = Short.TYPE;
        } else {//type属性值是其他对象类型名
            ClassLoader classLoader =//获取ClassLoader对象,类加载器
                Thread.currentThread().getContextClassLoader();//Thread类中的静态方法currentThread()返回一个当前正在执行的线程对象,利用该线程对象调用getcontextClassLoader()返回该线程上下文的一个ClassLoader对象
            if (classLoader == null) {//如果ClassLoader对象为空,则用当前对象构造一个加载器
                classLoader = this.getClass().getClassLoader();
            }
            try {
                baseClass = classLoader.loadClass(baseType);//加载一个类名为type属性值的类
            } catch (Throwable t) {
                baseClass = null;
            }
        }

        // Return the base class or an array appropriately
        if (indexed) {//如果type是一个数组类型名则创建一个数组的组件类型是baseClass对象,维度为0的数组它返回一个Object,然后得到一个对象运行时类
            return (Array.newInstance(baseClass, 0).getClass());
        } else {
            return (baseClass);
        }

    }

    public Object initial() {

        Object initialValue = null;
        try {
            Class clazz = getTypeClass();
            if (clazz.isArray()) {//判断对象是否为数组类型
                if (initial != null) {
                    initialValue =//当他不为空的时候,调用ConvertUtils类的静态方法得到默认值对象
                        ConvertUtils.convert(initial, clazz);
                } else {
                    initialValue =//如果为空,就构造一个数组组件类型为clazz.getComponentType(),维度为size的数组,返回一个Object
                        Array.newInstance(clazz.getComponentType(), size);
                    if (!(clazz.getComponentType().isPrimitive())) {//判断对象不是一个基本类型
                        for (int i = 0; i < size; i++) {
                            try {
                                Array.set(initialValue, i,//将指定数组对象中索引组件的值设置为指定的新值
                                      clazz.getComponentType().newInstance());
                            } catch (Throwable t) {
                                log.error("Unable to create instance of " + clazz.getName() +
                                                                        " for property=" + name+
                                                                        ", type=" + type +
                                                                        ", initial=" + initial +
                                                                        ", size=" + size + ".");
                                //FIXME: Should we just dump the entire application/module ?
                            }
                        }
                    }
                }
            } else {//对象不是数组
                if (initial != null) {//对象不为空则调用ConvertUtils.convert方法获取值
                    initialValue = ConvertUtils.convert(initial, clazz);
                } else {//为空则直接返回Object
                    initialValue = clazz.newInstance();
                }
            }
        } catch (Throwable t) {
            initialValue = null;
        }
        return (initialValue);

    }

    public void freeze() {

        configured = true;

    }

    public String toString() {

        StringBuffer sb = new StringBuffer("FormPropertyConfig[");
        sb.append("name=");
        sb.append(this.name);
        sb.append(",type=");
        sb.append(this.type);
        sb.append(",initial=");
        sb.append(this.initial);
        sb.append("]");
        return (sb.toString());

    }
}

参阅资料:Struts底层源码,org.apache.struts.FormPropertyConfig类 

Android编译系统中的Kconfig,Makefile,.config编译系统浅析

在对Android进行编译时,用的ji,使用图形界面来对整个系统进行裁剪。当然,除了这条指令,还包括很多配置命令,比如make defconfig, make oldconfig等。这里主要就make...

linux ./config 浅析

1.简介 Config不是一种bash,config语言是linux内核的一种配置语言,config.in文件是使用该语言编写而成,在通常情况下,它看起很像一个SH语言的子集。config配置语言主...

jsp的config对象浅析。

转自:http://blog.csdn.net/titilover/article/details/6803869         config 对象代表当前JSP 配置信息,但JSP 页面...

web.config主要配置浅析

1、 节 作用:配置ASP.NET身份验证支持(为Windows、Forms、PassPort、None四种)。该元素只能在计算机、站点或应用程序级别声明。 元素必需与 节配合使用。 示例: 特...

Spring4.3.x 浅析xml配置的解析过程(7)——解析context命名空间之annotation-config标签

概述Spring context命名空间有property-placeholder、property-override、annotation-config、component-scan、load-ti...
  • chyohn
  • chyohn
  • 2017年02月09日 12:09
  • 489

Android编译系统中的Kconfig,Makefile,.config编译系统浅析

在对Android进行编译时,用的就是Linux下的Makefile和Kconfig编译系统,对整个系统进行编译。当然还包括很多配置命令,比如make defconfig, make oldconfi...

Android编译系统中的Kconfig,Makefile,.config编译系统浅析

Android编译系统中的Kconfig,Makefile,.config编译系统浅析
  • ztguang
  • ztguang
  • 2016年11月01日 22:57
  • 228

config/system 下载包

  • 2009年08月05日 14:46
  • 3.16MB
  • 下载

mujava 所需jar包和config文件

  • 2017年03月31日 09:40
  • 2.51MB
  • 下载

07_数据库创建,添加c3p0操作所需的jar包,编写c3p0-config.xml文件,编写User.java,编写jdbcUtils.java实现操作数据库的模板工具类,UserDao编写,Dao

 1  创建day14数据库,创建user.sql表: A 创建数据库 day14 B 创建数据表 users create table users ( ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:config包之FormPropertyConfig浅析
举报原因:
原因补充:

(最多只允许输入30个字)