﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Gemscorpio-文章分类-JSP</title><link>http://www.blogjava.net/gemscorpio/category/3066.html</link><description>目前的目标是做一名合格的Java程序员，为此我要a Za a Za fighting</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 23:34:27 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 23:34:27 GMT</pubDate><ttl>60</ttl><item><title>常用的ant的操作</title><link>http://www.blogjava.net/Gemscorpio/articles/13983.html</link><dc:creator>MudFish</dc:creator><author>MudFish</author><pubDate>Sun, 25 Sep 2005 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/Gemscorpio/articles/13983.html</guid><wfw:comment>http://www.blogjava.net/Gemscorpio/comments/13983.html</wfw:comment><comments>http://www.blogjava.net/Gemscorpio/articles/13983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Gemscorpio/comments/commentRss/13983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Gemscorpio/services/trackbacks/13983.html</trackback:ping><description><![CDATA[Gem转：<BR>主要的内容有：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;(1)建立一个项目<BR>&nbsp;&nbsp;&nbsp;&nbsp;(2)建立属性<BR>&nbsp;&nbsp;&nbsp;&nbsp;(3)对数据库的操作<BR>&nbsp;&nbsp;&nbsp;&nbsp;(4)javac编译&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;(5)删除目录&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;(6)建立目录&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;(7)拷贝文件群&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;(8)jar为一个包&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;(9)拷贝单个文件&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;(10)运行<BR>&nbsp;&nbsp;有更多更好的常用的,我没想到的,希望大家补充。&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;!--(1)建立一个项目，默认的操作为target=all.&nbsp;--&gt;<BR>&nbsp;&nbsp;&lt;project&nbsp;name="proj"&nbsp;default="all"&nbsp;basedir="."&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--(2)建立一些属性，以供下边的操作用到&nbsp;--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="root"&nbsp;&nbsp;value="./"&nbsp;/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="deploy_path"&nbsp;&nbsp;value="d:/deploy"&nbsp;/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="srcfile"&nbsp;&nbsp;value="d:/srcfile"&nbsp;/&gt;&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;target&nbsp;name="all"&nbsp;depends="compile,deploy"/&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--(3)对数据库的操作&nbsp;demo.ddl中写的是sql语句&nbsp;driver,url,userid,password<BR>随具体情况设置--&gt;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;Oracle&nbsp;--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;target&nbsp;name="db_setup_oracle"&nbsp;description="Database&nbsp;setup&nbsp;for&nbsp;Oracle<BR>"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;antcall&nbsp;target="check_params_results"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sql&nbsp;driver="oracle.jdbc.driver.OracleDriver"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url="jdbc:oracle:thin:@192.168.0.1:1521:oa"&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userid="oa"&nbsp;password="oa"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onerror="continue"&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print="yes"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src="./demo.ddl"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/target&gt;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--(4)javac编译&nbsp;--&gt;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;target&nbsp;name="compile"&gt;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;javac&nbsp;srcdir="${srcfile}"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destdir="${root}/oa/"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;includes="*.java"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classpath="${CLASSPATH};${CLIENT_CLASSES}/utils_common.jar"&nbsp;&nbsp;&nbsp;&lt;!--CLASSPATH<BR>和CLIENT_CLASSES是环境变量--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/target&gt;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;target&nbsp;name="deploy"&nbsp;depends="compile"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;Create&nbsp;the&nbsp;time&nbsp;stamp&nbsp;--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tstamp/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--(5)删除目录--&gt;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--(6)建立目录--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;delete&nbsp;dir="${root}/dist/"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mkdir&nbsp;dir="${root}/dist/"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;delete&nbsp;dir="${deploy_path}"/&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mkdir&nbsp;dir="${deploy_path}"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--(7)拷贝文件群--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;copy&nbsp;todir="${root}/dist/"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileset&nbsp;dir="${root}/oa/"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include&nbsp;name="*.class"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/copy&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--(8)jar为一个包--&gt;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;jar&nbsp;jarfile="${deploy_path}/classjar.jar"&nbsp;basedir="${root}/dist"&nbsp;update<BR>="yes"&gt;&lt;/jar&gt;&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--(9)拷贝单个文件(上边是文件群,这是单个文件)--&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;copy&nbsp;file="${deploy_path}/classjar.jar"&nbsp;todir="${root}/dist/"/&gt;&nbsp;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/target&gt;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--(10)运行(args中是参数,随应用程序的具体情况有所不同)-&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;target&nbsp;name="simplesql"&nbsp;&nbsp;depends="compile,db_setup_oracle"&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;java&nbsp;classname="examples.jdbc.oracle.simplesql"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fork="yes"&nbsp;failonerror="yes"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args="-user&nbsp;zrb&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-password&nbsp;zrb&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"/&gt;<BR><BR>&nbsp;&nbsp;&lt;/project&gt;&nbsp;<img src ="http://www.blogjava.net/Gemscorpio/aggbug/13983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Gemscorpio/" target="_blank">MudFish</a> 2005-09-25 11:32 <a href="http://www.blogjava.net/Gemscorpio/articles/13983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java栈与堆的思考</title><link>http://www.blogjava.net/Gemscorpio/articles/13982.html</link><dc:creator>MudFish</dc:creator><author>MudFish</author><pubDate>Sun, 25 Sep 2005 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/Gemscorpio/articles/13982.html</guid><wfw:comment>http://www.blogjava.net/Gemscorpio/comments/13982.html</wfw:comment><comments>http://www.blogjava.net/Gemscorpio/articles/13982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Gemscorpio/comments/commentRss/13982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Gemscorpio/services/trackbacks/13982.html</trackback:ping><description><![CDATA[1.&nbsp;栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同，Java自<BR>动管理栈和堆，程序员不能直接地设置栈或堆。&nbsp;<BR><BR>　　2.&nbsp;栈的优势是，存取速度比堆要快，仅次于直接位于CPU中的寄存器。但缺点是<BR>，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。另外，栈数据可以共享<BR>，详见第3点。堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器<BR>，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动<BR>态分配内存，存取速度较慢。<BR><BR>　　3.&nbsp;Java中的数据类型有两种。<BR><BR>　　一种是基本类型(primitive&nbsp;types),&nbsp;共有8种，即int,&nbsp;short,&nbsp;long,&nbsp;byte,&nbsp;float<BR>,&nbsp;double,&nbsp;boolean,&nbsp;char(注意，并没有string的基本类型)。这种类型的定义是通<BR>过诸如int&nbsp;a&nbsp;=&nbsp;3;&nbsp;long&nbsp;b&nbsp;=&nbsp;255L;的形式来定义的，称为自动变量。值得注意的是<BR>，自动变量存的是字面值，不是类的实例，即不是类的引用，这里并没有类的存在。<BR>如int&nbsp;a&nbsp;=&nbsp;3;&nbsp;这里的a是一个指向int类型的引用，指向3这个字面值。这些字面值的<BR>数据，由于大小可知，生存期可知(这些字面值固定定义在某个程序块里面，程序块<BR>退出后，字段值就消失了)，出于追求速度的原因，就存在于栈中。<BR><BR>　　另外，栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时<BR>定义：<BR><BR>int&nbsp;a&nbsp;=&nbsp;3;&nbsp;<BR>int&nbsp;b&nbsp;=&nbsp;3；&nbsp;<BR><BR>　　编译器先处理int&nbsp;a&nbsp;=&nbsp;3；首先它会在栈中创建一个变量为a的引用，然后查找有<BR>没有字面值为3的地址，没找到，就开辟一个存放3这个字面值的地址，然后将a指向<BR>3的地址。接着处理int&nbsp;b&nbsp;=&nbsp;3；在创建完b的引用变量后，由于在栈中已经有3这个字<BR>面值，便将b直接指向3的地址。这样，就出现了a与b同时均指向3的情况。<BR><BR>　　特别注意的是，这种字面值的引用与类对象的引用不同。假定两个类对象的引用<BR>同时指向一个对象，如果一个对象引用变量修改了这个对象的内部状态，那么另一个<BR>对象引用变量也即刻反映出这个变化。相反，通过字面值的引用来修改其值，不会导<BR>致另一个指向此字面值的引用的值也跟着改变的情况。如上例，我们定义完a与b的值<BR>后，再令a=4；那么，b不会等于4，还是等于3。在编译器内部，遇到a=4；时，它就<BR>会重新搜索栈中是否有4的字面值，如果没有，重新开辟地址存放4的值；如果已经有<BR>了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。<BR><BR>　　另一种是包装类数据，如Integer,&nbsp;String,&nbsp;Double等将相应的基本数据类型包<BR>装起来的类。这些类数据全部存在于堆中，Java用new()语句来显示地告诉编译器，<BR>在运行时才根据需要动态创建，因此比较灵活，但缺点是要占用更多的时间。&nbsp;4.&nbsp;String<BR>是一个特殊的包装类数据。即可以用String&nbsp;str&nbsp;=&nbsp;new&nbsp;String("abc");的形式来创<BR>建，也可以用String&nbsp;str&nbsp;=&nbsp;"abc"；的形式来创建(作为对比，在JDK&nbsp;5.0之前，你从<BR>未见过Integer&nbsp;i&nbsp;=&nbsp;3;的表达式，因为类与字面值是不能通用的，除了String。而在<BR>JDK&nbsp;5.0中，这种表达式是可以的！因为编译器在后台进行Integer&nbsp;i&nbsp;=&nbsp;new&nbsp;Integer<BR>(3)的转换)。前者是规范的类的创建过程，即在Java中，一切都是对象，而对象是类<BR>的实例，全部通过new()的形式来创建。Java中的有些类，如DateFormat类，可以通<BR>过该类的getInstance()方法来返回一个新创建的类，似乎违反了此原则。其实不然<BR>。该类运用了单例模式来返回类的实例，只不过这个实例是在该类内部通过new()来<BR>创建的，而getInstance()向外部隐藏了此细节。那为什么在String&nbsp;str&nbsp;=&nbsp;"abc"；<BR>中，并没有通过new()来创建实例，是不是违反了上述原则？其实没有。<BR><BR>　　5.&nbsp;关于String&nbsp;str&nbsp;=&nbsp;"abc"的内部工作。Java内部将此语句转化为以下几个步<BR>骤：<BR><BR>　　(1)先定义一个名为str的对String类的对象引用变量：String&nbsp;str；<BR><BR>　　(2)在栈中查找有没有存放值为"abc"的地址，如果没有，则开辟一个存放字面值<BR>为"abc"的地址，接着创建一个新的String类的对象o，并将o的字符串值指向这个地<BR>址，而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址<BR>，则查找对象o，并返回o的地址。<BR><BR>　　(3)将str指向对象o的地址。<BR><BR>　　值得注意的是，一般String类中字符串值都是直接存值的。但像String&nbsp;str&nbsp;=&nbsp;<BR>"abc"；这种场合下，其字符串值却是保存了一个指向存在栈中数据的引用！<BR><BR>　　为了更好地说明这个问题，我们可以通过以下的几个代码进行验证。<BR><BR>String&nbsp;str1&nbsp;=&nbsp;"abc";<BR>String&nbsp;str2&nbsp;=&nbsp;"abc";<BR>System.out.println(str1==str2);&nbsp;//true&nbsp;<BR><BR>　　注意，我们这里并不用str1.equals(str2)；的方式，因为这将比较两个字符串<BR>的值是否相等。==号，根据JDK的说明，只有在两个引用都指向了同一个对象时才返<BR>回真值。而我们在这里要看的是，str1与str2是否都指向了同一个对象。<BR>结果说明，JVM创建了两个引用str1和str2，但只创建了一个对象，而且两个引用都<BR>指向了这个对象。<BR><BR>　　我们再来更进一步，将以上代码改成：<BR><BR>String&nbsp;str1&nbsp;=&nbsp;"abc";<BR>String&nbsp;str2&nbsp;=&nbsp;"abc";<BR>str1&nbsp;=&nbsp;"bcd";<BR>System.out.println(str1&nbsp;+&nbsp;","&nbsp;+&nbsp;str2);&nbsp;//bcd,&nbsp;abc<BR>System.out.println(str1==str2);&nbsp;//false&nbsp;<BR><BR>　　这就是说，赋值的变化导致了类对象引用的变化，str1指向了另外一个新对象！<BR>而str2仍旧指向原来的对象。上例中，当我们将str1的值改为"bcd"时，JVM发现在栈<BR>中没有存放该值的地址，便开辟了这个地址，并创建了一个新的对象，其字符串的值<BR>指向这个地址。<BR><BR>　　事实上，String类被设计成为不可改变(immutable)的类。如果你要改变其值，<BR>可以，但JVM在运行时根据新值悄悄创建了一个新对象，然后将这个对象的地址返回<BR>给原来类的引用。这个创建过程虽说是完全自动进行的，但它毕竟占用了更多的时间<BR>。在对时间要求比较敏感的环境中，会带有一定的不良影响。<BR><BR>　　再修改原来代码：<BR><BR>String&nbsp;str1&nbsp;=&nbsp;"abc";<BR>String&nbsp;str2&nbsp;=&nbsp;"abc";<BR><BR>str1&nbsp;=&nbsp;"bcd";<BR><BR>String&nbsp;str3&nbsp;=&nbsp;str1;<BR>System.out.println(str3);&nbsp;//bcd<BR><BR>String&nbsp;str4&nbsp;=&nbsp;"bcd";<BR>System.out.println(str1&nbsp;==&nbsp;str4);&nbsp;//true&nbsp;<BR><BR>　　str3这个对象的引用直接指向str1所指向的对象(注意，str3并没有创建新对象<BR>)。当str1改完其值后，再创建一个String的引用str4，并指向因str1修改值而创建<BR>的新的对象。可以发现，这回str4也没有创建新的对象，从而再次实现栈中数据的共<BR>享。<BR><BR>　　我们再接着看以下的代码。<BR><BR>String&nbsp;str1&nbsp;=&nbsp;new&nbsp;String("abc");<BR>String&nbsp;str2&nbsp;=&nbsp;"abc";<BR>System.out.println(str1==str2);&nbsp;//false&nbsp;<BR><BR>　　创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。<BR><BR>String&nbsp;str1&nbsp;=&nbsp;"abc";<BR>String&nbsp;str2&nbsp;=&nbsp;new&nbsp;String("abc");<BR>System.out.println(str1==str2);&nbsp;//false&nbsp;<BR><BR>　　创建了两个引用。创建了两个对象。两个引用分别指向不同的两个对象。<BR><BR>　　以上两段代码说明，只要是用new()来新建对象的，都会在堆中创建，而且其字<BR>符串是单独存值的，即使与栈中的数据相同，也不会与栈中的数据共享。<BR><BR>　　6.&nbsp;数据类型包装类的值不可修改。不仅仅是String类的值不可修改，所有的数<BR>据类型包装类都不能更改其内部的值。&nbsp;7.&nbsp;结论与建议：<BR><BR>　　(1)我们在使用诸如String&nbsp;str&nbsp;=&nbsp;"abc"；的格式定义类时，总是想当然地认为<BR>，我们创建了String类的对象str。担心陷阱！对象可能并没有被创建！唯一可以肯<BR>定的是，指向String类的引用被创建了。至于这个引用到底是否指向了一个新的对象<BR>，必须根据上下文来考虑，除非你通过new()方法来显要地创建一个新的对象。因此<BR>，更为准确的说法是，我们创建了一个指向String类的对象的引用变量str，这个对<BR>象引用变量指向了某个值为"abc"的String类。清醒地认识到这一点对排除程序中难<BR>以发现的bug是很有帮助的。<BR><BR>　　(2)使用String&nbsp;str&nbsp;=&nbsp;"abc"；的方式，可以在一定程度上提高程序的运行速度<BR>，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String<BR>&nbsp;str&nbsp;=&nbsp;new&nbsp;String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值<BR>是否相等，是否有必要创建新对象，从而加重了程序的负担。这个思想应该是享元模<BR>式的思想，但JDK的内部在这里实现是否应用了这个模式，不得而知。<BR><BR>　　(3)当比较包装类里面的数值是否相等时，用equals()方法；当测试两个包装类<BR>的引用是否指向同一个对象时，用==。<BR><BR>　　(4)由于String类的immutable性质，当String变量需要经常变换其值时，应该考<BR>虑使用StringBuffer类，以提高程序效率。<BR><img src ="http://www.blogjava.net/Gemscorpio/aggbug/13982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Gemscorpio/" target="_blank">MudFish</a> 2005-09-25 11:27 <a href="http://www.blogjava.net/Gemscorpio/articles/13982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>彻底明白Java的IO系统</title><link>http://www.blogjava.net/Gemscorpio/articles/13981.html</link><dc:creator>MudFish</dc:creator><author>MudFish</author><pubDate>Sun, 25 Sep 2005 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/Gemscorpio/articles/13981.html</guid><wfw:comment>http://www.blogjava.net/Gemscorpio/comments/13981.html</wfw:comment><comments>http://www.blogjava.net/Gemscorpio/articles/13981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Gemscorpio/comments/commentRss/13981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Gemscorpio/services/trackbacks/13981.html</trackback:ping><description><![CDATA[Gem 转<BR>一．&nbsp;Input和Output<BR>1.&nbsp;stream代表的是任何有能力产出数据的数据源，或是任何有能力接收数据的接收<BR>源。在Java的IO中，所有的stream（包括Input和Out&nbsp;stream）都包括两种类型：<BR>1.1&nbsp;以字节为导向的stream<BR>以字节为导向的stream，表示以字节为单位从stream中读取或往stream中写入信息。<BR>以字节为导向的stream包括下面几种类型：<BR>1)&nbsp;input　stream：<BR>1)&nbsp;ByteArrayInputStream：把内存中的一个缓冲区作为InputStream使用<BR>2)&nbsp;StringBufferInputStream：把一个String对象作为InputStream<BR>3)&nbsp;FileInputStream：把一个文件作为InputStream，实现对文件的读取操作<BR>4)&nbsp;PipedInputStream：实现了pipe的概念，主要在线程中使用<BR>5)&nbsp;SequenceInputStream：把多个InputStream合并为一个InputStream<BR>2)&nbsp;Out　stream<BR>1)&nbsp;ByteArrayOutputStream：把信息存入内存中的一个缓冲区中<BR>2)&nbsp;FileOutputStream：把信息存入文件中<BR>3)&nbsp;PipedOutputStream：实现了pipe的概念，主要在线程中使用<BR>4)&nbsp;SequenceOutputStream：把多个OutStream合并为一个OutStream<BR>1.2&nbsp;以Unicode字符为导向的stream<BR>以Unicode字符为导向的stream，表示以Unicode字符为单位从stream中读取或往stream<BR>中写入信息。以Unicode字符为导向的stream包括下面几种类型：<BR>1)&nbsp;Input　Stream<BR>1)&nbsp;CharArrayReader：与ByteArrayInputStream对应<BR>2)&nbsp;StringReader：与StringBufferInputStream对应<BR>3)&nbsp;FileReader：与FileInputStream对应<BR>4)&nbsp;PipedReader：与PipedInputStream对应<BR>2)&nbsp;Out　Stream<BR>1)&nbsp;CharArrayWrite：与ByteArrayOutputStream对应<BR>2)&nbsp;StringWrite：无与之对应的以字节为导向的stream<BR>3)&nbsp;FileWrite：与FileOutputStream对应<BR>4)&nbsp;PipedWrite：与PipedOutputStream对应<BR>以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类<BR>实现的功能相同，字是在操作时的导向不同。如CharArrayReader：和ByteArrayInputStream<BR>的作用都是把内存中的一个缓冲区作为InputStream使用，所不同的是前者每次从内<BR>存中读取一个字节的信息，而后者每次从内存中读取一个字符。<BR>1.3&nbsp;两种不现导向的stream之间的转换<BR>InputStreamReader和OutputStreamReader：把一个以字节为导向的stream转换成一<BR>个以字符为导向的stream。<BR>2.&nbsp;stream添加属性<BR>2.1&nbsp;“为stream添加属性”的作用<BR>运用上面介绍的Java中操作IO的API，我们就可完成我们想完成的任何操作了。但通<BR>过FilterInputStream和FilterOutStream的子类，我们可以为stream添加属性。下面<BR>以一个例子来说明这种功能的作用。<BR>如果我们要往一个文件中写入数据，我们可以这样操作：<BR>FileOutStream&nbsp;fs&nbsp;=&nbsp;new&nbsp;FileOutStream(“test.txt”);<BR>然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但<BR>是，如果我们想实现“先把要写入文件的数据先缓存到内存中，再把缓存中的数据写<BR>入文件中”的功能时，上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream<BR>和FilterOutStream的子类，为FileOutStream添加我们所需要的功能。<BR>2.2&nbsp;FilterInputStream的各种类型<BR>2.2.1&nbsp;用于封装以字节为导向的InputStream<BR>1)&nbsp;DataInputStream：从stream中读取基本类型（int、char等）数据。<BR>2)&nbsp;BufferedInputStream：使用缓冲区<BR>3)&nbsp;LineNumberInputStream：会记录input&nbsp;stream内的行数，然后可以调用getLineNumber<BR>()和setLineNumber(int)<BR>4)&nbsp;PushbackInputStream：很少用到，一般用于编译器开发<BR>2.2.2&nbsp;用于封装以字符为导向的InputStream<BR>1)&nbsp;没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader<BR>，否则使用DataInputStream<BR>2)&nbsp;BufferedReader：与BufferedInputStream对应<BR>3)&nbsp;LineNumberReader：与LineNumberInputStream对应<BR>4)&nbsp;PushBackReader：与PushbackInputStream对应<BR>2.3&nbsp;FilterOutStream的各种类型<BR>2.2.3&nbsp;用于封装以字节为导向的OutputStream<BR>1)&nbsp;DataIOutStream：往stream中输出基本类型（int、char等）数据。<BR>2)&nbsp;BufferedOutStream：使用缓冲区<BR>3)&nbsp;PrintStream：产生格式化输出<BR>2.2.4&nbsp;用于封装以字符为导向的OutputStream<BR>1)&nbsp;BufferedWrite：与对应<BR>2)&nbsp;PrintWrite：与对应<BR>3.&nbsp;RandomAccessFile<BR>1)&nbsp;可通过RandomAccessFile对象完成对文件的读写操作<BR>2)&nbsp;在产生一个对象时，可指明要打开的文件的性质：r，只读；w，只写；rw可读写<BR><BR>3)&nbsp;可以直接跳到文件中指定的位置<BR>4.&nbsp;I/O应用的一个例子<BR>import&nbsp;java.io.*;<BR>public&nbsp;class&nbsp;TestIO{<BR>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)<BR>throws&nbsp;IOException{<BR>//1.以行为单位从一个文件读取数据<BR>BufferedReader&nbsp;in&nbsp;=&nbsp;<BR>new&nbsp;BufferedReader(<BR>new&nbsp;FileReader("F:nepalonTestIO.java"));<BR>String&nbsp;s,&nbsp;s2&nbsp;=&nbsp;new&nbsp;String();<BR>while((s&nbsp;=&nbsp;in.readLine())&nbsp;!=&nbsp;null)<BR>s2&nbsp;+=&nbsp;s&nbsp;+&nbsp;"n";<BR>in.close();<BR><BR>//1b.&nbsp;接收键盘的输入<BR>BufferedReader&nbsp;stdin&nbsp;=&nbsp;<BR>new&nbsp;BufferedReader(<BR>new&nbsp;InputStreamReader(System.in));<BR>System.out.println("Enter&nbsp;a&nbsp;line:");<BR>System.out.println(stdin.readLine());<BR><BR>//2.&nbsp;从一个String对象中读取数据<BR>StringReader&nbsp;in2&nbsp;=&nbsp;new&nbsp;StringReader(s2);<BR>int&nbsp;c;<BR>while((c&nbsp;=&nbsp;in2.read())&nbsp;!=&nbsp;-1)<BR>System.out.println((char)c);<BR>in2.close();<BR><BR>//3.&nbsp;从内存取出格式化输入<BR>try{<BR>DataInputStream&nbsp;in3&nbsp;=&nbsp;<BR>new&nbsp;DataInputStream(<BR>new&nbsp;ByteArrayInputStream(s2.getBytes()));<BR>while(true)<BR>System.out.println((char)in3.readByte());&nbsp;<BR>}<BR>catch(EOFException&nbsp;e){<BR>System.out.println("End&nbsp;of&nbsp;stream");<BR>}<BR><BR>//4.&nbsp;输出到文件<BR>try{<BR>BufferedReader&nbsp;in4&nbsp;=<BR>new&nbsp;BufferedReader(<BR>new&nbsp;StringReader(s2));<BR>PrintWriter&nbsp;out1&nbsp;=<BR>new&nbsp;PrintWriter(<BR>new&nbsp;BufferedWriter(<BR>new&nbsp;FileWriter("F:nepalon&nbsp;TestIO.out")));<BR>int&nbsp;lineCount&nbsp;=&nbsp;1;<BR>while((s&nbsp;=&nbsp;in4.readLine())&nbsp;!=&nbsp;null)<BR>out1.println(lineCount++&nbsp;+&nbsp;"："&nbsp;+&nbsp;s);<BR>out1.close();<BR>in4.close();<BR>}<BR>catch(EOFException&nbsp;ex){<BR>System.out.println("End&nbsp;of&nbsp;stream");<BR>}<BR><BR>//5.&nbsp;数据的存储和恢复<BR>try{<BR>DataOutputStream&nbsp;out2&nbsp;=&nbsp;<BR>new&nbsp;DataOutputStream(<BR>new&nbsp;BufferedOutputStream(<BR>new&nbsp;FileOutputStream("F:nepalon&nbsp;Data.txt")));<BR>out2.writeDouble(3.1415926);<BR>out2.writeChars("nThas&nbsp;was&nbsp;pi:writeCharsn");<BR>out2.writeBytes("Thas&nbsp;was&nbsp;pi:writeByten");<BR>out2.close();<BR>DataInputStream&nbsp;in5&nbsp;=<BR>new&nbsp;DataInputStream(<BR>new&nbsp;BufferedInputStream(<BR>new&nbsp;FileInputStream("F:nepalon&nbsp;Data.txt")));<BR>BufferedReader&nbsp;in5br&nbsp;=<BR>new&nbsp;BufferedReader(<BR>new&nbsp;InputStreamReader(in5));<BR>System.out.println(in5.readDouble());<BR>System.out.println(in5br.readLine());<BR>System.out.println(in5br.readLine());<BR>}<BR>catch(EOFException&nbsp;e){<BR>System.out.println("End&nbsp;of&nbsp;stream");<BR>}<BR><BR>//6.&nbsp;通过RandomAccessFile操作文件<BR>RandomAccessFile&nbsp;rf&nbsp;=<BR>new&nbsp;RandomAccessFile("F:nepalon&nbsp;rtest.dat",&nbsp;"rw");<BR>for(int&nbsp;i=0;&nbsp;i&lt;10;&nbsp;i++)<BR>rf.writeDouble(i*1.414);<BR>rf.close();<BR><BR>rf&nbsp;=&nbsp;new&nbsp;RandomAccessFile("F:nepalon&nbsp;rtest.dat",&nbsp;"r");<BR>for(int&nbsp;i=0;&nbsp;i&lt;10;&nbsp;i++)<BR>System.out.println("Value&nbsp;"&nbsp;+&nbsp;i&nbsp;+&nbsp;"："&nbsp;+&nbsp;rf.readDouble());<BR>rf.close();<BR><BR>rf&nbsp;=&nbsp;new&nbsp;RandomAccessFile("F:nepalon&nbsp;rtest.dat",&nbsp;"rw");<BR>rf.seek(5*8);<BR>rf.writeDouble(47.0001);<BR>rf.close();<BR><BR>rf&nbsp;=&nbsp;new&nbsp;RandomAccessFile("F:nepalon&nbsp;rtest.dat",&nbsp;"r");<BR>for(int&nbsp;i=0;&nbsp;i&lt;10;&nbsp;i++)<BR>System.out.println("Value&nbsp;"&nbsp;+&nbsp;i&nbsp;+&nbsp;"："&nbsp;+&nbsp;rf.readDouble());<BR>rf.close();<BR>}<BR>}<BR>关于代码的解释（以区为单位）：<BR>1区中，当读取文件时，先把文件内容读到缓存中，当调用in.readLine()时，再从缓<BR>存中以字符的方式读取数据（以下简称“缓存字节读取方式”）。<BR>1b区中，由于想以缓存字节读取方式从标准IO（键盘）中读取数据，所以要先把标准<BR>IO（System.in）转换成字符导向的stream，再进行BufferedReader封装。<BR>2区中，要以字符的形式从一个String对象中读取数据，所以要产生一个StringReader<BR>类型的stream。<BR>4区中，对String对象s2读取数据时，先把对象中的数据存入缓存中，再从缓冲中进<BR>行读取；对TestIO.out文件进行操作时，先把格式化后的信息输出到缓存中，再把缓<BR>存中的信息输出到文件中。<BR>5区中，对Data.txt文件进行输出时，是先把基本类型的数据输出屋缓存中，再把缓<BR>存中的数据输出到文件中；对文件进行读取操作时，先把文件中的数据读取到缓存中<BR>，再从缓存中以基本类型的形式进行读取。注意in5.readDouble()这一行。因为写入<BR>第一个writeDouble()，所以为了正确显示。也要以基本类型的形式进行读取。<BR>6区是通过RandomAccessFile类对文件进行操作。<BR><img src ="http://www.blogjava.net/Gemscorpio/aggbug/13981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Gemscorpio/" target="_blank">MudFish</a> 2005-09-25 11:24 <a href="http://www.blogjava.net/Gemscorpio/articles/13981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat的配置</title><link>http://www.blogjava.net/Gemscorpio/articles/11319.html</link><dc:creator>MudFish</dc:creator><author>MudFish</author><pubDate>Sat, 27 Aug 2005 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/Gemscorpio/articles/11319.html</guid><wfw:comment>http://www.blogjava.net/Gemscorpio/comments/11319.html</wfw:comment><comments>http://www.blogjava.net/Gemscorpio/articles/11319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Gemscorpio/comments/commentRss/11319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Gemscorpio/services/trackbacks/11319.html</trackback:ping><description><![CDATA[<FONT size=2>如何tomcat下配置jsp、servlet和bean<BR>(这是我配置成功的，还有许多地方不合理，欢迎大家指教)<BR>第一步：</FONT><FONT color=#f70909><FONT size=2>下载j2sdk和tomcat：<BR>到sun官方站点<FONT color=#000000>（</FONT></FONT><A href="http://java.sun.com/j2se/1.5.0/download.jsp"><FONT size=2>http://java.sun.com/j2se/1.5.0/download.jsp</FONT></A><FONT size=2><FONT color=#000000>）下载j2sdk，注意下载版本为Windows Offline Installation的SDK，同时最好下载J2SE&nbsp; Documentation，<BR></FONT><FONT color=#ff0000>然后到tomcat官方站点</FONT><FONT color=#000000>（</FONT></FONT><A href="http://www.apache.org/dist/jakarta/tomcat-5/"><FONT size=2>http://www.apache.org/dist/jakarta/tomcat-5/</FONT></A></FONT><FONT color=#000000><FONT size=2>）下载tomcat（下载最新版本的tomcat）；</FONT> <BR><FONT size=2>（这里我下的是jdk 1.5.0，tomcat 5.59）<BR><BR>第二步：</FONT><FONT color=#ff0000 size=2>安装和配置你的j2sdk和tomcat：<BR></FONT><FONT color=#000000><FONT size=2>执行j2sdk和tomcat的安装程序，然后一路Next即可。(安装tomcat的时候要提示你输入Admin的密码，记得把自己输的密码记下来)1.安装j2sdk以后，需要配置一下环境变量，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量<BR></FONT><FONT size=2><FONT color=#ff0000>JAVA_HOME=H:\Java\jdk1.5.0 <BR>classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;（.;一定不能少，因为它代表当前路径) <BR>path=%JAVA_HOME%\bin</FONT><BR>(这里我的安装目录是H:\Java\jdk1.5.0，我只是根据自己的安装目录来讲配置，当然，你可以有一个更傻瓜的取得安装目录的方法，直接从我的电脑进到你的安装目录，然后复制地址栏里的地址即可^_^)<BR>接着，我们来测试你的java开发环境是否已经配好，以经典的HelloWorld开始吧：<BR></FONT><FONT size=2><FONT color=#0000ff>public class HelloWorld {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String [] args) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("HelloWorld!");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>}<BR></FONT><FONT color=#000000>将上面这段程序另存为HelloWorld.java。进入cmd，然后cd到HelloWorld.java所在的目录，键入如下命令<FONT color=#ff0000>javac HelloWorld.java</FONT></FONT><FONT color=#000000>接着<FONT color=#ff0000>java HelloWorld</FONT></FONT><FONT color=#000000>此时你应该看到输出的是HelloWorld!，说明java环境配置成功^_^;<BR>
<P>2.安装Tomcat后，在我的电脑-&gt;属性-&gt;高级-&gt;环境变量-&gt;系统变量中添加以下环境变量<BR>这里我的安装目录是H:\Tomcat 5.5，以我的为例说<BR><FONT color=#ff0000>CATALINA_HOME=H:\Tomcat 5.5; <BR>CATALINA_BASE=H:\Tomcat 5.5; <BR><FONT color=#000000>然后修改环境变量中的classpath，把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去<BR>以下是修改后的classpath：<BR><FONT color=#ff0000>.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar;%CATALINA_HOME%\common\lib\mssqlserver.jar;<BR><FONT color=#000000>接着可以启动tomcat，在IE中访问</FONT><A href="http://localhost:8080/">http://localhost:8080</A></FONT><FONT color=#000000>，如果看到tomcat的那支小猫话说明安装成功了。<BR><BR>第三步：</FONT><FONT color=#ff0000>建立自己的jsp app目录 <BR><FONT color=#000000>1.到Tomcat的安装目录的webapps目录，可以看到ROOT，examples, tomcat-docs之类Tomcat自带的的目录； <BR>2.在webapps目录下新建一个目录，起名叫myapp；&nbsp; <BR>3.在myapp下新建一个测试的jsp页面，文件名为index.jsp，文件内容如下： <BR></FONT><FONT color=#0000ff>&lt;</FONT><A href="mailto:%@page"><FONT color=#0000ff>%@page</FONT></A><FONT color=#0000ff> contentType="text/html;charset=gb2312" language="java"%&gt;<BR>&lt;html&gt;<BR>&lt;body&gt;<BR>&lt;center&gt;<BR>&lt;% <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("HelloWorld!");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("你好!世界!");<BR>%&gt;<BR>&lt;/center&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt; <BR></FONT><FONT color=#000000>4.重启Tomcat <BR>5.打开浏览器，输入</FONT><A href="http://localhost:8080/myapp/index.jsp">http://localhost:8080/myapp/index.jsp</A></FONT><FONT color=#000000> 看到<BR>HelloWorld! 你好!世界!<BR>的话说明就成功了。<BR><BR>第四步：</FONT><FONT color=#ff0000>建立自己的Servlet：<BR><FONT color=#000000>1.在webapps目录下新建一个目录，起名叫HelloWorld；<BR></P>
<P>2.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个servlet程序，文件名为HelloWorld.java，文件内容如下： <BR><FONT color=#0000ff>import javax.servlet.http.HttpServlet;<BR>import javax.servlet.http.HttpServletRequest;<BR>import javax.servlet.http.HttpServletResponse;<BR>import java.io.IOException;<BR>import java.io.PrintWriter;<BR>import javax.servlet.ServletException;</FONT></P><FONT color=#0000ff></FONT><FONT color=#0000ff>
<P><BR>public class HelloWorld extends HttpServlet {<BR>&nbsp;&nbsp;&nbsp; public void doGet(HttpServletRequest request,HttpServletResponse response)<BR>&nbsp;&nbsp; throws IOException, ServletException {<BR>&nbsp;&nbsp;&nbsp; response.setContentType("text/html");<BR>&nbsp;&nbsp;&nbsp; PrintWriter writer = response.getWriter();<BR>&nbsp;&nbsp;&nbsp; writer.println("Hello World!");<BR>&nbsp;&nbsp; }<BR>}</FONT>&nbsp;<BR></P>
<P>3&nbsp;.编译 <BR>将HelloWorld.java编译 <BR>然后在会产生一个编译后的servlet文件：HelloWorld.class&nbsp;<BR>4 .将结构HelloWorld.class剪切到%CATALINA_HOME%\webapps\HelloWorld\WEB-INF\classes下，如果WEB-INF\classes目录不存在，就新建一个。 现在webapps\HelloWorld\WEB-INF\classes下有HelloWorld.class的文件.(注意：要注意文件夹和文件名的大小写！)<BR>5&nbsp;.在webapps\HelloWorld\WEB-INF下新建web.xml文件，添加servlet和servlet-mapping <BR>编辑后的web.xml如下所示：<BR></P>
<P><FONT color=#ff0000>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; </FONT></P>
<P><FONT color=#ff0000>&lt;web-app xmlns="</FONT><A href="http://java.sun.com/xml/ns/j2ee"><FONT color=#ff0000>http://java.sun.com/xml/ns/j2ee</FONT></A><FONT color=#ff0000>" <BR>xmlns:xsi="</FONT><A href="http://www.w3.org/2001/XMLSchema-instance"><FONT color=#ff0000>http://www.w3.org/2001/XMLSchema-instance</FONT></A><FONT color=#ff0000>" <BR>version="2.4" <BR>xsi:schemaLocation="</FONT><A href="http://java.sun.com/xml/ns/j2ee"><FONT color=#ff0000>http://java.sun.com/xml/ns/j2ee</FONT></A><FONT color=#ff0000>&nbsp;&nbsp; <BR></FONT><A href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><FONT color=#ff0000>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</FONT></A><FONT color=#ff0000>"&gt;</FONT></P>
<P><BR><FONT color=#ff0000>&lt;display-name&gt;HelloWorld&lt;/display-name&gt; <BR>&lt;description&gt; <BR>HelloWorld<BR>&lt;/description&gt; <BR>&lt;servlet&gt; <BR>&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt; <BR>&lt;display-name&gt;HelloWorld&lt;/display-name&gt; <BR>&lt;description&gt;HelloWorld&lt;/description&gt; <BR>&lt;servlet-class&gt;HelloWorld&lt;/servlet-class&gt; <BR>&lt;/servlet&gt; <BR>&lt;servlet-mapping&gt; <BR>&lt;servlet-name&gt;HelloWorld&lt;/servlet-name&gt; <BR>&lt;url-pattern&gt;/Hello&lt;/url-pattern&gt; <BR>&lt;/servlet-mapping&gt; <BR>&lt;/web-app&gt; <BR><FONT color=#000000>这段话中的servlet这一段声明了你要调用的Servlet，而servlet-mapping则是将声明的servlet“映射”到地址/Hello上&nbsp;</FONT><BR><FONT color=#000000>6 .好了，启动Tomcat，启动浏览器，输入</FONT><A href="http://localhost:8080/HelloWorld/Hello">http://localhost:8080/HelloWorld/Hello</A></FONT><FONT color=#000000> 如果看到输出Hello World! .就说明编写的servlet成功了。 <BR>(注意：修改了web.xml以及新加了class，都要重启Tomcat .)<BR>第五步：建立自己的Bean： <BR>1.用你最熟悉的编辑器（建议使用有语法检查的java ide）新建一个java程序，文件名为TestBean.java，文件内容如下： <BR><FONT color=#0000ff>package test; <BR>public class TestBean{ <BR>private String name = null; <BR>public TestBean(String strName_p){ <BR>this.name=strName_p; <BR>}&nbsp; <BR>public void setName(String strName_p){ <BR>this.name=strName_p; <BR>} <BR>public String getName(){ <BR>return this.name; <BR>}&nbsp; <BR>} <BR></FONT>2 .编译 <BR>将TestBean.java放在c:\test下，使用如下命令编译： <BR>C:\Test&gt;javac TestBean.java <BR>然后在c:\Test下会产生一个编译后的bean文件：TestBean.class <BR>3 .将TestBean.class文件剪切到 %CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下， <BR>4 .新建一个TestBean.jsp文件，文件内容为： <BR><FONT color=#0000ff>&lt;%@ page import="test.TestBean" %&gt;&nbsp; <BR>&lt;html&gt;&lt;body&gt;&lt;center&gt; <BR>&lt;% <BR>TestBean testBean=new TestBean("This is a test java bean."); <BR>%&gt; <BR>Java bean name is: &lt;%=testBean.getName()%&gt; <BR>&lt;/center&gt;&lt;/body&gt;&lt;/html&gt;&nbsp; <BR></FONT>5 .好了，重启Tomcat，启动浏览器，输入<A href="http://localhost:8080/myapp/TestBean.jsp">http://localhost:8080/myapp/TestBean.jsp</A> 如果看到输出Java bean name is: This is a test java bean.就说明编写的Bean成功了<BR>这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。接下来需要做的事情就是多看书、多读别人的好代码，自己多动手写代码以增强自己在这方面开发的能力了。</FONT></P></FONT></FONT></FONT></FONT></FONT></FONT></FONT></FONT><img src ="http://www.blogjava.net/Gemscorpio/aggbug/11319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Gemscorpio/" target="_blank">MudFish</a> 2005-08-27 15:50 <a href="http://www.blogjava.net/Gemscorpio/articles/11319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>