`
libo_591
  • 浏览: 38964 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

TOMCAT源码学习所得(二)

    博客分类:
  • JAVA
 
阅读更多

这里主要学习工具类,Digester和ConvertUtils,StringTokenizer,File类的3个获取路径的方法

 

1.StringTokenizer

如果为字符串的简单分隔,那么如果由split方法来分隔字符串,效率必然低下(其参数被识别为正则表达式)

这时,我们可以使用StringTokenizer类,来进行字符串的分隔,其效率略高

 

		String str = "test1;test2;test3;test4;test5;";
		StringTokenizer st = new StringTokenizer(str,";");
		while(st.hasMoreElements()){
			String t = st.nextToken();
			System.out.println(t);
		}
 

2.File类的3个获取路径的方法

file.getPath()

file.getAbsolutePath()

file.getCanonicalPath()

从3个例子中来学习

 

 

                File file = new File("F:/export/./../00");
		System.out.println(file.getPath());
		System.out.println(file.getAbsolutePath());
		System.out.println(file.getCanonicalPath());
		
		File file2 = new File("F:/export/as3corelib.swc");
		System.out.println(file2.getPath());
		System.out.println(file2.getAbsolutePath());
		System.out.println(file2.getCanonicalPath());
		
		File file3 = new File("./..");
		System.out.println(file3.getPath());
		System.out.println(file3.getAbsolutePath());
		System.out.println(file3.getCanonicalPath());
 

3.Digester

Digester主要用于将xml文件解析为对象,其好处在于,事前定义好规则,则在xml解析的过程中,对象也生成了,简化了代码的编写,另一个方面,Digester采用的是SAX的方法解析xml,对程序的内存影响很小,举例如下

 

首先定义一个对象Student类如下:

 

public class Student {
	private String name;
	private String age;
	private String desc;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getDesc() {
		return desc;
	}
	public void setDesc(String desc) {
		this.desc = desc;
	}
	@Override
	public String toString() {
		String str = "学生名字:"+this.name+"-年龄:"+this.age+"-描述:"+this.desc;
		return str;
	}
}

 然后在src下面,放置一个作为测试数据的xml文件,students.xml

 

 

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student namexml="zhangsan" age="18">
		<![CDATA[
			张三的描述
		]]>
	</student>
	<student namexml="lisi" age="20">
		<![CDATA[
			李四的描述
		]]>
	</student>
</students>

 

然后是Digester的测试类

 

public class DigesterTest {
	public static void main(String[] args) throws Exception {
		DigesterTest dt = new DigesterTest();
		Digester dig = new Digester();
		dig.push(dt);
		dig.addObjectCreate("students/student", Student.class);
		dig.addSetProperties("students/student", "namexml", "name");
		dig.addSetProperties("students/student", "age", "age");
		dig.addBeanPropertySetter("students/student", "desc");
		dig.addSetNext("students/student","addStu");
		
		InputStream in = DigesterTest.class.getResourceAsStream("/students.xml");
		dig.parse(in);
		in.close();
		
		System.out.println(dt.stus.size());
		System.out.println(dt.stus.get(0).toString());
		System.out.println(dt.stus.get(1).toString());
		
	}
	private List<Student> stus = new ArrayList<Student>();
	public void addStu(Student stu){
		stus.add(stu);
	}
}

 运行后,则可以看到,2个学生的数据,都被添加到了当前类的stus集合对象中

 

简单解析,其中测试类的一些方法需要加以说明:

 

//放入当前对象,方便后面的方法调用

dig.push(dt); 

 

//指明Student对象,对应着xml中的哪个节点

dig.addObjectCreate("students/student", Student.class);

 

//指明Student对象中,name属性对应着xml中的哪个属性,

//可以看到这个方法跟下面方法的比较,从xml的属性和节点给对象添加数据,使用的方法是不同的

dig.addSetProperties("students/student", "namexml", "name");

//指明Student对象中,name属性对应着xml中的哪个节点,

dig.addBeanPropertySetter("students/student", "desc");

//当出现多个对象节点后,使用哪个方法进行添加,方法为之前push的那个对象中定义的方法

dig.addSetNext("students/student","addStu"); 

 

//开始解析,方法运行完,即解析完成

dig.parse(in);

 

4.ConvertUtils

此类用于字符串,转化成其他类型的数据,此类内置支持的对象较少,貌似只有一些基本类型,不过可以通过Converter接口进行扩展,以下为网上传遍的DateConverter的一个简单实现,仅供参考

 

 

public class DateConverter implements Converter {

	public Object convert(Class arg0, Object arg1) {
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return sf.parse(arg1.toString());
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

}

 

测试的类如下:

 

 

public class ConvertTest {
	public static void main(String[] args) {
		ConvertUtils cu = new ConvertUtils();
		ConvertUtils.register(new DateConverter(),Date.class);
		Object result = ConvertUtils.convert("1999-9-9",Date.class);
		System.out.println(result);
		System.out.println(result instanceof Date);
	}
}

 

另外需要说明的是,ConvertUtils和Digester需要引入apache commons的一些jar包,具体见附件吧

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics