??xml version="1.0" encoding="utf-8" standalone="yes"?> 2.安装Tomcat后,在我的电?>属?>高->环境变量->pȝ变量中添加以下环境变?BR>q里我的安装目录是H:\Tomcat 5.5Q以我的Z?BR>CATALINA_HOME=H:\Tomcat 5.5; 2.用你最熟悉的编辑器Q徏议用有语法查的java ideQ新Z个servletE序Q文件名为HelloWorld.javaQ文件内容如下:
(1)建立一个项?BR> (2)建立属?BR> (3)Ҏ据库的操?BR> (4)javac~译
(5)删除目录
(6)建立目录
(7)拯文g?nbsp;
(8)jarZ个包
(9)拯单个文g
(10)q行
有更多更好的常用?我没惛_?希望大家补充?nbsp;
<!--(1)建立一个项目,默认的操作ؓtarget=all. -->
<project name="proj" default="all" basedir=".">
<!--(2)建立一些属性,以供下边的操作用?nbsp;-->
<property name="root" value="./" />
<property name="deploy_path" value="d:/deploy" />
<property name="srcfile" value="d:/srcfile" />
<target name="all" depends="compile,deploy"/>
<!--(3)Ҏ据库的操?nbsp;demo.ddl中写的是sql语句 driver,url,userid,password
随具体情况设|?->
<!-- Oracle -->
<target name="db_setup_oracle" description="Database setup for Oracle
">
<antcall target="check_params_results"/>
<sql driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@192.168.0.1:1521:oa"
userid="oa" password="oa"
onerror="continue"
print="yes"
src="./demo.ddl"/>
</target>
<!--(4)javac~译 -->
<target name="compile">
<javac srcdir="${srcfile}"
destdir="${root}/oa/"
includes="*.java"
classpath="${CLASSPATH};${CLIENT_CLASSES}/utils_common.jar" <!--CLASSPATH
和CLIENT_CLASSES是环境变?->
/>
</target>
<target name="deploy" depends="compile">
<!-- Create the time stamp -->
<tstamp/>
<!--(5)删除目录-->
<!--(6)建立目录-->
<delete dir="${root}/dist/"/>
<mkdir dir="${root}/dist/"/>
<delete dir="${deploy_path}"/>
<mkdir dir="${deploy_path}"/>
<!--(7)拯文g?->
<copy todir="${root}/dist/">
<fileset dir="${root}/oa/">
<include name="*.class"/>
</fileset>
</copy>
<!--(8)jarZ个包-->
<jar jarfile="${deploy_path}/classjar.jar" basedir="${root}/dist" update
="yes"></jar>
<!--(9)拯单个文g(上边是文件群,q是单个文g)-->
<copy file="${deploy_path}/classjar.jar" todir="${root}/dist/"/>
</target>
<!--(10)q行(args中是参数,随应用程序的具体情况有所不同)->
<target name="simplesql" depends="compile,db_setup_oracle">
<java classname="examples.jdbc.oracle.simplesql"
fork="yes" failonerror="yes"
args="-user zrb
-password zrb
"/>
</project>
]]>
2. 栈的优势是,存取速度比堆要快Q仅ơ于直接位于CPU中的寄存器。但~点?BR>Q存在栈中的数据大小与生存期必须是确定的Q缺乏灵zL。另外,栈数据可以共?BR>Q详见第3炏V堆的优势是可以动态地分配内存大小Q生存期也不必事先告诉编译器
QJava的垃圾收集器会自动收走这些不再用的数据。但~点是,׃要在q行时动
态分配内存,存取速度较慢?BR>
3. Java中的数据cd有两U?BR>
一U是基本cd(primitive types), 共有8U,即int, short, long, byte, float
, double, boolean, char(注意Qƈ没有string的基本类?。这U类型的定义是?BR>q诸如int a = 3; long b = 255L;的Ş式来定义的,UCؓ自动变量。值得注意的是
Q自动变量存的是字面|不是cȝ实例Q即不是cȝ引用Q这里ƈ没有cȝ存在?BR>如int a = 3; q里的a是一个指向intcd的引用,指向3q个字面倹{这些字面值的
数据Q由于大可知,生存期可?q些字面值固定定义在某个E序块里面,E序?BR>退出后Q字D值就消失?Q出于追求速度的原因,存在于栈中?BR>
另外Q栈有一个很重要的特D性,是存在栈中的数据可以共享。假设我们同?BR>定义Q?BR>
int a = 3;
int b = 3Q?nbsp;
~译器先处理int a = 3Q首先它会在栈中创徏一个变量ؓa的引用,然后查找?BR>没有字面gؓ3的地址Q没扑ֈQ就开辟一个存?q个字面值的地址Q然后将a指向
3的地址。接着处理int b = 3Q在创徏完b的引用变量后Q由于在栈中已经?q个?BR>面|便将b直接指向3的地址。这P出Ca与b同时均指?的情c?BR>
特别注意的是Q这U字面值的引用与类对象的引用不同。假定两个类对象的引?BR>同时指向一个对象,如果一个对象引用变量修改了q个对象的内部状态,那么另一?BR>对象引用变量也即d映出q个变化。相反,通过字面值的引用来修改其|不会?BR>致另一个指向此字面值的引用的g跟着改变的情c如上例Q我们定义完a与b的?BR>后,再oa=4Q那么,b不会{于4Q还是等?。在~译器内部,遇到a=4Q时Q它?BR>会重新搜索栈中是否有4的字面|如果没有Q重新开辟地址存放4的|如果已经?BR>了,则直接将a指向q个地址。因此a值的改变不会影响到b的倹{?BR>
另一U是包装cL据,如Integer, String, Double{将相应的基本数据类型包
装v来的cR这些类数据全部存在于堆中,Java用new()语句来显C地告诉~译器,
在运行时才根据需要动态创建,因此比较灉|Q但~点是要占用更多的时间?nbsp;4. String
是一个特D的包装cL据。即可以用String str = new String("abc");的Ş式来?BR>建,也可以用String str = "abc"Q的形式来创?作ؓҎQ在JDK 5.0之前Q你?BR>未见qInteger i = 3;的表辑ּQ因为类与字面值是不能通用的,除了String。而在
JDK 5.0中,q种表达式是可以的!因ؓ~译器在后台q行Integer i = new Integer
(3)的{?。前者是规范的类的创E,卛_Java中,一切都是对象,而对象是c?BR>的实例,全部通过new()的Ş式来创徏。Java中的有些c,如DateFormatc,可以?BR>q该cȝgetInstance()Ҏ来返回一个新创徏的类Q似乎违反了此原则。其实不?BR>。该c运用了单例模式来返回类的实例,只不q这个实例是在该cd部通过new()?BR>创徏的,而getInstance()向外部隐藏了此细节。那Z么在String str = "abc"Q?BR>中,q没有通过new()来创建实例,是不是违反了上述原则Q其实没有?BR>
5. 关于String str = "abc"的内部工作。Java内部此语句转化Z下几个步
骤:
(1)先定义一个名为str的对Stringcȝ对象引用变量QString strQ?BR>
(2)在栈中查找有没有存放gؓ"abc"的地址Q如果没有,则开辟一个存攑֭面?BR>?abc"的地址Q接着创徏一个新的Stringcȝ对象oQƈo的字W串值指向这个地
址Q而且在栈中这个地址旁边Cq个引用的对象o。如果已l有了gؓ"abc"的地址
Q则查找对象oQƈq回o的地址?BR>
(3)str指向对象o的地址?BR>
值得注意的是Q一般StringcM字符串值都是直接存值的。但像String str =
"abc"Q这U场合下Q其字符串值却是保存了一个指向存在栈中数据的引用Q?BR>
Z更好地说明这个问题,我们可以通过以下的几个代码进行验证?BR>
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
注意Q我们这里ƈ不用str1.equals(str2)Q的方式Q因比较两个字W串
的值是否相{?=PҎJDK的说明,只有在两个引用都指向了同一个对象时才返
回真倹{而我们在q里要看的是Qstr1与str2是否都指向了同一个对象?BR>l果说明QJVM创徏了两个引用str1和str2Q但只创Z一个对象,而且两个引用?BR>指向了这个对象?BR>
我们再来更进一步,以上代码改成:
String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
System.out.println(str1 + "," + str2); //bcd, abc
System.out.println(str1==str2); //false
q就是说Q赋值的变化D了类对象引用的变化,str1指向了另外一个新对象Q?BR>而str2仍旧指向原来的对象。上例中Q当我们str1的值改?bcd"ӞJVM发现在栈
中没有存放该值的地址Q便开辟了q个地址Qƈ创徏了一个新的对象,其字W串的?BR>指向q个地址?BR>
事实上,Stringc被设计成ؓ不可改变(immutable)的类。如果你要改变其|
可以Q但JVM在运行时Ҏ新值悄悄创Z一个新对象Q然后将q个对象的地址q回
l原来类的引用。这个创E虽说是完全自动q行的,但它毕竟占用了更多的旉
。在Ҏ间要求比较敏感的环境中,会带有一定的不良影响?BR>
再修改原来代码:
String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
String str3 = str1;
System.out.println(str3); //bcd
String str4 = "bcd";
System.out.println(str1 == str4); //true
str3q个对象的引用直接指向str1所指向的对?注意Qstr3q没有创建新对象
)。当str1改完其值后Q再创徏一个String的引用str4Qƈ指向因str1修改D创?BR>的新的对象。可以发玎ͼq回str4也没有创建新的对象,从而再ơ实现栈中数据的?BR>享?BR>
我们再接着看以下的代码?BR>
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1==str2); //false
创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?BR>
String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2); //false
创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?BR>
以上两段代码说明Q只要是用new()来新建对象的Q都会在堆中创徏Q而且其字
W串是单独存值的Q即使与栈中的数据相同,也不会与栈中的数据共享?BR>
6. 数据cd包装cȝg可修攏V不仅仅是Stringcȝg可修改,所有的?BR>据类型包装类都不能更改其内部的倹{?nbsp;7. l论与徏议:
(1)我们在用诸如String str = "abc"Q的格式定义cLQL惛_然地认ؓ
Q我们创ZStringcȝ对象str。担心陷阱!对象可能q没有被创徏Q唯一可以?BR>定的是,指向Stringcȝ引用被创Z。至于这个引用到底是否指向了一个新的对?BR>Q必L据上下文来考虑Q除非你通过new()Ҏ来显要地创徏一个新的对象。因?BR>Q更为准的说法是,我们创徏了一个指向Stringcȝ对象的引用变量strQ这个对
象引用变量指向了某个gؓ"abc"的StringcR清醒地认识到这一点对排除E序中难
以发现的bug是很有帮助的?BR>
(2)使用String str = "abc"Q的方式Q可以在一定程度上提高E序的运行速度
Q因为JVM会自动根据栈中数据的实际情况来决定是否有必要创徏新对象。而对于String
str = new String("abc")Q的代码Q则一概在堆中创徏新对象,而不其字符串?BR>是否相等Q是否有必要创徏新对象,从而加重了E序的负担。这个思想应该是n元模
式的思想Q但JDK的内部在q里实现是否应用了这个模式,不得而知?BR>
(3)当比较包装类里面的数值是否相{时Q用equals()ҎQ当试两个包装c?BR>的引用是否指向同一个对象时Q用==?BR>
(4)׃Stringcȝimmutable性质Q当String变量需要经常变换其值时Q应该?BR>虑用StringBufferc,以提高程序效率?BR>
]]>
1. stream代表的是M有能力出数据的数据源,或是M有能力接收数据的接收
源。在Java的IO中,所有的streamQ包括Input和Out streamQ都包括两种cdQ?BR>1.1 以字节ؓ导向的stream
以字节ؓ导向的streamQ表CZ字节为单位从stream中读取或往stream中写入信息?BR>以字节ؓ导向的stream包括下面几种cdQ?BR>1) input streamQ?BR>1) ByteArrayInputStreamQ把内存中的一个缓冲区作ؓInputStream使用
2) StringBufferInputStreamQ把一个String对象作ؓInputStream
3) FileInputStreamQ把一个文件作为InputStreamQ实现对文g的读取操?BR>4) PipedInputStreamQ实Cpipe的概念,主要在线E中使用
5) SequenceInputStreamQ把多个InputStream合ƈZ个InputStream
2) Out stream
1) ByteArrayOutputStreamQ把信息存入内存中的一个缓冲区?BR>2) FileOutputStreamQ把信息存入文g?BR>3) PipedOutputStreamQ实Cpipe的概念,主要在线E中使用
4) SequenceOutputStreamQ把多个OutStream合ƈZ个OutStream
1.2 以Unicode字符为导向的stream
以Unicode字符为导向的streamQ表CZUnicode字符为单位从stream中读取或往stream
中写入信息。以Unicode字符为导向的stream包括下面几种cdQ?BR>1) Input Stream
1) CharArrayReaderQ与ByteArrayInputStream对应
2) StringReaderQ与StringBufferInputStream对应
3) FileReaderQ与FileInputStream对应
4) PipedReaderQ与PipedInputStream对应
2) Out Stream
1) CharArrayWriteQ与ByteArrayOutputStream对应
2) StringWriteQ无与之对应的以字节为导向的stream
3) FileWriteQ与FileOutputStream对应
4) PipedWriteQ与PipedOutputStream对应
以字Wؓ导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类
实现的功能相同,字是在操作时的导向不同。如CharArrayReaderQ和ByteArrayInputStream
的作用都是把内存中的一个缓冲区作ؓInputStream使用Q所不同的是前者每ơ从?BR>存中d一个字节的信息Q而后者每ơ从内存中读取一个字W?BR>1.3 两种不现导向的stream之间的{?BR>InputStreamReader和OutputStreamReaderQ把一个以字节为导向的stream转换成一
个以字符为导向的stream?BR>2. streamd属?BR>2.1 “ؓstreamd属性”的作用
q用上面介绍的Java中操作IO的APIQ我们就可完成我们想完成的Q何操作了。但?BR>qFilterInputStream和FilterOutStream的子c,我们可以为streamd属性。下?BR>以一个例子来说明q种功能的作用?BR>如果我们要往一个文件中写入数据Q我们可以这h作:
FileOutStream fs = new FileOutStream(“test.txt?;
然后可以通过产生的fs对象调用write()函数来往test.txt文g中写入数据了。但
是,如果我们惛_现“先把要写入文g的数据先~存到内存中Q再把缓存中的数据写
入文件中”的功能Ӟ上面的API没有一个能满我们的需求了。但是通过FilterInputStream
和FilterOutStream的子c,为FileOutStreamd我们所需要的功能?BR>2.2 FilterInputStream的各U类?BR>2.2.1 用于装以字节ؓ导向的InputStream
1) DataInputStreamQ从stream中读取基本类型(int、char{)数据?BR>2) BufferedInputStreamQ用缓冲区
3) LineNumberInputStreamQ会记录input stream内的行数Q然后可以调用getLineNumber
()和setLineNumber(int)
4) PushbackInputStreamQ很用刎ͼ一般用于编译器开?BR>2.2.2 用于装以字Wؓ导向的InputStream
1) 没有与DataInputStream对应的类。除非在要用readLine()时改用BufferedReader
Q否则用DataInputStream
2) BufferedReaderQ与BufferedInputStream对应
3) LineNumberReaderQ与LineNumberInputStream对应
4) PushBackReaderQ与PushbackInputStream对应
2.3 FilterOutStream的各U类?BR>2.2.3 用于装以字节ؓ导向的OutputStream
1) DataIOutStreamQ往stream中输出基本类型(int、char{)数据?BR>2) BufferedOutStreamQ用缓冲区
3) PrintStreamQ生格式化输出
2.2.4 用于装以字Wؓ导向的OutputStream
1) BufferedWriteQ与对应
2) PrintWriteQ与对应
3. RandomAccessFile
1) 可通过RandomAccessFile对象完成Ҏ件的d操作
2) 在生一个对象时Q可指明要打开的文件的性质QrQ只读;wQ只写;rw可读?BR>
3) 可以直接跛_文g中指定的位置
4. I/O应用的一个例?BR>import java.io.*;
public class TestIO{
public static void main(String[] args)
throws IOException{
//1.以行为单位从一个文件读取数?BR>BufferedReader in =
new BufferedReader(
new FileReader("F:nepalonTestIO.java"));
String s, s2 = new String();
while((s = in.readLine()) != null)
s2 += s + "n";
in.close();
//1b. 接收键盘的输?BR>BufferedReader stdin =
new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Enter a line:");
System.out.println(stdin.readLine());
//2. 从一个String对象中读取数?BR>StringReader in2 = new StringReader(s2);
int c;
while((c = in2.read()) != -1)
System.out.println((char)c);
in2.close();
//3. 从内存取出格式化输入
try{
DataInputStream in3 =
new DataInputStream(
new ByteArrayInputStream(s2.getBytes()));
while(true)
System.out.println((char)in3.readByte());
}
catch(EOFException e){
System.out.println("End of stream");
}
//4. 输出到文?BR>try{
BufferedReader in4 =
new BufferedReader(
new StringReader(s2));
PrintWriter out1 =
new PrintWriter(
new BufferedWriter(
new FileWriter("F:nepalon TestIO.out")));
int lineCount = 1;
while((s = in4.readLine()) != null)
out1.println(lineCount++ + "Q? + s);
out1.close();
in4.close();
}
catch(EOFException ex){
System.out.println("End of stream");
}
//5. 数据的存储和恢复
try{
DataOutputStream out2 =
new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("F:nepalon Data.txt")));
out2.writeDouble(3.1415926);
out2.writeChars("nThas was pi:writeCharsn");
out2.writeBytes("Thas was pi:writeByten");
out2.close();
DataInputStream in5 =
new DataInputStream(
new BufferedInputStream(
new FileInputStream("F:nepalon Data.txt")));
BufferedReader in5br =
new BufferedReader(
new InputStreamReader(in5));
System.out.println(in5.readDouble());
System.out.println(in5br.readLine());
System.out.println(in5br.readLine());
}
catch(EOFException e){
System.out.println("End of stream");
}
//6. 通过RandomAccessFile操作文g
RandomAccessFile rf =
new RandomAccessFile("F:nepalon rtest.dat", "rw");
for(int i=0; i<10; i++)
rf.writeDouble(i*1.414);
rf.close();
rf = new RandomAccessFile("F:nepalon rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + "Q? + rf.readDouble());
rf.close();
rf = new RandomAccessFile("F:nepalon rtest.dat", "rw");
rf.seek(5*8);
rf.writeDouble(47.0001);
rf.close();
rf = new RandomAccessFile("F:nepalon rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + "Q? + rf.readDouble());
rf.close();
}
}
关于代码的解释(以区为单位)Q?BR>1ZQ当d文gӞ先把文g内容d~存中,当调用in.readLine()Ӟ再从~?BR>存中以字W的方式d数据Q以下简U“缓存字节读取方式”)?BR>1bZQ由于想以缓存字节读取方式从标准IOQ键盘)中读取数据,所以要先把标准
IOQSystem.inQ{换成字符导向的streamQ再q行BufferedReader装?BR>2ZQ要以字W的形式从一个String对象中读取数据,所以要产生一个StringReader
cd的stream?BR>4ZQ对String对象s2d数据Ӟ先把对象中的数据存入~存中,再从~冲中进
行读取;对TestIO.out文gq行操作Ӟ先把格式化后的信息输出到~存中,再把~?BR>存中的信息输出到文g中?BR>5ZQ对Data.txt文gq行输出Ӟ是先把基本类型的数据输出屋缓存中Q再把缓
存中的数据输出到文g中;Ҏ件进行读取操作时Q先把文件中的数据读取到~存?BR>Q再从缓存中以基本类型的形式q行d。注意in5.readDouble()q一行。因为写?BR>W一个writeDouble()Q所以ؓ了正显C。也要以基本cd的Ş式进行读取?BR>6区是通过RandomAccessFilecd文gq行操作?BR>
]]>
(q是我配|成功的Q还有许多地方不合理Q欢q大家指?
W一步:下蝲j2sdk和tomcatQ?BR>到sun官方站点Q?/FONT>http://java.sun.com/j2se/1.5.0/download.jspQ下载j2sdkQ注意下载版本ؓWindows Offline Installation的SDKQ同时最好下载J2SE DocumentationQ?BR>然后到tomcat官方站点Q?/FONT>http://www.apache.org/dist/jakarta/tomcat-5/Q下载tomcatQ下载最新版本的tomcatQ;
Q这里我下的是jdk 1.5.0Qtomcat 5.59Q?BR>
W二步:安装和配|你的j2sdk和tomcatQ?BR>执行j2sdk和tomcat的安装程序,然后一路Next卛_?安装tomcat的时候要提示你输入Admin的密码,记得把自p的密码记下来)1.安装j2sdk以后Q需要配|一下环境变量,在我的电?>属?>高->环境变量->pȝ变量中添加以下环境变?BR>JAVA_HOME=H:\Java\jdk1.5.0
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Q?;一定不能少Q因为它代表当前路径)
path=%JAVA_HOME%\bin
(q里我的安装目录是H:\Java\jdk1.5.0Q我只是Ҏ自己的安装目录来讲配|,当然Q你可以有一个更ȝ的取得安装目录的ҎQ直接从我的电脑q到你的安装目录Q然后复制地址栏里的地址卛_^_^)
接着Q我们来试你的java开发环境是否已l配好,以经典的HelloWorld开始吧Q?BR>public class HelloWorld {
public static void main(String [] args) {
System.out.println("HelloWorld!");
}
}
上面这D늨序另存ؓHelloWorld.java。进入cmdQ然后cd到HelloWorld.java所在的目录Q键入如下命?FONT color=#ff0000>javac HelloWorld.java接着java HelloWorld此时你应该看到输出的是HelloWorld!Q说明java环境配置成功^_^;
CATALINA_BASE=H:\Tomcat 5.5;
然后修改环境变量中的classpathQ把tomat安装目录下的common\lib下的servlet.jarq加到classpath中去
以下是修改后的classpathQ?BR>.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar;%CATALINA_HOME%\common\lib\mssqlserver.jar;
接着可以启动tomcatQ在IE中访?/FONT>http://localhost:8080Q如果看到tomcat的那支小猫话说明安装成功了?BR>
W三步:建立自己的jsp app目录
1.到Tomcat的安装目录的webapps目录Q可以看到ROOTQexamples, tomcat-docs之类Tomcat自带的的目录Q?
2.在webapps目录下新Z个目录,起名叫myappQ?nbsp;
3.在myapp下新Z个测试的jsp面Q文件名为index.jspQ文件内容如下:
<%@page contentType="text/html;charset=gb2312" language="java"%>
<html>
<body>
<center>
<%
out.println("HelloWorld!");
out.println("你好!世界!");
%>
</center>
</body>
</html>
4.重启Tomcat
5.打开览器,输入http://localhost:8080/myapp/index.jsp 看到
HelloWorld! 你好!世界!
的话说明成功了?BR>
W四步:建立自己的ServletQ?BR>1.在webapps目录下新Z个目录,起名叫HelloWorldQ?BR>
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.println("Hello World!");
}
}
3 .~译
HelloWorld.java~译
然后在会产生一个编译后的servlet文gQHelloWorld.class
4 .结构HelloWorld.class剪切?CATALINA_HOME%\webapps\HelloWorld\WEB-INF\classes下,如果WEB-INF\classes目录不存在,新Z个?现在webapps\HelloWorld\WEB-INF\classes下有HelloWorld.class的文?(注意Q要注意文g夹和文g名的大小写!)
5 .在webapps\HelloWorld\WEB-INF下新建web.xml文gQ添加servlet和servlet-mapping
~辑后的web.xml如下所C:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>HelloWorld</display-name>
<description>
HelloWorld
</description>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<display-name>HelloWorld</display-name>
<description>HelloWorld</description>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
</web-app>
q段话中的servletq一D声明了你要调用的ServletQ而servlet-mapping则是声明的servlet“映”到地址/Hello?nbsp;
6 .好了Q启动TomcatQ启动浏览器Q输?/FONT>http://localhost:8080/HelloWorld/Hello 如果看到输出Hello World! .p明编写的servlet成功了?
(注意Q修改了web.xml以及新加了classQ都要重启Tomcat .)
W五步:建立自己的BeanQ?
1.用你最熟悉的编辑器Q徏议用有语法查的java ideQ新Z个javaE序Q文件名为TestBean.javaQ文件内容如下:
package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;
}
public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;
}
}
2 .~译
TestBean.java攑֜c:\test下,使用如下命o~译Q?
C:\Test>javac TestBean.java
然后在c:\Test下会产生一个编译后的bean文gQTestBean.class
3 .TestBean.class文g剪切?%CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下,
4 .新徏一个TestBean.jsp文gQ文件内容ؓQ?
<%@ page import="test.TestBean" %>
<html><body><center>
<%
TestBean testBean=new TestBean("This is a test java bean.");
%>
Java bean name is: <%=testBean.getName()%>
</center></body></html>
5 .好了Q重启TomcatQ启动浏览器Q输?A href="http://localhost:8080/myapp/TestBean.jsp">http://localhost:8080/myapp/TestBean.jsp 如果看到输出Java bean name is: This is a test java bean.p明编写的Bean成功?BR>q样完成了整个Tomcat下的jsp、servlet和javabean的配|。接下来需要做的事情就是多看书、多d人的好代码,自己多动手写代码以增己在q方面开发的能力了?/FONT>