<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>冰月无霜</title>
    <description></description>
    <link>http://icemoon.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>字符编码笔记：ASCII，Unicode和UTF-8</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/213385" style="color:red;">http://icemoon.javaeye.com/blog/213385</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          字符编码是计算机技术的基石，想要熟练使用计算机，就必须懂得一点字符编码的知识。<br /><br />1. ASCII码<br /><br />我们知道，在计算机内部，所有的信息最终都表示为一个二进制的字符串。每一个二进制位（bit）有0和1两种状态，因此八个二进制位就可以组合出256种状态，这被称为一个字节（byte）。也就是说，一个字节一共可以用来表示256种不同的状态，每一个状态对应一个符号，就是256个符号，从0000000到11111111。<br /><br />上个世纪60年代，美国制定了一套字符编码，对英语字符与二进制位之间的关系，做了统一规定。这被称为ASCII码，一直沿用至今。<br /><br />ASCII码一共规定了128个字符的编码，比如空格“SPACE”是32（二进制00100000），大写的字母A是65（二进制01000001）。这128个符号（包括32个不能打印出来的控制符号），只占用了一个字节的后面7位，最前面的1位统一规定为0。<br /><br />2、非ASCII编码<br /><br />英语用128个符号编码就够了，但是用来表示其他语言，128个符号是不够的。比如，在法语中，字母上方有注音符号，它就无法用ASCII码表示。于是，一些欧洲国家就决定，利用字节中闲置的最高位编入新的符号。比如，法语中的é的编码为130（二进制10000010）。这样一来，这些欧洲国家使用的编码体系，可以表示最多256个符号。<br /><br />但是，这里又出现了新的问题。不同的国家有不同的字母，因此，哪怕它们都使用256个符号的编码方式，代表的字母却不一样。比如，130在法语编码中代表了é，在希伯来语编码中却代表了字母Gimel (ג)，在俄语编码中又会代表另一个符号。但是不管怎样，所有这些编码方式中，0—127表示的符号是一样的，不一样的只是128—255的这一段。<br /><br />至于亚洲国家的文字，使用的符号就更多了，汉字就多达10万左右。一个字节只能表示256种符号，肯定是不够的，就必须使用多个字节表达一个符号。比如，简体中文常见的编码方式是GB2312，使用两个字节表示一个汉字，所以理论上最多可以表示256x256=65536个符号。<br /><br />中文编码的问题需要专文讨论，这篇笔记不涉及。这里只指出，虽然都是用多个字节表示一个符号，但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。<br /><br />3.Unicode<br /><br />正如上一节所说，世界上存在着多种编码方式，同一个二进制数字可以被解释成不同的符号。因此，要想打开一个文本文件，就必须知道它的编码方式，否则用错误的编码方式解读，就会出现乱码。为什么电子邮件常常出现乱码？就是因为发信人和收信人使用的编码方式不一样。<br /><br />可以想象，如果有一种编码，将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码，那么乱码问题就会消失。这就是Unicode，就像它的名字都表示的，这是一种所有符号的编码。<br /><br />Unicode当然是一个很大的集合，现在的规模可以容纳100多万个符号。每个符号的编码都不一样，比如，U+0639表示阿拉伯字母Ain，U+0041表示英语的大写字母A，U+4E25表示汉字“严”。具体的符号对应表，可以查询unicode.org，或者专门的汉字对应表。 <br /><br />4. Unicode的问题<br /><br />需要注意的是，Unicode只是一个符号集，它只规定了符号的二进制代码，却没有规定这个二进制代码应该如何存储。<br /><br />比如，汉字“严”的unicode是十六进制数4E25，转换成二进制数足足有15位（100111000100101），也就是说这个符号的表示至少需要2个字节。表示其他更大的符号，可能需要3个字节或者4个字节，甚至更多。<br /><br />这里就有两个严重的问题，第一个问题是，如何才能区别unicode和ascii？计算机怎么知道三个字节表示一个符号，而不是分别表示三个符号呢？第二个问题是，我们已经知道，英文字母只用一个字节表示就够了，如果unicode统一规定，每个符号用三个或四个字节表示，那么每个英文字母前都必然有二到三个字节是0，这对于存储来说是极大的浪费，文本文件的大小会因此大出二三倍，这是无法接受的。<br /><br />它们造成的结果是：1）出现了unicode的多种存储方式，也就是说有许多种不同的二进制格式，可以用来表示unicode。2）unicode在很长一段时间内无法推广，直到互联网的出现。<br /><br />5.UTF-8<br /><br />互联网的普及，强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32，不过在互联网上基本不用。重复一遍，这里的关系是，UTF-8是Unicode的实现方式之一。<br /><br />UTF-8最大的一个特点，就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号，根据不同的符号而变化字节长度。<br /><br />UTF-8的编码规则很简单，只有二条：<br /><br />1）对于单字节的符号，字节的第一位设为0，后面7位为这个符号的unicode码。因此对于英语字母，UTF-8编码和ASCII码是相同的。<br /><br />2）对于n字节的符号（n>1），第一个字节的前n位都设为1，第n+1位设为0，后面字节的前两位一律设为10。剩下的没有提及的二进制位，全部为这个符号的unicode码。<br /><br />下表总结了编码规则，字母x表示可用编码的位。<br /><br />Unicode符号范围 | UTF-8编码方式<br />(十六进制) | （二进制）<br />--------------------+---------------------------------------------<br />0000 0000-0000 007F | 0xxxxxxx<br />0000 0080-0000 07FF | 110xxxxx 10xxxxxx<br />0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx<br />0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx<br /><br />下面，还是以汉字“严”为例，演示如何实现UTF-8编码。<br /><br />已知“严”的unicode是4E25（100111000100101），根据上表，可以发现4E25处在第三行的范围内（0000 0800-0000 FFFF），因此“严”的UTF-8编码需要三个字节，即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后，从“严”的最后一个二进制位开始，依次从后向前填入格式中的x，多出的位补0。这样就得到了，“严”的UTF-8编码是“11100100 10111000 10100101”，转换成十六进制就是E4B8A5。<br /><br />6. Unicode与UTF-8之间的转换<br /><br />通过上一节的例子，可以看到“严”的Unicode码是4E25，UTF-8编码是E4B8A5，两者是不一样的。它们之间的转换可以通过程序实现。<br /><br />在Windows平台下，有一个最简单的转化方法，就是使用内置的记事本小程序Notepad.exe。打开文件后，点击“文件”菜单中的“另存为”命令，会跳出一个对话框，在最底部有一个“编码”的下拉条。<br /><br /><br /><br />里面有四个选项：ANSI，Unicode，Unicode big endian 和 UTF-8。<br /><br />1）ANSI是默认的编码方式。对于英文文件是ASCII编码，对于简体中文文件是GB2312编码（只针对Windows简体中文版，如果是繁体中文版会采用Big5码）。<br /><br />2）Unicode编码指的是UCS-2编码方式，即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。<br /><br />3）Unicode big endian编码与上一个选项相对应。我在下一节会解释little endian和big endian的涵义。<br /><br />4）UTF-8编码，也就是上一节谈到的编码方法。<br /><br />选择完”编码方式“后，点击”保存“按钮，文件的编码方式就立刻转换好了。<br /><br />7. Little endian和Big endian<br /><br />上一节已经提到，Unicode码可以采用UCS-2格式直接存储。以汉字”严“为例，Unicode码是4E25，需要用两个字节存储，一个字节是4E，另一个字节是25。存储的时候，4E在前，25在后，就是Big endian方式；25在前，4E在后，就是Little endian方式。<br /><br />这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中，小人国里爆发了内战，战争起因是人们争论，吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情，前后爆发了六次战争，一个皇帝送了命，另一个皇帝丢了王位。<br /><br />因此，第一个字节在前，就是”大头方式“（Big endian），第二个字节在前就是”小头方式“（Little endian）。<br /><br />那么很自然的，就会出现一个问题：计算机怎么知道某一个文件到底采用哪一种方式编码？<br /><br />Unicode规范中定义，每一个文件的最前面分别加入一个表示编码顺序的字符，这个字符的名字叫做”零宽度非换行空格“（ZERO WIDTH NO-BREAK SPACE），用FEFF表示。这正好是两个字节，而且FF比FE大1。<br /><br />如果一个文本文件的头两个字节是FE FF，就表示该文件采用大头方式；如果头两个字节是FF FE，就表示该文件采用小头方式。<br /><br />8. 实例<br /><br />下面，举一个实例。<br /><br />打开”记事本“程序Notepad.exe，新建一个文本文件，内容就是一个”严“字，依次采用ANSI，Unicode，Unicode big endian 和 UTF-8编码方式保存。<br /><br />然后，用文本编辑软件UltraEdit中的”十六进制功能“，观察该文件的内部编码方式。<br /><br />1）ANSI：文件的编码就是两个字节“D1 CF”，这正是“严”的GB2312编码，这也暗示GB2312是采用大头方式存储的。<br /><br />2）Unicode：编码是四个字节“FF FE 25 4E”，其中“FF FE”表明是小头方式存储，真正的编码是4E25。<br /><br />3）Unicode big endian：编码是四个字节“FE FF 4E 25”，其中“FE FF”表明是大头方式存储。<br /><br />4）UTF-8：编码是六个字节“EF BB BF E4 B8 A5”，前三个字节“EF BB BF”表示这是UTF-8编码，后三个“E4B8A5”就是“严”的具体编码，它的存储顺序与编码顺序是一致的。<br /><br />9. 延伸阅读<br /><br />* The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets（关于字符集的最基本知识）<br /><br />* 谈谈Unicode编码<br /><br />* RFC3629：UTF-8, a transformation format of ISO 10646（如果实现UTF-8的规定）
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/213385#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jul 2008 11:38:45 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/213385</link>
        <guid>http://icemoon.javaeye.com/blog/213385</guid>
      </item>
      <item>
        <title>Generics(转载)</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/164087" style="color:red;">http://icemoon.javaeye.com/blog/164087</a>&nbsp;
          发表时间: 2008年02月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Generics<br />1) Introduction引言<br /> 1.1)为什么需要泛型?<br />Generics add stability to your code by making more of your bugs detectable at compile time. (泛型让你的bugs在编译期间就能被更多地发现。)<br />Compile-time bugs, for example, tell you immediately that something is wrong, you can use the compiler's error messages to figure out what the problem is and fix it; Runtime bugs, however, can be much more problematic; they don't always surface immediately, and when they do, it may be at a point in time that's far removed from the actual cause of the problem.<br />(举例来说，编译期的bugs，你能很快的得到错误信息，然后你可以根据出错提示知道问题所在并修复它；然后运行期的bugs就是一个难题，它们并不总是立刻显现出来，当它们出现在某一点的时候，可能离实际问题的根源已经很远了。)<br />1.2)关于本章泛型的学习<br />Some programmers choose to learn generics by studying the Java Collections Framework; after all, generics are heavily used by those classes. However, since we haven't yet covered collections, this chapter will focus primarily on simple "collections-like" examples that we'll design from scratch. This hands-on approach will teach you the necessary syntax and terminology while demonstrating the various kinds of problems that generics were designed to solve.<br />（一些程序员会能过学习collections来掌握generics。因为这些类过于复杂，我们在本章节我们主要的介绍一类似于”collections-like”的例子。作为一种过渡方法，它将教给你关于泛型概念必要的语法和术语。）<br />1.3)一个小例子让我们先看一个非Generics的例子中是如何出现run-time的bug<br />Box类能处理任何类型的对象<br /> public class Box {<br />        private Object object;<br />        public void add(Object object) {<br />            this.object = object;<br />        }<br />        public Object get() {<br />            return object;<br />        }<br />    }<br />当我们要求它处理整型时，可能会有这样的用法：<br />public class BoxDemo1 {<br />    public static void main(String[] args) {<br />        // ONLY place Integer objects into this box!<br />        Box integerBox = new Box();<br />        integerBox.add(new Integer(10));<br />        Integer someInteger = (Integer)integerBox.get();<br />        System.out.println(someInteger);<br />    }<br />}<br /> <br />但有时一个粗心的程序员也可能要求它处理String，但却这样用了<br />public class BoxDemo2 {<br />    public static void main(String[] args) {<br />        // ONLY place Integer objects into this box!<br />        Box integerBox = new Box();<br />        // Imagine this is one part of a large application<br />        // modified by one programmer.<br />        integerBox.add("10"); // note how the type is now String<br />        // ... and this is another, perhaps written<br />        // by a different programmer<br />        Integer someInteger = (Integer)integerBox.get();<br />        System.out.println(someInteger);<br />    }<br />}<br />编译此程序,在编译期间，编译器总是假设强制类型转换是正确的，只有在运行时候，你才能得到下列信息:<br />Exception in thread "main"<br />         java.lang.ClassCastException: <br />            java.lang.String cannot be cast to java.lang.Integer<br />            at BoxDemo2.main(BoxDemo2.java:6)<br />If the Box class had been designed with generics in mind, this mistake would have been caught by the compiler, instead of crashing the application at runtime<br />(如果Box类用泛型来定义，那么这样的错误将在编译期被抓住，而不是在程序运行时候crash。下一节我们将看看什么泛型类型的定义。)<br /> <br />2) Generic Types<br /> 2.1)定义泛型类<br />We introduces type variable, named T, that can be used anywhere inside the class. Just think of T as a special kind of variable, whose "value" will be whatever type you pass in; Also, It just can't be any of the primitive data types.<br />(我们引入一个名叫T的类型变量，它在类中的任何地方使用。你可以把T认为是一种特殊类型的变量，它的值可以任何你想传入的类型，当然，T不能接受任何原始数据类型。)<br />/**<br />* Generic version of the Box class.<br />**/<br />public class Box&lt;T> {<br />    private T t; // T stands for "Type"         <br />    public void add(T t) {<br />        this.t = t;<br />    }<br />    public T get() {<br />        return t;<br />    }<br />}<br />2.2)实例化一个泛型类<br />To instantiate this class, use the new keyword, as usual, but place &lt;Integer> between the class name and the parenthesis;<br />Box&lt;Integer> integerBox = new Box&lt;Integer>();<br />（实例化一个泛类，要用到一个新的关键字，仅仅是加了&lt;Integer>在类名和()之间。）<br />2.3)使用这个泛型<br />public class BoxDemo3 {<br />    public static void main(String[] args) {<br />        Box&lt;Integer> integerBox = new Box&lt;Integer>();<br />        integerBox.add(new Integer(10));<br />        Integer someInteger = integerBox.get(); // no cast!<br />        System.out.println(someInteger);<br />    }<br />}<br />注意在泛型类中我们并没有象非泛型那样使用强制类型转换(Cast Type)。另一方面就象我们分析泛型所应有的优点那样，如果你试图加一个不兼容的类型到这个box类中，比如说String那么就会在编译期得到错误报告。<br />public class BoxDemo3 {<br />    public static void main(String[] args) {<br />        Box&lt;Integer> integerBox = new Box&lt;Integer>();<br />        integerBox.add(“10”);<br />       String someInteger = integerBox.get(); // no cast!<br />        System.out.println(someInteger);<br />    }<br />}<br />你将会得到一个错误的编译信息<br />BoxDemo3.java:5: add(java.lang.Integer) in Box&lt;java.lang.Integer>   <br />    cannot be applied to (java.lang.String)<br />        integerBox.add("10");<br />               ^<br />    1 error<br />2.4)理解泛型<br />In the above examples, you won't find T.java or T.class anywhere on the filesystem. Furthermore, T is not a part of the Box class name. In fact during compilation, all generic information will be removed entirely, leaving only Box.class on the filesystem.<br />(在上面的例子中，你不能在文件中发现T.java或T.class。而且T根本就不是Box类名的一部分。事实上，在编译期，所有的泛型信息将会被整个移去，只有与泛型类型相对应的Box.class文件存在。)<br />2.5)泛型参数的命名约定 Type Parameter Naming Conventions<br />E - Element (used extensively by the Java Collections Framework)<br />K – Key<br />N – Number<br />T – Type<br />V – Value<br />S,U,V etc. - 2nd, 3rd, 4th types<br /> <br />Also note that a generic type may have multiple type parameters, but each parameter must be unique within its declaring class or interface. A declaration of Box&lt;T,T>, for example, would generate an error on the second occurrence of T, but Box&lt;T,U>, however, would be allowed.<br />(泛型允许有多个类型参数，但每个类型参数必须是在同一个声明类中是独一无二的。如Box&lt;T,T>的声明就会引起一个编译错误，而Box&lt;T,U>才是被允许形式。)<br />3)泛型方法与构造函数Generic Methods and Constructors<br />Type parameters can also be declared within method and constructor signatures to create generic methods and generic constructors. This is similar to declaring a generic type, but the type parameter's scope is limited to the method or constructor in which it's declared.<br />泛型参数也可以允许在方法和构造中定义，-这时方法和构造就被称之谓泛型方法和泛型参数。类似于泛型类的定义，但是在方法和构造中所定义的类型参数的作用域只能在定义它们的方法和构造中。<br />/**<br />* This version introduces a generic method.<br />*/<br />public class Box&lt;T> {<br />    private T t;         <br />    public void add(T t) {<br />        this.t = t;<br />    }<br />    public T get() {<br />        return t;<br />    }<br />    public &lt;U> void inspect(U u){<br />        System.out.println("T: " + t.getClass().getName());<br />        System.out.println("U: " + u.getClass().getName());<br />    }<br />    public static void main(String[] args) {<br />        Box&lt;Integer> integerBox = new Box&lt;Integer>();<br />        integerBox.add(new Integer(10));<br />        integerBox.inspect("some text");<br />    }<br />By passing in different types, the output will change accordingly. <br />( inspect( )传入不同的类型，将会得到相应的结果。)<br />4)限制类型参数Bounded Type Parameters<br />4.1)There may be times when you'll want to restrict the kinds of types that are allowed to be passed to a type parameter. For example, a method that operates on numbers might only want to accept instances of Number or its subclasses. (很多情况下，你需要限制你允许传给类型参数的种类。比如，一个操作各种Number类的方法可能仅仅需要接收Number类或者它的子类对象。)<br />To declare a bounded type parameter, list the type parameter's name, followed by the extends keyword, followed by its upper bound, which in this example is Number. Note that, in this context, extends is used in a general sense to mean either "extends" (as in classes) or "implements" (as in interfaces).<br /> (要定义一个限定的类型参数，需要列出这个类型参数名,后面跟上extends关键字，最后加上限边界类名upper bound，在本例中，这个upper bound 是Number。注意：在这里，extends被用作一个广泛的含义既可以是extends,当upper bound是一个类时，也可以是implements当upper bound 是一个接口。 如下面的例子)<br />/**<br />* This version introduces a bounded type parameter.<br />*/<br />public class Box&lt;T> {<br />    private T t;         <br />    public void add(T t) {<br />        this.t = t;<br />    }<br />    public T get() {<br />        return t;<br />    }<br />    public &lt;U extends Number> void inspect(U u){<br />        System.out.println("T: " + t.getClass().getName());<br />        System.out.println("U: " + u.getClass().getName());<br />    }<br />    public static void main(String[] args) {<br />        Box&lt;Integer> integerBox = new Box&lt;Integer>();<br />        integerBox.add(new Integer(10));<br />        integerBox.inspect("some text"); // error: this is still String! <br />    }<br />这时候，如果我们编译该程序的话，会在编译期得到下面的出错信息。<br />Box.java:21: &lt;U>inspect(U) in Box&lt;java.lang.Integer> cannot<br /> be applied to (java.lang.String)<br />                        integerBox.inspect("10");<br />                                  ^<br />1 error<br />4.2)多重界定<br />To specify additional interfaces that must be implemented, use the & character, as in: <br />&lt;U extends Number & MyInterface><br /> <br /> <br />5)泛类-子类型Subtyping<br />5.1) Is a relation of Class<br />As you already know, it's possible to assign an object of one type to an object of another type provided that the types are compatible. For example, you can assign an Integer to an Object, since Object is one of Integer's supertypes: <br />    Object someObject = new Object();<br />    Integer someInteger = new Integer(10);<br />    someObject = someInteger; // OK<br />(就象你已经知道的，可以给一个对象分配一个与它类型兼容的对象。如：你能把Integer分配给一个Object,因为Object是Integer的父类。)<br />5.2) Is a relation of Generic<br />The same is also true with generics. You can perform a generic type invocation, passing Number as its type argument and any subsequent invocation of add will be allowed if the argument is compatible with Number: <br />    Box&lt;Number> box = new Box&lt;Number>();<br />    box.add(new Integer(10)); // OK<br />    box.add(new Double(10.1)); // OK<br />(这个规则也适用于generics。你能定义一个generic类，以Number作为类型参数，那么你就可以用add方法传递任何与Number相兼容的类型。)<br />5.3)泛型类作为一个参数<br />Now consider the following method: <br />(现在考虑下面的方法:)<br />    public void boxTest(Box&lt;Number> n){<br />        // method body omitted <br />    }<br />What type of argument does it accept? By looking at its signature, we can see that it accepts a single argument whose type is Box&lt;Number>. Are you allowed to pass in Box&lt;Integer> or Box&lt;Double>, as you might expect? Surprisingly, the answer is "no", because Box&lt;Integer> and Box&lt;Double> are not subtypes of Box&lt;Number>.<br />(它能接受哪一种参数？通过它的定义，我们能知道它接受简单的参数Box&lt;Number>.猜想一下是否可以传入Box&lt;Integer> or Box&lt;Double>？答案是“不行”，因为Box&lt;Integer> or Box&lt;Double>不是Box&lt;Number>的子类。<br />如下面的代码片段：<br />Box&lt;Number> box=new Box&lt;Number>;<br />Box&lt;Integer> intBox=new Box&lt;Integer>;<br />Box&lt;Double> douBox=new Box&lt;Double>;<br />box=intBox; //compiler error<br />box=douBox; //compiler error<br />)<br /> <br />5)泛类-通配符Wildcards<br />结合日常实际,你可以把泛型想象成一个更为实际的东西----笼子。<br />针对第4点的编译错误，我们能用下面的定义解决：<br />Box&lt;? Extends Number> someBox=…;<br />In generics, an unknown type is represented by the wildcard character "?". <br />To specify a cage capable of holding some kind of animal: <br />       Cage&lt;? extends Animal> someCage = ...;<br />Read "? extends Animal" as "an unknown type that is a subtype of Animal, possibly Animal itself".<br />(在泛型中，通配符?能表示一个未知类型。比如为你可以定义一个泛类（动物类的笼子）来存放不同动物的笼子。”? extends Animal” 表示解读是动物类的一个未知子类，也可能是动物类自己。)<br />Note: It's also possible to specify a lower bound by using the super keyword instead of extends. The code &lt;? super Animal>, therefore, would be read as "an unknown type that is a supertype of Animal, possibly Animal itself". You can also specify an unknown type with an unbounded wildcard, which simply looks like &lt;?>. An unbounded wildcard is essentially the same as saying &lt;? extends Object>.<br />(注意：也可以用super来指定一个下界类, 因此&lt;?super Animal>将会被解读为’是动物类的一个未知的父类，也可能是Animal类自己’。还可以指定一个没有上下界定的通配符，就象这样&lt;?>表示的意思是&lt;? extends Object>)。<br />Box&lt;? extends Number> box=new Box&lt;? extends Number>;<br />Box&lt;Integer> intBox=new Box&lt;Integer>;<br />Box&lt;Double> douBox=new Box&lt;Double>;<br />box=intBox; //compiler OK<br />box=douBox; //compiler OK<br />(对此我们可以这样理解，尽管Box&lt;Integer>和Box&lt;Double>不是Box&lt;Number>的子类，但是它们在事实上可以认为是Box&lt;? extends Number>的子类。那接下来的问题是我们能否把<br />box.add(new Integer(10)); //compiler error<br />box.add(new Double(10.34));//compiler error<br />我们可以用笼子理论来解释这种行为,box定义为可以关各种动物类及其子类的笼子，所以作为笼子类它可以表示其它动物类的笼子。所以box=intBox;正确地。但是如果你想把各种动物关进这一种叫动物类的笼子，就不合适了。所以box.add(new Integer(10))是不正确的。<br />那么我们如何使用box类呢？它是无用的吗？当然不是。你可以定义这样的一方法<br />public void testBox(Box&lt;? extends Number> n){<br />    System.out.print("invoke-cage-class,you can try pass GenericBox&lt;Integer>");<br />}<br />应用如下：<br />Box&lt;? extends Number> box=new Box&lt;? extends Number>;<br />Box&lt;Integer> intBox=new Box&lt;Integer>;<br />Box&lt;Double> douBox=new Box&lt;Double>;<br />box=intBox; //compiler OK<br />box=douBox; //compiler OK<br />testBox(intBox);//compiler OK<br />testBox(douBox);//compiler OK<br />(注这节，本人现在并不太了解，它什么用意，能这样传输泛类目的何在?2007-6-14)<br /> <br /> <br /> <br />6)泛类的擦除Type Erasure<br />6.1) 什么叫类擦除技术?When a generic type is instantiated, the compiler translates those types by a technique called type erasure — a process where the compiler removes all information related to type parameters and type arguments within a class or method. Type erasure enables Java applications that use generics to maintain binary compatibility with Java libraries and applications that were created before generics.<br />(当一个泛型类被实例化时，编译器会通过一种叫类擦除的技术转换类参数---会在类或方法中移除所有关于类型参数的信息。类擦除技术能使Java采用泛型的应用程序去兼容未使用泛型类的Java库和Java应用程序。)<br />For instance, Box&lt;String> is translated to type Box, which is called the raw type — a raw type is a generic class or interface name without any type arguments. This means that you can't find out what type of Object a generic class is using at runtime. The following operations are not possible: <br />(举例来说，Box&lt;String>在编译时会被转换成Box类,被叫做原始类---原始类就是一个没有任何类参数的泛型类或泛型接口。那就意味着你不可能在运行时刻发现任何泛型类对象。下面的操作是不可能通过的：)<br />public class MyClass&lt;E> {<br />    public static void myMethod(Object item) {<br />        if (item instanceof E) { //Compiler error<br />            ...<br />        }<br />        E item2 = new E();   //Compiler error<br />        E[ ] iArray = new E[10]; //Compiler error<br />        E obj = (E)new Object(); //Unchecked cast warning<br />    }<br />}<br />The operations shown in bold are meaningless at runtime because the compiler removes all information about the actual type argument (represented by the type parameter E) at compile time.<br />(在上面黑体部分的操作在运行期是无意义的，因为编译器在编译期就把实际的类参数（即E）全部移走了。)<br />6.2)类擦除存在的意义<br />Type erasure exists so that new code may continue to interface with legacy code. Using a raw type for any other reason is considered bad programming practice and should be avoided whenever possible. <br />When mixing legacy code with generic code, you may encounter warning messages similar to the following: <br />Note: WarningDemo.java uses unchecked or unsafe operations.<br />Note: Recompile with -Xlint:unchecked for details.<br />(正是因为类擦除的存在所以新代码才能继续使用老的遗留代码，比如在下面的例子中Integer类型符号在编译时会被除去，从而可以继续使用老库中非泛型的方法。但要注意它会返一个warning)<br />public class WarningDemo {<br />    public static void main(String[] args){<br />        Box&lt;Integer> bi;<br />        bi = createBox();   <br />    }<br />    /**<br />     * Pretend that this method is part of an old library,<br />     * written before generics. It returns Box instead of Box&lt;T>.<br />     */<br />    static Box createBox(){<br />        return new Box();<br />    }<br />}<br />Recompiling with -Xlint:unchecked reveals the following additional information: <br />WarningDemo.java:4: warning: [unchecked] unchecked conversion<br />found   : Box<br />required: Box&lt;java.lang.Integer><br />        bi = createBox();<br />                      ^<br />1 warning<br />7)Exercise . Design a class that acts as a library for the following kinds of media: book, video, and newspaper. Provide one version of the class that uses generics and one that does not. Feel free to use any additional APIs for storing and retrieving the media. <br /> <br />Answer 1: <br />Non-Generic Version <br />import java.util.List;<br />import java.util.ArrayList;<br />public class Library {<br />    private List resources = new ArrayList();<br />    public void addMedia(Media x) {<br />        resources.add(x);<br />    }<br />    public Media retrieveLast() {<br />        int size = resources.size();<br />        if (size > 0) {<br />            return (Media)resources.get(size - 1);<br />        }<br />        return null;<br />    }<br />}<br /> <br />interface Media {<br />}<br />interface Book extends Media {<br />}<br />interface Video extends Media {<br />}<br />interface Newspaper extends Media {<br />}<br /> <br />Generic Version <br />import java.util.List;<br />import java.util.ArrayList;<br /> <br />public class Library&lt;E extends Media> {<br />    private List&lt;E> resources = new ArrayList&lt;E>();<br />    public void addMedia(E x) {<br />        resources.add(x);<br />    }<br />    public E retrieveLast() {<br />        int size = resources.size();<br />        if (size > 0) {<br />            return resources.get(size - 1);<br />        }<br />        return null;<br />    }<br />}
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/164087#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Feb 2008 09:40:27 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/164087</link>
        <guid>http://icemoon.javaeye.com/blog/164087</guid>
      </item>
      <item>
        <title>linux 常用命令</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/125966" style="color:red;">http://icemoon.javaeye.com/blog/125966</a>&nbsp;
          发表时间: 2007年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h4><span lang="EN-US">Linux</span><span style="FONT-FAMILY: 宋体">文件的复制、删除和移动命令</span><span lang="EN-US">&nbsp; <br />
<br />
</span><span lang="EN-US"><strong>cp</strong></span><strong><span style="FONT-FAMILY: 宋体">命令</span></strong><span lang="EN-US"> </span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">该命令的功能是将给出的文件或目录拷贝到另一文件或目录中，同</span><span lang="EN-US">MSDOS</span><span style="FONT-FAMILY: 宋体">下的</span><span lang="EN-US">copy</span><span style="FONT-FAMILY: 宋体">命令一样，功能十分强大。</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">语法：</span><span lang="EN-US"> cp [</span><span style="FONT-FAMILY: 宋体">选项</span><span lang="EN-US">] </span><span style="FONT-FAMILY: 宋体">源文件或目录</span> <span style="FONT-FAMILY: 宋体">目标文件或目录</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">说明：该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">该命令的各选项含义如下：</span></p>
<p class="MsoNormal"><span lang="EN-US">- a </span><span style="FONT-FAMILY: 宋体">该选项通常在拷贝目录时使用。它保留链接、文件属性，并递归地拷贝目录，其作用等于</span><span lang="EN-US">dpR</span><span style="FONT-FAMILY: 宋体">选项的组合。</span></p>
<p class="MsoNormal"><span lang="EN-US">- d </span><span style="FONT-FAMILY: 宋体">拷贝时保留链接。</span></p>
<p class="MsoNormal"><span lang="EN-US">- f </span><span style="FONT-FAMILY: 宋体">删除已经存在的目标文件而不提示。</span></p>
<p class="MsoNormal"><span lang="EN-US">- i </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">f</span><span style="FONT-FAMILY: 宋体">选项相反，在覆盖目标文件之前将给出提示要求用户确认。回答</span><span lang="EN-US">y</span><span style="FONT-FAMILY: 宋体">时目标文件将被覆盖，是交互式拷贝。</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">- p </span><span style="FONT-FAMILY: 宋体">此时</span><span lang="EN-US">cp</span><span style="FONT-FAMILY: 宋体">除复制源文件的内容外，还将把其修改时间和访问权限也复制到新文件中。</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">- r </span><span style="FONT-FAMILY: 宋体">若给出的源文件是一目录文件，此时</span><span lang="EN-US">cp</span><span style="FONT-FAMILY: 宋体">将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。</span></p>
<p class="MsoNormal"><span lang="EN-US">- l </span><span style="FONT-FAMILY: 宋体">不作拷贝，只是链接文件。</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">　　需要说明的是，为防止用户在不经意的情况下用</span><span lang="EN-US">cp</span><span style="FONT-FAMILY: 宋体">命令破坏另一个文件，如用户指定的目标文件名已存在，用</span><span lang="EN-US">cp</span><span style="FONT-FAMILY: 宋体">命令拷贝文件后，这个文件就会被新源文件覆盖，因此，建议用户在使用</span><span lang="EN-US">cp</span><span style="FONT-FAMILY: 宋体">命令拷贝文件时，最好使用</span><span lang="EN-US">i</span><span style="FONT-FAMILY: 宋体">选项。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体"></span></p>
<span style="FONT-FAMILY: 宋体">
<p class="MsoNormal"><span lang="EN-US"><strong>mv</strong></span><strong><span style="FONT-FAMILY: 宋体">命令</span></strong></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">用户可以使用</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令如同</span><span lang="EN-US">MSDOS</span><span style="FONT-FAMILY: 宋体">下的</span><span lang="EN-US">ren</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">move</span><span style="FONT-FAMILY: 宋体">的组合。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">语法：</span><span lang="EN-US">mv [</span><span style="FONT-FAMILY: 宋体">选项</span><span lang="EN-US">] </span><span style="FONT-FAMILY: 宋体">源文件或目录</span> <span style="FONT-FAMILY: 宋体">目标文件或目录</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">说明：视</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">命令中第二个参数类型的不同（是目标文件还是目标目录），</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时，</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">命令完成文件重命名，此时，源文件只能有一个（也可以是源目录名），它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时，源文件或目录参数可以有多个，</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时，</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">先拷贝，再将原有文件删除，而链至该文件的链接也将丢失。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">命令中各选项的含义为：</span></p>
<p class="MsoNormal"><span lang="EN-US">- I </span><span style="FONT-FAMILY: 宋体">交互方式操作。如果</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">操作将导致对已存在的目标文件的覆盖，此时系统询问是否重写，要求用户回答</span><span lang="EN-US">y</span><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US">n</span><span style="FONT-FAMILY: 宋体">，这样可以避免误覆盖文件。</span></p>
<p class="MsoNormal"><span lang="EN-US">- f </span><span style="FONT-FAMILY: 宋体">禁止交互操作。在</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">操作要覆盖某已有的目标文件时不给任何指示，指定此选项后，</span><span lang="EN-US">i</span><span style="FONT-FAMILY: 宋体">选项将不再起作用。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果所给目标文件（不是目录）已存在，此时该文件的内容将被新文件覆盖。为防止用户用</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">命令破坏另一个文件，使用</span><span lang="EN-US">mv</span><span style="FONT-FAMILY: 宋体">命令移动文件时，最好使用</span><span lang="EN-US">i</span><span style="FONT-FAMILY: 宋体">选项。</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US"></span>&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US"><strong>rm</strong></span><strong><span style="FONT-FAMILY: 宋体">命令</span></strong></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">用户可以用</span><span lang="EN-US">rm</span><span style="FONT-FAMILY: 宋体">命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录，它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件，只是断开了链接，原文件保持不变。</span></p>
<p class="MsoNormal"><span lang="EN-US">rm</span><span style="FONT-FAMILY: 宋体">命令的一般形式为：</span></p>
<p class="MsoNormal"><span lang="EN-US">rm [</span><span style="FONT-FAMILY: 宋体">选项</span><span lang="EN-US">] </span><span style="FONT-FAMILY: 宋体">文件&hellip;</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果没有使用</span><span lang="EN-US">- r</span><span style="FONT-FAMILY: 宋体">选项，则</span><span lang="EN-US">rm</span><span style="FONT-FAMILY: 宋体">不会删除目录。</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">该命令的各选项含义如下：</span></p>
<p class="MsoNormal"><span lang="EN-US">- f </span><span style="FONT-FAMILY: 宋体">忽略不存在的文件，从不给出提示。</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span lang="EN-US">- r </span><span style="FONT-FAMILY: 宋体">指示</span><span lang="EN-US">rm</span><span style="FONT-FAMILY: 宋体">将参数中列出的全部目录和子目录均递归地删除。</span></p>
<p class="MsoNormal"><span lang="EN-US">- i </span><span style="FONT-FAMILY: 宋体">进行交互式删除。</span><span lang="EN-US"> </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN-US">rm</span><span style="FONT-FAMILY: 宋体">命令要小心。因为一旦文件被删除，它是不能被恢复的。了防止这种情况的发生，可以使用</span><span lang="EN-US">i</span><span style="FONT-FAMILY: 宋体">选项来逐个确认要删除的文件。如果用户输入</span><span lang="EN-US">y</span><span style="FONT-FAMILY: 宋体">，文件将被删除。如果输入任何其他东西，文件则不会删除。</span></p>
</span>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/125966#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Sep 2007 16:20:29 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/125966</link>
        <guid>http://icemoon.javaeye.com/blog/125966</guid>
      </item>
      <item>
        <title>大家来探讨一下视图的优点，用法</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/123268" style="color:red;">http://icemoon.javaeye.com/blog/123268</a>&nbsp;
          发表时间: 2007年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>视图介绍：<font face="Arial"><a href="http://www.itisedu.com/phrase/200603141659315.html">http://www.itisedu.com/phrase/200603141659315.html</a></font></p>
<p>今天了解了一下视图，觉得视图是个很不错的东西，在项目中应该会很有价值， 可是在以前的项目中都基本上没有用到视图。我想，引入视图对于项目的可维护性会有一定的帮助，大家一起来探讨下视图的用法，优点和缺点</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/123268#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Sep 2007 13:50:37 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/123268</link>
        <guid>http://icemoon.javaeye.com/blog/123268</guid>
      </item>
      <item>
        <title>验证框架中需要解决的问题</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/123245" style="color:red;">http://icemoon.javaeye.com/blog/123245</a>&nbsp;
          发表时间: 2007年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">验证框架中需要解决的问题：<br />
&nbsp;&nbsp;&nbsp; （1）对于每个验证，需要指定INPUT页面；<br />
&nbsp;&nbsp;&nbsp; （2）指定方法验证；<br />
&nbsp;&nbsp;&nbsp; （3）验证错误信息的显示；<br />
&nbsp;&nbsp;&nbsp; （4）客户端验证；<br />
&nbsp;&nbsp;&nbsp; （5）服务器端验证；<br />
&nbsp;&nbsp;&nbsp; （6）创建和编辑通常是同一个页面；</font>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/123245#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Sep 2007 12:58:54 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/123245</link>
        <guid>http://icemoon.javaeye.com/blog/123245</guid>
      </item>
      <item>
        <title>文件上传中需要解决的问题</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/123207" style="color:red;">http://icemoon.javaeye.com/blog/123207</a>&nbsp;
          发表时间: 2007年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">1.图片上传：<br />
&nbsp;&nbsp;&nbsp; （1）限制文件的大小；（客户端， 服务器端）<br />
&nbsp;&nbsp;&nbsp; （2）限制文件的格式；（客户端， 服务器端）<br />
&nbsp;&nbsp;&nbsp; （3）图片是有高度和宽度的<br />
&nbsp;&nbsp;&nbsp; （4）图片的MIMETYPE必须是正确的，否则无法上传。(那么，在更新的时候，就不合适了)<br />
&nbsp;&nbsp;&nbsp; （5）文件上传后如何命名？<br />
&nbsp;&nbsp;&nbsp; （6）文件上传后保存的路径？<br />
&nbsp;&nbsp;&nbsp; （7）对于已经上传的图片，要在查看和编辑页面显示出来，并可以在编辑页面删除。<br />
&nbsp;&nbsp;&nbsp; （8）在某些情况下会需要多文件上传。<br />
&nbsp;&nbsp;&nbsp; （9）当然，对文件的验证，只是在有上传文件时才验证。如果没有上传文件，就不执行验证操作。</font></p>
<p>&nbsp;</p>
<p>&nbsp; 注：在有多个图片时，可能还需要指定显示的顺序</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/123207#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Sep 2007 11:40:58 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/123207</link>
        <guid>http://icemoon.javaeye.com/blog/123207</guid>
      </item>
      <item>
        <title>弹出新页面,操作后自己关闭并使父窗体跳转到相应界面 </title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/122917" style="color:red;">http://icemoon.javaeye.com/blog/122917</a>&nbsp;
          发表时间: 2007年09月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="3" color="#000000" face="Times New Roman">string Url=null;</font><br />
<font size="3" color="#000000" face="Times New Roman">Url = Request.ApplicationPath+&quot;/CheckList/FireCheckList.aspx?State=1&quot;;<br />
</font><font size="3" color="#000000" face="Times New Roman"><font size="3" color="#000000" face="Times New Roman">Response.Write(&quot;&lt;script language='javascript'&gt;window.opener.Form1.submit();&lt;/script&gt;&quot;);<br />
Response.Write(&quot;&lt;script language='javascript'&gt;window.opener.location.href='&quot;+Url+&quot;';&lt;/script&gt;&quot;) ; <br />
Response.Write(&quot;&lt;script language='javascript'&gt;window.opener=null;window.close();&lt;/script&gt;&quot;);</font></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/122917#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Sep 2007 16:12:04 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/122917</link>
        <guid>http://icemoon.javaeye.com/blog/122917</guid>
      </item>
      <item>
        <title>mysql 的last_insert_id()函数</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/122904" style="color:red;">http://icemoon.javaeye.com/blog/122904</a>&nbsp;
          发表时间: 2007年09月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在MYSQL中，有last_insert_id()这个函数，用来取得最后一次执行插入操作时的自增长的ID。必须紧跟在插入语句之后使用。不然查出来的ID为NULL。
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/122904#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Sep 2007 14:53:16 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/122904</link>
        <guid>http://icemoon.javaeye.com/blog/122904</guid>
      </item>
      <item>
        <title>备份和拷贝数据库</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/122763" style="color:red;">http://icemoon.javaeye.com/blog/122763</a>&nbsp;
          发表时间: 2007年09月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我用的是Mysql Front， 选中数据库，右键&quot;输出/export&quot;为SQL,即可导出数据库，也可以当成是数据库的备份文件。有了这个文件，日后即使你的数据库没了，也可以通过该文件进行回复。</p>
<p>导出时有几个选项，其中，&quot;结构&quot;表示导出表结构，&ldquo;数据&rdquo;表示导出表中的数据，&quot;创建前删除数据&quot;选择该项时要小心，我今天就是选了这项，然后在新建的数据库中导入该SQL文件时，把原来的数据库删除掉了。</p>
<p>另外，还有一个用处是通过MYSQL FRONT可以导出数据字典，选择数据库，右键&ldquo;导出/export&rdquo;为HTML,即可导出HTML文件的数据字典，如果有乱码，可以在导出时选择编码为ANSI。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/122763#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Sep 2007 09:26:45 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/122763</link>
        <guid>http://icemoon.javaeye.com/blog/122763</guid>
      </item>
      <item>
        <title>需求分析和系统设计小结</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/116180" style="color:red;">http://icemoon.javaeye.com/blog/116180</a>&nbsp;
          发表时间: 2007年08月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>上周在写需求分析文档，这周写设计文档。做的很烂。以下是一个小结：</p>
<p>1）找出领域模型</p>
<p>2）在需求分析阶段，先找出用例，画出用例图，一开始，用例的粒度不宜太细，以免看不清主线。</p>
<p>3）需求分析先要确定业务上的需求，业务规则，有哪些约束条件。</p>
<p>4）描述&ldquo;为什么&rdquo;</p>
<p>5）抓住主线，列出用例。</p>
<p>6）对用例进行扩展。</p>
<p>7）列出可能的扩展需求</p>
<p>&nbsp;</p>
<p>设计阶段：</p>
<p>1）画出用例图</p>
<p>2）画出状态图</p>
<p>3）画出实体类图</p>
<p>4）画出序列图</p>
<p>5）定义数据字典和ER图</p>
<p>6）对照用例，每个用例都走一遍，看是否能走通，有没有什么问题</p>
<p>7）设计要做到什么程度：自己心中非常有底，非常有信心，而不能自己心里都是虚的，没什么底。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/116180#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 24 Aug 2007 15:40:40 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/116180</link>
        <guid>http://icemoon.javaeye.com/blog/116180</guid>
      </item>
      <item>
        <title>需求分析学习笔记</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/112270" style="color:red;">http://icemoon.javaeye.com/blog/112270</a>&nbsp;
          发表时间: 2007年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><font face="Arial">在可行性分析阶段，主要是对新系统的基本思想和过程进行初步的分析和论证，对系统的基本功能，性能，开发时间的限制，人员安排，投资情况做一个客观的分析。</font></font></p>
<p>在需求分析阶段，要对在可行性分析阶段确定的系统目标和功能作进一步详细的描述，确定系统&ldquo;做什么&rdquo;的问题。</p>
<p>一。需求分析一般的实现步骤：</p>
<p>（1）获得当前系统的物理模型。物理模型是对当前系统的真实写照。首先要对现行系统进行分析，理解，了解它的组织情况，数据流向，输入输出，资源利用情况等，在分析的基础上画出它的物理模型。</p>
<p>（2）抽象出当前系统的逻辑模型。逻辑模型是在物理模型的基础上，去掉次要的东西，建立起反映系统本质的逻辑模型。</p>
<p>（3）建立目标系统的逻辑模型。分析目标系统和当前系统逻辑上的区别，建立符合用户需求的目标系统的逻辑模型。</p>
<p>（4）补充目标系统的逻辑模型。对目标系统进行补充完善，加上一些次要的因素，例如出错处理。</p>
<p>&nbsp;</p>
<p>二。需求分析的具体任务是：</p>
<p>1.确定系统的综合要求：</p>
<p>（1）确定系统功能要求。这是最主要的需求，确定系统必须实现的所有功能。</p>
<p>（2）确定系统性能要求。应就具体系统而言。例如可靠性，联机系统的响应时间，存储容量，安全性能等。</p>
<p>（3）确定系统运行要求。主要是系统运行时要求，如系统软件，数据库管理系统，外存，数据通信接口等。</p>
<p>（4）将来可能扩展的要求。对将来可能的扩充作预准备。</p>
<p>2.分析系统的数据要求：</p>
<p>软件系统本质上是信息处理系统，因此，必须考虑：</p>
<p>（1）数据（需要哪些数据，数据间联系，数据性质，数据结构等）</p>
<p>（2）数据处理（处理的类型，处理的逻辑功能等）</p>
<p>（3）导出系统的逻辑模型。通常系统的逻辑模型用DFD（Data Flow Diagram）图描述。</p>
<p>（4）修正系统的开发计划。通过需求分析对系统的进度和成本有了更精确的估算，因此可以进一步修改开发计划。</p>
<p>三。需求分析的过程：</p>
<p>（1）问题识别：双方确定系统的综合需求。包括功能需求，性能需求，运行时需求，扩张需求，用户界面需求，安全需求，可靠性，保密性，可维护性，可移植性等需求。</p>
<p>（2）分析与综合：导出系统的逻辑模型。</p>
<p>（3）编写文档：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。需求说明书</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。初步用户使用手册</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。确认测试计划</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。修改完善项目开发计划</p>
<p>（4）分析评审：对功能的正确性，完整性，清晰性和其它需求进行复查和评审。</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/112270#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Aug 2007 23:09:17 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/112270</link>
        <guid>http://icemoon.javaeye.com/blog/112270</guid>
      </item>
      <item>
        <title>WEBFX XTREE学习笔记</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/110526" style="color:red;">http://icemoon.javaeye.com/blog/110526</a>&nbsp;
          发表时间: 2007年08月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.XTREE简介：</p>
<p>XTREE是一个基于AJAX实现的树形菜单。它的原理就是每次都只加载当前结点下的所有结点，而对开发人员来说，就是只需要按一定的格式，生成一段XML代码。XTREE可以自己定制每个结点的ICON和链接。XTREE是基于对象的，通过XTREE，你无需再自己生成HTML代码，而只要生成相应的JS 对象就可以了。</p>
<p>2.官方网址：</p>
<p><font face="Arial"><a href="http://webfx.eae.net/dhtml/xtree/index.html">http://webfx.eae.net/dhtml/xtree/index.html</a>，可以在这里下载到XTREE最新的版本，也有XTREE的演示的DEMO。</font></p>
<p>3.XTREE的API：</p>
<p>&nbsp;&nbsp;&nbsp; XTREE的API很简单，就是一个抽象类WebFXTreeAbstractNode以及该抽象类的两个子类WebFXTree和WebFXTreeItem。这三个类的属性和构造函数，还有方法详见：<font face="Arial"><a href="http://webfx.eae.net/dhtml/xtree/api.html">http://webfx.eae.net/dhtml/xtree/api.html</a>，上面写得很清晰。</font></p>
<p><font face="Arial">4.XTREE学习笔记<br />
&nbsp;&nbsp;&nbsp; 每个结点有一个状态叫做OPEN；如果结点为OPEN,则可以EXPAND;对于ITEM结点来说，永远返回FALSE;<br />
&nbsp;&nbsp;&nbsp; toggle()就是切换，如果为展开的，就收起；如果为收起的，就展开；<br />
&nbsp;&nbsp;&nbsp; XTREE生成的是静态树，它不能从XML中生成树，而是只能生成简单的静态的树，看构造函数的参数就可以知道【text】【action】<br />
&nbsp;&nbsp;&nbsp; --------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp; WebFXTreeAbstractNode:<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp; id:唯一标识<br />
&nbsp;&nbsp;&nbsp; text: label<br />
&nbsp;&nbsp;&nbsp; action: 链接<br />
&nbsp;&nbsp;&nbsp; open: 标志位，boolean型，是否打开<br />
&nbsp;&nbsp;&nbsp; icon: 图标<br />
&nbsp;&nbsp;&nbsp; openIcon：打开时的图标<br />
&nbsp;&nbsp;&nbsp; parentNode：父结点的Reference<br />
&nbsp;&nbsp;&nbsp; childNodes: 子结点的Reference的集合<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 方法：<br />
&nbsp;&nbsp;&nbsp; indent():缩进<br />
&nbsp;&nbsp;&nbsp; toggle():切换<br />
&nbsp;&nbsp;&nbsp; callapse():收起<br />
&nbsp;&nbsp;&nbsp; expand():展开<br />
&nbsp;&nbsp;&nbsp; callapseAll():收起全部<br />
&nbsp;&nbsp;&nbsp; expandAll():展开全部<br />
&nbsp;&nbsp;&nbsp; expandChildren():展开子结点<br />
&nbsp;&nbsp;&nbsp; callapseChildren():收起子结点<br />
&nbsp;&nbsp;&nbsp; getNextSibling():取得下一个兄弟结点的Reference<br />
&nbsp;&nbsp;&nbsp; getPreviousSibling():取得上一个兄弟结点的Reference<br />
&nbsp;&nbsp;&nbsp; toString():生成HTML代码<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp; WebFXTree:<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 构造函数：new WebFXTree([text], [action], [behavior],[icon],[openIcon]);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 参数：<br />
&nbsp;&nbsp;&nbsp; text:<br />
&nbsp;&nbsp;&nbsp; action:<br />
&nbsp;&nbsp;&nbsp; behavior:<br />
&nbsp;&nbsp;&nbsp; icon:<br />
&nbsp;&nbsp;&nbsp; openIcon:<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp; rendered 标志位，boolean类型，用于标记该树是否已经生成和显示。<br />
&nbsp;&nbsp;&nbsp; WebFXTreeAbstractNode的所有属性<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 方法：<br />
&nbsp;&nbsp;&nbsp; getSelected():返回一个Reference，被选中的那个对象的Reference。<br />
&nbsp;&nbsp;&nbsp; setBehavior(sBehavior): classic,explorer;<br />
&nbsp;&nbsp;&nbsp; getBehavior():<br />
&nbsp;&nbsp;&nbsp; WebFXTreeAbstractNode的所有方法<br />
&nbsp;&nbsp;&nbsp; -------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp; WebFXTreeItem:<br />
&nbsp;&nbsp;&nbsp; 构造函数：<br />
&nbsp;&nbsp;&nbsp; new WebFXTreeItem([text],[action],[parent],[icon],[openIcon]);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp; WebFXTreeAbstractNode的所有属性<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 方法：<br />
&nbsp;&nbsp;&nbsp; getFirst():返回第一个子结点的Reference<br />
&nbsp;&nbsp;&nbsp; getLast():返回嘴后一个子结点的Reference<br />
&nbsp;&nbsp;&nbsp; __________________________________________________________________________________________<br />
&nbsp;&nbsp;&nbsp; <br />
5.XLoadTree学习笔记：<br />
&nbsp;&nbsp;&nbsp; XLoadTree与XTree的区别就在于，XTree只能生成静态树，而XLoadTree可以根据XML生成动态树。<br />
&nbsp;&nbsp;&nbsp; XLoadTree是由Xtree而来的，主要有两个类：WebFXLoadTree和WebFXLoadTreeItem,其中，WebFXLoadTree继承自WebFXTree，WebFXLoadTreeItem继承自WebFXTreeItem<br />
&nbsp;&nbsp;&nbsp; ---------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp; WebFXLoadTree:<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 构造函数：<br />
&nbsp;&nbsp;&nbsp; new WebFXLoadTree(sText, sXmlSrc, sAction, sBehavior, sIcon, sOpenIcon) <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 参数：<br />
&nbsp;&nbsp;&nbsp; sXmlSrc:展开时需要用到的XML文件<br />
&nbsp;&nbsp;&nbsp; 其余参数与WebFXTree一样<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp; src: XML源文件<br />
&nbsp;&nbsp;&nbsp; loading: 标志位，boolean类型，表示正在加载XML文件<br />
&nbsp;&nbsp;&nbsp; loaded: 标志位，boolean类型， 表示XML文件已将加载完毕<br />
&nbsp;&nbsp;&nbsp; errorText: 错误描述<br />
&nbsp;&nbsp;&nbsp; WebFXTree中的所有属性<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 方法：<br />
&nbsp;&nbsp;&nbsp; reload():重新加载XML文件<br />
&nbsp;&nbsp;&nbsp; WebFXTree中的所有方法<br />
&nbsp;&nbsp;&nbsp; -----------------------------------------------------------------------<br />
&nbsp;&nbsp;&nbsp; WebFXLoadTreeItem:<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 构造函数：<br />
&nbsp;&nbsp;&nbsp; new WebFXLoadTreeItem(sText, sXmlSrc, sAction, eParent, sIcon, sOpenIcon)<br />
&nbsp;&nbsp;&nbsp; 参数：<br />
&nbsp;&nbsp;&nbsp; eParent:可选，该结点要加入到的结点的Reference<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 属性：<br />
&nbsp;&nbsp;&nbsp; src: XML源文件<br />
&nbsp;&nbsp;&nbsp; loading: 标志位，boolean类型，表示正在加载XML文件<br />
&nbsp;&nbsp;&nbsp; loaded: 标志位，boolean类型， 表示XML文件已将加载完毕<br />
&nbsp;&nbsp;&nbsp; errorText: 错误描述<br />
&nbsp;&nbsp;&nbsp; WebFXTree中的所有属性<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 方法：<br />
&nbsp;&nbsp;&nbsp; reload():重新加载XML文件<br />
&nbsp;&nbsp;&nbsp; WebFXTreeItem中的所有方法<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; XML文件的格式：<br />
&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span>&lt;!ELEMENT&nbsp;tree&nbsp;(tree*)</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&lt;!ATTLIST&nbsp;tree &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;&nbsp;&nbsp;#REQUIRED &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;&nbsp;&nbsp;#IMPLIED &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;&nbsp;&nbsp;#IMPLIED &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA&nbsp;&nbsp;&nbsp;#IMPLIED &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;openIcon&nbsp;&nbsp;CDATA&nbsp;&nbsp;&nbsp;#IMPLIED</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; XML文件的例子：<br />
&nbsp;&nbsp;&nbsp; </font></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">tree</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tree</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;Loaded&nbsp;Item&nbsp;1&quot;</span><span>&nbsp;</span><span class="attribute">action</span><span>=</span><span class="attribute-value">&quot;href://webfx.eae.net&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tree</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;Loaded&nbsp;Item&nbsp;2&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tree</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;Loaded&nbsp;Item&nbsp;2.1&quot;</span><span>&nbsp;</span><span class="attribute">action</span><span>=</span><span class="attribute-value">&quot;javascript:alert(2.1)&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">tree</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">tree</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;Load&nbsp;&amp;quot;tree1.xml&amp;quot;&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;tree1.xml&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">tree</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/110526#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 09 Aug 2007 13:30:48 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/110526</link>
        <guid>http://icemoon.javaeye.com/blog/110526</guid>
      </item>
      <item>
        <title>SVN提交之后没反应的问题</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/109437" style="color:red;">http://icemoon.javaeye.com/blog/109437</a>&nbsp;
          发表时间: 2007年08月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天换了台机器， 发现用SVN 提交不了了； 提交之后就没反应了。</p>
<p>最后发现是卡巴斯基把SVN 阻挡了，把jdk加入到可信区域。把SVN加入到可信区域。可以设定端口的。</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/109437#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 06 Aug 2007 16:15:02 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/109437</link>
        <guid>http://icemoon.javaeye.com/blog/109437</guid>
      </item>
      <item>
        <title>struts2中select标签的使用</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/108592" style="color:red;">http://icemoon.javaeye.com/blog/108592</a>&nbsp;
          发表时间: 2007年08月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>struts2的select标签中，常用的有以下几个属性：</p>
<p>(1)struts2中的select 标签中，必须设置的属性只有一个，即是list。</p>
<p>(2)select标签的list中必须有值，不然会报错。如果没有值，可以加上headerKey, headerValue，这样就可以通过了。如：</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">s:select</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;geElement.childType&quot;</span><span>&nbsp;</span><span class="attribute">list</span><span>=</span><span class="attribute-value">&quot;childTypeList&quot;</span><span>&nbsp;</span><span class="attribute">listKey</span><span>=</span><span class="attribute-value">&quot;key&quot;</span><span>&nbsp;</span></span></li>
    <li class="alt"><span><span></span><span class="attribute">listValue</span><span>=</span><span class="attribute-value">&quot;value&quot;</span><span>&nbsp;</span><span class="attribute">headerKey</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span>&nbsp;</span><span class="attribute">headerValue</span><span>=</span><span class="attribute-value">&quot;--请选择子类型--&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>其中，即使list中有值，我们也通常会加上headerKey, headerValue，即列表中显示的第一个选项。注意，headerKey不可以为空，不可以为-1。</p>
<p>(3)list属性：通常是在action中定义的，必须是一个可以迭代的源，如为一个List, Map, Set等。如果是一个Map，那么map的key就对应于select标签中的value，map中的value就对应于select标签中的option。而如果是一个List或者是一个Set，那么可以通过listKey和listValue指定。</p>
<p>(4)listKey和listValue：listKey即对应于select标签中的value， listValue即对应于select标签中的option。</p>
<p>(5)name属性：即是表单中select的名称。</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/108592#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 03 Aug 2007 15:35:16 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/108592</link>
        <guid>http://icemoon.javaeye.com/blog/108592</guid>
      </item>
      <item>
        <title>在mysql中使用触发器</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/108487" style="color:red;">http://icemoon.javaeye.com/blog/108487</a>&nbsp;
          发表时间: 2007年08月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>MYSQL是在5.0以后的版本中引入触发器的。</p>
<p>有的时候，可以用触发器来维护数据的完整性。如我有一个表ge_element，该表中有一个region_id，对应到ge_region表中的id，但是，region_id是可以为空的，所以不应该设置外键约束，而我在删除ge_region表中的记录时，希望把在ge_element表中被引用到的记录的region_id设为0,因为没有数据库的外键约束，我只能在程序中操作，但我又不想通过程序来操作，因为引用region_id的表可能不只ge_element一个，这时，就可能用到触发器，在删除ge_region表中的记录时，把被引用的表中的region_id设为0。</p>
<p>1.创建触发器的语句：</p>
<p>CREATE TRIGGER &lt;触发器名称&gt; &lt;--<br />
{ BEFORE | AFTER }<br />
{ INSERT | UPDATE | DELETE }<br />
ON &lt;表名称&gt;<br />
FOR EACH ROW<br />
&lt;触发器SQL语句&gt; </p>
<p>　　触发器必须有名字，最多64个字符，可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.</p>
<p>　　这里我有个习惯：就是用表的名字＋'_'＋触发器类型的缩写.因此如果是表t26，触发器是在事件UPDATE（参考下面的点（2）和（3））之前（BEFORE）的，那么它的名字就是t26_bu。</p>
<p>可以直接在EMS中创建触发器。</p>
<p>&nbsp;</p>
<p>2.触发时间：</p>
<p>Before表示在事件发生之前执行触发器，After表示在事件发生之后执行触发器；</p>
<p>&nbsp;</p>
<p>3.触发事件：</p>
<p>三个事件：insert, update, delete</p>
<p>&nbsp;</p>
<p>4.触发器与表的关系：</p>
<p>触发器是属于一个表的，当在这个表上执行insert, update, delete操作时，就会导致相应的触发器被激活；</p>
<p>不能给同一个表的同一个操作创建两个不同的触发器。</p>
<p>&nbsp;</p>
<p>5.触发间隔：</p>
<p>FOR EACH ROW 子句通知触发器每隔一行执行一次动作，而不是对整下表执行一次。</p>
<p>&nbsp;</p>
<p>6.触发的SQL语句：</p>
<p>触发器包含所要触发的SQL语句：这里的语句可以是任何合法的语句，包括复合语句，但是这里的语句受的限制和函数的一样。</p>
<p>复合语句(BEGIN / END)是合法的. </p>
<p>流控制（Flow-of-control）语句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.</p>
<p>变量声明(DECLARE)以及指派(SET)是合法的.</p>
<p>允许条件声明.</p>
<p>异常处理声明也是允许的.</p>
<p>但是在这里要记住函数有受限条件:不能在函数中访问表.因此在函数中使用以下语句是非法的。</p>
<p>&nbsp;</p>
<p>7.创建触发器的权限：</p>
<p>你必须要有相当大的权限才能够创建触发器；我在创建触发器的时候提示要有super privilege才可以创建；</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/108487#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 03 Aug 2007 10:10:04 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/108487</link>
        <guid>http://icemoon.javaeye.com/blog/108487</guid>
      </item>
      <item>
        <title>使用struts2中的文件上传</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/106139" style="color:red;">http://icemoon.javaeye.com/blog/106139</a>&nbsp;
          发表时间: 2007年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>struts2中提供了对文件上传的支持，主要是通过File Upload Interceptor来实现的。这个拦截器有两个参数可以设置：maximumSize 和allowedTypes ，其中，maximumSize是允许上传的文件的最大容量，allowedTypes是允许的mimeType类型。</p>
<p>错误提示信息可以在i18n资源文件中指定，有以下三个key：</p>
<p>(1)struts.messages.error.uploading，文件上传出错时的提示信息</p>
<p>(2)struts.messages.error.file.too.large ，文件容量超出限制时的提示信息</p>
<p>(3)struts.messages.error.content.type.not.allowed ，文件mimeType类型不正确时的提示信息</p>
<p>1.如：在globleMessages_zh_CN.properties中，加入以下key-value:</p>
<p><font face="Arial">struts.messages.error.uploading=上传文件失败<br />
struts.messages.error.file.too.large=上传的文件太大<br />
struts.messages.error.content.type.not.allowed=上传文件格式不正确</font></p>
<p>2.在action-mapping配置中：</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;fileUpload&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;allowedTypes&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image/png,image/gif,image/jpeg &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!-- 文件最大不能size:以byte为单位 --></span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;maximumSize&nbsp;&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;102400 &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">param</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">interceptor-ref</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>3.在JSP页面中：</p>
<p>(1)form表单中指定enctype=&quot;multipart/form-data&quot;：</p>
<font face="Arial">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">s:form</span><span>&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;certificate_form&quot;</span><span>&nbsp;</span><span class="attribute">onsubmit</span><span>=</span><span class="attribute-value">&quot;return&nbsp;check()&quot;</span><span>&nbsp;</span><span class="attribute">enctype</span><span>=</span><span class="attribute-value">&quot;multipart/form-data&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>&nbsp;</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">s:file</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;upload&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">s:fielderror</span><span class="tag">&gt;</span><span class="tag">&lt;</span><span class="tag-name">s:param</span><span class="tag">&gt;</span><span>upload</span><span class="tag"><span class="tag-name">s:param</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">s:fielderror</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </span></span></li>
</ol>
</div>
<p>4.在Action中定义以下三个属性：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">private</span><span>&nbsp;File&nbsp;upload; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">private</span><span>&nbsp;String&nbsp;uploadFileName;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">private</span><span>&nbsp;String&nbsp;uploadContentType;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>并生成相应的setter,getter方法。指定上传的文件名为upload</p>
<p>5.struts.properties：</p>
<p><font face="Arial">struts.multipart.saveDir=D:\strutsTemp<br />
#struts.multipart.parser <br />
#struts.multipart.maxSize </font></p>
<p>struts.multipart.parser默认为Commons FileUpload。是处理MultipartRequest的parse implementation。在File upload时使用。</p>
<p>struts.multipart.maxSize默认为约2M。</p>
<p>6.多文件上传：</p>
<p>在JSP页面中加入多个同名的file input，如： </p>
<p><s:file name="upload"></s:file></p>
<p><s:file name="upload"></s:file></p>
<p><s:file name="upload"></s:file></p>
<p>然后在action中，把upload定义为数组或者List，相应的FileName和ContentType业为数组或List。</p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/106139#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jul 2007 16:26:08 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/106139</link>
        <guid>http://icemoon.javaeye.com/blog/106139</guid>
      </item>
      <item>
        <title>由spring管理struts的Action实例</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/106042" style="color:red;">http://icemoon.javaeye.com/blog/106042</a>&nbsp;
          发表时间: 2007年07月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>当指定struts.objectFactory为spring时，struts2框架就会把bean转发给spring来创建，装配，注入。但是bean创建完成之后，还是由struts容器来管理其生命周期。配置方式：</p>
<p>(1)struts.xml中：</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">constant</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;struts.objectFactory&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;spring&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>(2)struts.properties中：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>struts.objectFactory=spring&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>通常情况下，这样子就够了，然后在struts的action-mapping配置文件中，如下：</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;user&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.myapp.admin.web.action.user.UserAction&quot;</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>即可，如果在Action中有依赖于其它的BEAN，也会被自动注入进来。这时候，Action实例是以prototype方式创建的，SPRING会为每个请求创建一个ACTION的实例。</p>
<p>&nbsp;</p>
<p>在某些时候，你可能希望不仅仅让SPRING创建和装配Action对象，还希望让SPRING完全管理这些对象，如希望使用AOP或者希望使用acegi时。这时候，只需要在spring的配置文件中定义这些action 即可。如在applicationContext.xml文件中：</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;user&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;com.myapp.web.action.user.UserAction&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>然后在action-mapping中，指定class=&quot;user&quot;即可。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/106042#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jul 2007 10:12:37 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/106042</link>
        <guid>http://icemoon.javaeye.com/blog/106042</guid>
      </item>
      <item>
        <title>STRUTS2中的日期处理</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/105499" style="color:red;">http://icemoon.javaeye.com/blog/105499</a>&nbsp;
          发表时间: 2007年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.Struts2中的日期的格式化：</p>
<p>在struts2中，提供了&lt;s:date.../&gt;标签，可以很方便地处理日期。有了这个标签，就可以随意地以各种方式来格式化日期，如指定日期格式为&ldquo;dd/MM/yyyy hh:mm&rdquo;，或者是自定义可读性强的日期格式&ldquo;2 hours 14 minutes&rdquo;，或者使用在properties文件中预先定义好日期格式。</p>
<p>s:date标签共有四个属性，id，name，format，nice；</p>
<p>(1)nice：</p>
<p>&nbsp;&nbsp;&nbsp; 可以设为true或者false，表示是否漂亮地显示日期，如果设置为true，那么将FORMAT属性将不会生效，日期将按以下规则显示：</p>
<p>
<table border="1">
    <tbody>
        <tr>
            <td>i18n key</td>
            <td>default</td>
        </tr>
        <tr>
            <td>struts.date.format.past</td>
            <td>{0} ago</td>
        </tr>
        <tr>
            <td>struts.date.format.future</td>
            <td>in {0}</td>
        </tr>
        <tr>
            <td>struts.date.format.seconds</td>
            <td>an instant</td>
        </tr>
        <tr>
            <td>struts.date.format.minutes</td>
            <td>{0,choice,1#one minute|1&lt;{0} minutes}</td>
        </tr>
        <tr>
            <td>struts.date.format.hours</td>
            <td>{0,choice,1#one hour|1&lt;{0} hours}{1,choice,0#|1#, one minute|1&lt;, {1} minutes}</td>
        </tr>
        <tr>
            <td>struts.date.format.days</td>
            <td>{0,choice,1#one day|1&lt;{0} days}{1,choice,0#|1#, one hour|1&lt;, {1} hours}</td>
        </tr>
        <tr>
            <td>struts.date.format.years</td>
            <td>{0,choice,1#one year|1&lt;{0} years}{1,choice,0#|1#, one day|1&lt;, {1} days}</td>
        </tr>
    </tbody>
</table>
</p>
<p>以上是默认的显示规则，可以在properties文件中修改。</p>
<p>(2)format：</p>
<p>&nbsp;&nbsp;&nbsp; 当nice=&quot;false&quot;时，format属性将起作用，如：&quot;yyyy-MM-dd hh:mm:ss&quot;，其中，y是年(year)，M是月(Month)，d是日(day)，h是小时(hour，12小时制)，H也是小时(hour，24小时制)，m是分钟(minute)，s是秒(second)。</p>
<p>(3)当format未设置时，将会使用默认的格式DateFormat.MEDIUM format</p>
<p>&nbsp;</p>
<p>2.在struts2中使用日期控件：</p>
<p>&nbsp;&nbsp;&nbsp; 在struts2中，提供了日期控件，以方便地选择日期和时间，这是通过&lt;s:datetimepicker.../&gt;标签来实现的。该日期控件是通过DOJO来实现的，会在客户端生成一段JS代码，所以，要让该日期控件生效，需要在&lt;head&gt;&lt;/head&gt;中间加入以下代码：</p>
<p>&nbsp;&nbsp;&nbsp; </p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">s:head</span><span>&nbsp;</span><span class="attribute">theme</span><span>=</span><span class="attribute-value">&quot;ajax&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp; 这样，就可以在页面中使用&lt;s:datetimepicker&gt;标签了。如：</p>
<p>&nbsp;&nbsp;&nbsp; </p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">s:datetimepicker</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;todayDate&quot;</span><span>&nbsp;</span><span class="attribute">label</span><span>=</span><span class="attribute-value">&quot;Format (yyyy-MM-dd)&quot;</span><span>&nbsp;</span><span class="attribute">displayFormat</span><span>=</span><span class="attribute-value">&quot;yyyy-MM-dd&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp; 在页面中，就会显示出日期控件，其中displayFormat是要显示的日期格式。效果如下所示：</p>
<p><img src="http://www.roseindia.net/struts/struts2/date/struts2-date-picker.gif" alt="" /></p>
<p>参考资料：<font face="Arial">http://struts.apache.org/2.x/docs/datetimepicker.html</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/105499#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jul 2007 22:19:29 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/105499</link>
        <guid>http://icemoon.javaeye.com/blog/105499</guid>
      </item>
      <item>
        <title>在struts2中调试JSP页面</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/100660" style="color:red;">http://icemoon.javaeye.com/blog/100660</a>&nbsp;
          发表时间: 2007年07月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>有的时候,你可能想要调试一个JSP页面,在STRUTS2中可以支持.</p>
<p>(1)在struts的配置文件中,更改devmode=true;</p>
<p>(2)在url后面添加?debug=xml,或?debug=console;</p>
<p>具体参考STRUTS2自带的例子show-case.</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/100660#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jul 2007 10:36:15 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/100660</link>
        <guid>http://icemoon.javaeye.com/blog/100660</guid>
      </item>
      <item>
        <title>从request中获取上上个请求的url</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/100178" style="color:red;">http://icemoon.javaeye.com/blog/100178</a>&nbsp;
          发表时间: 2007年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在HTTP的request对象中,可以取到HTTP头HEADER,其中有一个是&quot;Referer&quot;,通过它,我们可以知道上上个请求的URL,这在某些场合中相当有用.</p>
<p>如在一个列表页中,通常会有一个删除链接,删除列表中的某项数据,如果希望删除成功后再返回到该列表页,可以如下做法:</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>String&nbsp;retUrl&nbsp;=&nbsp;request.getHeader(</span><span class="string">&quot;Referer&quot;</span><span>); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">if</span><span>(retUrl&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect(retUrl); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>就这么简单,就可以了.</p>
<p>对于添加和编辑操作,同样可以这样做,只是稍微变通一下,要传一次从上个页面中获取的Referer.</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/100178#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jul 2007 18:24:22 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/100178</link>
        <guid>http://icemoon.javaeye.com/blog/100178</guid>
      </item>
      <item>
        <title>mysql中的整除和取余函数</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/100043" style="color:red;">http://icemoon.javaeye.com/blog/100043</a>&nbsp;
          发表时间: 2007年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>整除:div</p>
<p>5 div 2 = 2;</p>
<p>取余:mod</p>
<p>5 mod 2 = 1;</p>
<p>四舍五入:round</p>
<p>round(1.5) = 2;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/100043#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jul 2007 09:09:27 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/100043</link>
        <guid>http://icemoon.javaeye.com/blog/100043</guid>
      </item>
      <item>
        <title>struts2 OGNL取数据</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/100040" style="color:red;">http://icemoon.javaeye.com/blog/100040</a>&nbsp;
          发表时间: 2007年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>昨天碰天这样一种情况,在extreme table中指定了一行,id为row,又想在ognl中取得该row中的字段属性.</p>
<p>发现可以这样写,&lt;s:property value=&quot;#attr.row.id&quot;/&gt;&lt;s:property value=&quot;#attr.row.name&quot;/&gt;</p>
<p>其中id, name为row中的属性名,row是迭代中的一个Bean.</p>
<p>在struts2的OGNL中,数据放在以下几个地方:</p>
<p>(1)ValueStack:这是根路径(ROOT)</p>
<p>(2)request</p>
<p>(3)session</p>
<p>(4)application</p>
<p>(5)attr:当从attr中取数据时,会按page,request,session,application 的顺序进行遍历.通常不同的tag之间交换的数据都可以从attr中取到.</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/100040#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Jul 2007 08:53:37 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/100040</link>
        <guid>http://icemoon.javaeye.com/blog/100040</guid>
      </item>
      <item>
        <title>struts2.0</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/99403" style="color:red;">http://icemoon.javaeye.com/blog/99403</a>&nbsp;
          发表时间: 2007年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          struts2.0中的链接&lt;s:a href=&quot;&quot;/&gt;,如果我要新打开这个链接,不知道该怎么写?
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/99403#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Jul 2007 13:45:16 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/99403</link>
        <guid>http://icemoon.javaeye.com/blog/99403</guid>
      </item>
      <item>
        <title>JVM 设置</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/98655" style="color:red;">http://icemoon.javaeye.com/blog/98655</a>&nbsp;
          发表时间: 2007年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近在公司老是碰到out of memory error, 一天重启eclipse好多次，被郁闷得要死。</p>
<p>如果启动了jetty的话，不一会就会有permgen space out of memory异常。</p>
<p>产生的原因我猜测是使用了maven,subversion,mylar,wtp等插件，具体原因还不确定。</p>
<p>在网上找了找相关资料，暂时找到一些解决方法，但并没有完全解决问题：</p>
<p>（1）在eclipse根目录，找到eclipse.ini，在其中指定初始heap size和最大heap size:</p>
<p>-xms 64M</p>
<p>-xmx 256M</p>
<p>其中， -xms是初始heap size, -xmx 是最大heap size。</p>
<p>在实际使用过程中，我发现我一启动eclipse时，heap size使用大概是40m，多时可以达到128m，所以我的设置是</p>
<p>-xms 64m</p>
<p>-xmx 128m</p>
<p>(2)对于permgen space:</p>
<p>在eclipse.ini中指定参数：</p>
<p>-permsize 256m</p>
<p>-maxpermsize 784m</p>
<p>因为我用的是jetty，设置之后感觉出现permgen space的间隔长了不少，但是还是会出现。具体的值设置为多大，我现在还没有弄清楚，在tomcat中好像有别的地方可以设置。</p>
<p>(3)有一个办法可以在eclipse中看到当前heap size的分配和使用情况，还可以强制执行垃圾回收。</p>
<p>在eclipse的快捷方式上点击右键，在目标栏添加参数:</p>
<p>-debug options -vm javaw.exe</p>
<p>然后，在eclipse根目录下，新建一个名为options的文件，不要后缀名。在该文件中加入内容：</p>
<p><font face="Arial">org.eclipse.ui/perf/showHeapStatus=true</font></p>
<p>重启eclipse，就可以在eclipse的左下角看到当前heap size的使用情况和分配情况了，还可以手工执行垃圾回收，看heap size不够时就来一次。</p>
<p>&nbsp;</p>
<p>参考文章：<font face="Arial">http://www.yuanma.org/data/2006/0925/article_1590.htm</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/98655#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 06 Jul 2007 21:59:36 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/98655</link>
        <guid>http://icemoon.javaeye.com/blog/98655</guid>
      </item>
      <item>
        <title>java中读取Properties文件</title>
        <author>froast</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://icemoon.javaeye.com">froast</a>&nbsp;
          链接：<a href="http://icemoon.javaeye.com/blog/97874" style="color:red;">http://icemoon.javaeye.com/blog/97874</a>&nbsp;
          发表时间: 2007年07月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在java中，可以用
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Properties&nbsp;p&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Properties(); &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>InputStream&nbsp;is&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.getClass().getResourceAsStream(propertiesFileName); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>p.load(is); &nbsp;&nbsp;</span> </li>
    <li class=""><span>is.close;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>来读取。</p>
<p>如果properties文件是在classpath的根目录下，如test.properties在src目录下，则可以这样读取：</p>
<div class="code_title">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>InputStream&nbsp;is&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.getClass().getResourceAsStream(&quot;</span><span class="string">test.properties&quot;</span><span>);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
</div>
<div class="code_title"></div>
<p>如果不在要目录下，则要加上相对于classpath要目录的路径。如在src目录下，有一个包com.myapp.resources,则可以如下读取：</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>InputStream&nbsp;is&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.getClass().getResourceAsStream(</span><span class="string">&quot;/com/myapp/resources/test.properties&quot;</span><span>);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://icemoon.javaeye.com/blog/97874#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Jul 2007 23:18:55 +0800</pubDate>
        <link>http://icemoon.javaeye.com/blog/97874</link>
        <guid>http://icemoon.javaeye.com/blog/97874</guid>
      </item>
  </channel>
</rss>