<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>余韬的博客 -  图言兔语,道听兔说！ &#187; JAVA</title>
	<atom:link href="http://yutao.net/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://yutao.net</link>
	<description>图言兔语,道听兔说！</description>
	<lastBuildDate>Sun, 25 Jul 2010 16:22:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>分享下高手除去手机游戏无法用模拟器玩代码</title>
		<link>http://yutao.net/time/sharing-under-the-master-can-not-remove-the-cell-phone-game-emulator-to-play-the-code.shtml</link>
		<comments>http://yutao.net/time/sharing-under-the-master-can-not-remove-the-cell-phone-game-emulator-to-play-the-code.shtml#comments</comments>
		<pubDate>Sat, 26 Dec 2009 06:04:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[与时俱进]]></category>
		<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://yutao.net/?p=304</guid>
		<description><![CDATA[<p>发一段魔女传II六道轮回的代码<br />
<code>public static boolean b()<br />
    {<br />
        try<br />
        {<br />
            if(Runtime.getRuntime().totalMemory() == 0x7a1200L)<br />
                [......]</code></p><p class='read-more'><a href='http://yutao.net/time/sharing-under-the-master-can-not-remove-the-cell-phone-game-emulator-to-play-the-code.shtml'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>发一段魔女传II六道轮回的代码<br />
<code>public static boolean b()<br />
    {<br />
        try<br />
        {<br />
            if(Runtime.getRuntime().totalMemory() == 0x7a1200L)<br />
                return true;<br />
            if(Class.forName("emulator.Emulator") != null)<br />
                return true;<br />
            if(Class.forName("java.applet.Applet") != null)<br />
                return true;<br />
        }<br />
        catch(ClassNotFoundException _ex) { }<br />
        return false;<br />
    }<br />
</code><br />
Runtime.getRuntime().totalMemory()这句是获得手机的内存大小<br />
Class.forName(&#8220;emulator.Emulator&#8221;) 是查找游戏包里是否有emulator.Emulator的类<br />
Class.forName这句是获得某个class的名字<br />
java.applet.Applet<br />
emulator.Emulator<br />
都是存在于模拟器里的class<br />
这段代码从三方面屏蔽了模拟器运行<br />
if(Runtime.getRuntime().totalMemory() == 0x7a1200L)<br />
                return true;<br />
屏蔽sjboy<br />
if(Class.forName(&#8220;emulator.Emulator&#8221;) != null)<br />
                return true;<br />
屏蔽ke模拟器<br />
if(Class.forName(&#8220;java.applet.Applet&#8221;) != null)<br />
                return true;<br />
屏蔽sun公司的java模拟器<br />
所以就不能让这方法返回真,<br />
必须修改为return false<br />
比如sjboy对震动包支持有限,就可以用高频率的震动导致sjboy退出</p>
<p>上面就是一个高手的基于“发一段魔女传II六道轮回的代码”的经典案例，大家都自己摸索下吧，我也去消化下。</p>
]]></content:encoded>
			<wfw:commentRss>http://yutao.net/time/sharing-under-the-master-can-not-remove-the-cell-phone-game-emulator-to-play-the-code.shtml/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>择录：Java学习从入门到精通</title>
		<link>http://yutao.net/native/java-to-learn-from-entry-to-the-master.shtml</link>
		<comments>http://yutao.net/native/java-to-learn-from-entry-to-the-master.shtml#comments</comments>
		<pubDate>Tue, 24 Feb 2009 00:10:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[兔生兔长]]></category>
		<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://yutaoblog.cn/?p=50</guid>
		<description><![CDATA[一、 JDK (Java Development Kit)


　　JDK是整个Java的核心，包括了Java运行环境（Java Runtime Envirnment），一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK，除了Sun之外，还有很多公司和组织都开发了自己的JDK，例如IBM公司开发的JDK，BEA公司的Jrocket，还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM（Java Virtual Machine）运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说，我们还是需要先把Sun JDK掌握好。

　　1、 JDK[......]<p class='read-more'><a href='http://yutao.net/native/java-to-learn-from-entry-to-the-master.shtml'></a></p>]]></description>
			<content:encoded><![CDATA[<div><strong>Java Learning Path （一）工具篇</strong></div>
<p><strong>一、 JDK (Java Development Kit)</strong></p>
<p><strong> </strong></p>
<p>JDK是整个Java的核心，包括了Java运行环境（Java Runtime Envirnment），一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK，除了Sun之外，还有很多公司和组织都开发了自己的JDK，例如IBM公司开发的JDK，BEA公司的Jrocket，还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM（Java Virtual Machine）运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说，我们还是需要先把Sun JDK掌握好。</p>
<p><strong>1</strong>、 JDK的下载和安装<br />
JDK又叫做J2SE（Java2 SDK Standard Edition），可以从Sun的Java网站上下载到，<a href="http://java.sun.com/j2se/downloads.html">http://java.sun.com/j2se/downloads.html</a> ，下载页面在这里：<a href="http://java.sun.com/j2se/1.4.2/download.html">http://java.sun.com/j2se/1.4.2/download.html</a>。</p>
<p>下载好的JDK是一个可执行安装程序，默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE（供浏览器来使用），在C:\j2sdk1.4.2下安装一套JDK（也包括一套JRE）。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。</p>
<p><strong>2</strong>、 JDK的命令工具<br />
JDK的最重要命令行工具：<br />
java： 启动JVM执行class<br />
javac： Java编译器<br />
jar： Java打包工具<br />
javadoc： Java文档生成器<br />
这些命令行必须要非常非常熟悉，对于每个参数都要很精通才行。对于这些命令的学习，JDK Documentation上有详细的文档。</p>
<p><strong>二、 JDK Documentation</strong></p>
<p>Documentation在JDK的下载页面也有下载连接，建议同时下载Documentation。Documentation是最最重要的编程手册，涵盖了整个Java所有方面的内容的描述。可以这样说，学习Java编程，大部分时间都是花在看这个Documentation上面的。我是随身携带的，写Java代码的时候，随时查看，须臾不离手。</p>
<p><strong>三、 应用服务器(App Server)<br />
</strong><br />
App Server是运行Java企业组件的平台，构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss，选择其中一个进行学习就可以了，个人推荐Weblogic，因为它的体系结构更加干净，开发和部署更加方便，是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server：<br />
<strong>1</strong>、 Tomcat<br />
Tomcat严格意义上并不是一个真正的App Server，它只是一个可以支持运行Serlvet/JSP的Web容器，不过Tomcat也扩展了一些App Server的功能，如JNDI，数据库连接池，用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中，因此本文做一点下载、安装和配置Tomcat的介绍：</p>
<p>Tomcat是Apache组织下Jakarta项目下的一个子项目，它的主网站是：</p>
<p><a href="http://jakarta.apache.org/tomcat/">http://jakarta.apache.org/tomcat/</a></p>
<p>Tomcat软件下载的连接是：<a href="http://www.apache.org/dist/jakarta/tomcat-4/binaries/">http://www.apache.org/dist/jakarta/tomcat-4/binaries/</a> 。</p>
<p>下载Tomcat既可以直接下载zip包，也可以下载exe安装包（个人建议zip更干净些），不管哪种情况，下载完毕安装好以后（zip直接解压缩就可以了）。需要设置两个环境变量：</p>
<p>JAVA_HOME=C:\j2sdk1.4.2<br />
CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录)</p>
<p>这样就安装好了，启动Tomcat运行CATALINA_HOME\bin\startup.bat，关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后，默认使用8080端口，因此可以用浏览器访问<a href="http://localhost:8080/">http://localhost:8080</a>来测试Tomcat是否正常启动。</p>
<p>Tomcat提供了两个Web界面的管理工具，URL分别是：<br />
<a href="http://localhost:8080/admin/index.jsp">http://localhost:8080/admin/index.jsp</a><br />
<a href="http://localhost:8080/manager/html">http://localhost:8080/manager/html</a><br />
在启用这两个管理工具之前，先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件，加入如下几行：</p>
<p class="code">&lt;role rolename=&#8221;manager&#8221;/&gt;<br />
&lt;role rolename=&#8221;admin&#8221;/&gt;<br />
&lt;user username=&#8221;robbin&#8221; password=&#8221;12345678&#8243; roles=&#8221;admin,manager,tomcat&#8221;/&gt;</p>
<p>这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后，你就可以使用该用户来登陆如上的两个管理工具，通过Web方式进行Tomcat的配置和管理了。</p>
<p><strong> 2</strong>、 BEA Weblogic<br />
Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版，License可以免费使用1年时间，其实这已经完全足够了。Weblogic的下载连接：<a href="http://commerce.bea.com/index.jsp.../edocs.bea.com/">http://commerce.bea.com/index.jsp&#8230;/edocs.bea.com/</a> 。</p>
<p><strong>3</strong>、 IBM Webshpere<br />
Websphere同样可以下载到免费的试用版本，到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料，developerWorks中文网站的连接是：<a href="http://www-900.ibm.com/developerWorks/cn/wsdd/">http://www-900.ibm.com/developerWorks/cn/wsdd/</a> ，Websphere的下载连接：<a href="http://www7b.software.ibm.com/wsdd/...WASsupport.html">http://www7b.software.ibm.com/wsdd/&#8230;WASsupport.html</a> 。</p>
<p><strong>4</strong>、 Jboss<br />
Jboss是免费开源的App Server，可以免费的从Jboss网站下载：http://www.jboss.org/index.html，然&#8230;n.com/idea.html</p>
<p><strong>四、 Java应用的运行环境</strong></p>
<p>Java的应用可以简单分为以下几个方面：<br />
<strong>1</strong>、 Java的桌面应用<br />
桌面应用一般仅仅需要JRE的支持就足够了。</p>
<p><strong>2</strong>、 Java Web应用<br />
Java的Web应用至少需要安装JDK和一个web容器（例如Tomcat），以及一个多用户数据库，Web应用至少分为三层：<br />
Browser层：浏览器显示用户页面<br />
Web层：运行Servlet/JSP<br />
DB层：后端数据库，向Java程序提供数据访问服务</p>
<p><strong>3</strong>、 Java企业级应用<br />
企业级应用比较复杂，可以扩展到n层，最简单情况会分为4层：<br />
Browser层：浏览器显示用户页面<br />
Client层：Java客户端图形程序（或者嵌入式设备的程序）直接和Web层或者EJB层交互<br />
Web层：运行Servlet/JSP<br />
EJB层：运行EJB，完成业务逻辑运算<br />
DB层：后端数据库，向Java程序提供数据访问服务</p>
<p><strong>4</strong>、 Java嵌入式应用<br />
Java嵌入式应用是一个方兴未艾的领域，从事嵌入式开发，需要从Sun下载J2ME开发包，J2ME包含了嵌入式设备专用虚拟机KVM，和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。</p>
<p><strong>Java Learning Path（二）书籍篇</strong></p>
<p>学习一门新的知识，不可能指望只看一本，或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。</p>
<p>在这里我只想补充一点看法，很多人学习Java是从《Thinking in Java》这本书入手的，但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系，而是一种跳跃式的写作方法，是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。</p>
<p>对于初学者来说，最好是找一本Java入门的书籍，但是比较完整的循序的介绍Java的语法，面向对象的特性，核心类库等等，在看这本书的同时，可以同步来看《Thinking in Java》，来加深对Java的理解和原理的运用，同时又可以完整的了解Java的整个体系。</p>
<p>对于Java的入门书籍，蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition（针对C++背景）》，我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。</p>
<p>在所有的Java书籍当中，其实最最有用的，并不是O&#8217;reilly的 Java Serials，真正最最有用处是JDK的Documentation！几乎你想获得的所有的知识在Documentation里面全部都有，其中最主要的部分当然是Java基础类库的API文档，是按照package来组织的，对于每一个class都有详细的解释，它的继承关系，是否实现了某个接口，通常用在哪些场合，还可以查到它所有的public的属性和方法，每个属性的解释，意义，每个方法的用途，调用的参数，参数的意义，返回值的类型，以及方法可能抛出的异常等等。可以这样来说，所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言，和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗，如果你有足够的能力来直接通过Documentation来学习Java的类库，那么基本上就不需要看其他的书籍了。除此之外，Documentation也是编程必备的手册，我的桌面上有三个Documentation的快捷方式，分别是J2SDK1.4.1的Documentation，Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了Documentation，什么其他的书籍都不需要了。</p>
<p>对于Java Web 编程来说，最核心的是要熟悉和掌握HTTP协议，这个就和Java无关了，在熟悉HTTP协议之后，就需要熟悉Java的实现HTTP协议的类库，也就是Servlet API，所以最重要的东西就是Servlet API。当然对于初学者而言，直接通过Servlet API来学习Web编程有很大的难度，我推荐O&#8217;reilly的《Java Server Pages 》这本书来学习Web 编程。</p>
<p>EJB的书籍当中，《Enterprise JavaBeans, 2nd Edition》是一本很不错的书， EJB的学习门槛是比较高，入门很难，但是这本书完全降低了学习的难度，特别重要的一点是，EJB的学习需要结合一种App Server的具体实现，所以在学习EJB的同时，必须同步的学习某种App Server，而这本书相关的出了三本书，分别是Weblogic6.1，Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论，又有实践。在学习EJB的同时，可以边看边做，EJB的学习会变得很轻松。</p>
<p>但是这本书也有一个问题，就是版本比较旧，主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的，深入浅出，覆盖了EJB编程的各个方面，并且还有很多编程经验tips，也是学习EJB非常推荐的书籍之一。</p>
<p>如果是结合Weblogic来学习J2EE的话，《J2EE应用与BEA Weblogic Server》绝对是首选读物，虽然是讲述的Weblogic6.0，仍然值得购买，这本书是BEA官方推荐的教材，作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署，实践指导意义非常强。</p>
<p>在掌握了Java平台基础知识和J2EE方面的知识以后，更进一步的是学习如何运用OO的方法进行软件的设计，那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》，是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式，是设计师的必读书籍。</p>
<div><strong>Java Learning Path（三）过程篇</strong></div>
<p><strong> 每个人的学习方法是不同的，一个人的方法不见得适合另一个人，我只能是谈自己的学习方法。因为我学习Java是完全自学的，从来没有问过别人，所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法，只能给大家提供一点参考了。</strong></p>
<p><strong> </strong></p>
<p>学习Java的<span style="text-decoration: underline;">第一步</span>是安装好JDK，写一个Hello World， 其实JDK的学习没有那么简单，关于JDK有两个问题是很容易一直困扰Java程序员的地方：一个是CLASSPATH的问题，其实从原理上来说，是要搞清楚JRE的ClassLoader是如何加载Class的；另一个问题是package和import问题，如何来寻找类的路径问题。把这两个问题摸索清楚了，就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》，对这两个问题进行了深入的探讨。</p>
<p><span style="text-decoration: underline;">第二步</span>是学习Java的语法。Java的语法是类C++的，基本上主流的编程语言不是类C，就是类C++的，没有什么新东西，所以语法的学习，大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法，public，protected，private，static，什么时候用，为什么要用，怎么用，这可能需要有人来指点一下，我当初是完全自己琢磨出来的，花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。</p>
<p><span style="text-decoration: underline;">第三步</span>是学习Java的面向对象的编程语言的特性的地方。比如继承，构造器，抽象类，接口，方法的多态，重载，覆盖，Java的异常处理机制。对于一个没有面向对象语言背景的人来说，我觉得这个过程需要花很长很长时间，因为学习Java之前没有C++的经验，只有C的经验，我是大概花了一个月左右吧，才彻底把这些概念都搞清楚，把书上面的例子反复的揣摩，修改，尝试，把那几章内容反复的看过来，看过去，看了不下5遍，才彻底领悟了。不过我想如果有C++经验的话，应该一两天时间足够了。那么在这个过程中，可以多看看《Thinking in Java》这本书，对面向对象的讲解非常透彻。可惜的是我学习的时候，并没有看到这本书，所以自己花了大量的时间，通过自己的尝试和揣摩来学会的。</p>
<p><span style="text-decoration: underline;">第四步</span>就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个，我没有统计过。但是真正对于我们来说最核心的只有4个，分别是<br />
java.lang.*;<br />
java.io.*;<br />
java.util.*;<br />
java.sql.*;</p>
<p>这四个包的学习，每个包的学习都可以写成一本厚厚的教材，而O&#8217;reilly也确实是这样做的。我觉得如果时间比较紧，是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的：<br />
首先要通读整个package的框架，了解整个package的class，interface，exception的构成，最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。</p>
<p>对包整体框架的把握并不是要熟悉每个类的用法，记住它有哪些属性，方法。想记也记不住的。而是要知道包有哪些方面的类构成的，这些类的用途是什么，最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包，所以不可能详细的介绍每个类的用法，但是我反复强调，我给你们讲这些包的不是要告诉你们类的方法是怎么调用的，也不要求你们记住类的方法调用，而是要你们了解，Java给我们提供了哪些类，每个类是用在什么场合，当我遇到问题的时候，我知道哪个类，或者哪几个类的组合可以解决我的问题，That&#8217;all！，当我们具体写程序的时候，只要你知道该用哪个类来完成你的工作就足够了。编码的时候，具体的方法调用，是边写代码，边查Documentation，所有的东西都在Documentation里面，不要求你一定记住，实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。</p>
<p><span style="text-decoration: underline;">第五步</span>，通过上面的学习，如果学的比较扎实的话，就打好了Java的基础了，剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步，Java的自学能力已经被培养出来了，可以到了直接学习Documentation的水平了。除了要做GUI编程之外，JDK里面其他会有用处的包是这些：<br />
java.text.*;<br />
java.net.*;<br />
javax.naming.*;<br />
这些包里面真正用的比较多的类其实很少，只有几个，所以不需要花很多时间。</p>
<p><span style="text-decoration: underline;">第六步</span>，Java Web 编程<br />
Web编程的核心是HTTP协议，HTTP协议和Java无关，如果不熟悉HTTP协议的话，虽然也可以学好Servlet/JSP编程，但是达不到举一反三，一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话，又有了Java编程的良好的基础，学习Servlet/JSP简直易如反掌，我学习Servlet/JSP就用了不到一周的时间，然后就开始用JSP来做项目了。</p>
<p>在Servlet/JSP的学习中，重头仍然是Servlet Documentation。Servlet API最常用的类很少，花比较少的时间就可以掌握了。把这些类都看一遍，多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP，还需要熟悉几个常用JSP的标记，具体的写法记不住的话，临时查就是了。</p>
<p>此外Java Web编程学习的重点要放在Web Application的设计模式上，如何进行业务逻辑的分析，并且进行合理的设计，按照MVC设计模式的要求，运用Servlet和JSP分别完成不同的逻辑层，掌握如何在Servlet和JSP之间进行流程的控制和数据的共享，以及Web Application应该如何配置和部署。</p>
<p><span style="text-decoration: underline;">第七步</span>，J2EE编程<br />
以上的学习过程如果是比较顺利的话，进行到这一步，难度又陡然提高。因为上面的知识内容都是只涉及一个方面，而像EJB，JMS，JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶，所以掌握起来难度比较大。</p>
<p>首先一定要学习好JNDI，JNDI是App Server定位服务器资源（EJB组件，Datasouce，JMS）查找方法，如果对JNDI不熟悉的话，EJB，JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包，运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置，就需要看看专门的文档规范了，比如web.xml的写法，ejb-jar.xml的写法等等。针对每种不同的App Server，还有自己的服务资源配置文件，也是需要熟悉的。</p>
<p>然后可以学习JTA，主要是要理解JTA对于事务的控制的方法，以及该在什么场合使用JTA。这里可以简单的举个例子，我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),&#8230;.,conn.commit())，做为一个原子操作，但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作，你能做的到吗？这时候只能用JTA了。假设操作过程是先往A数据库插一条记录，然后删除B数据库另一个记录，我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话，由App Server来完成控制。</p>
<p>在学习EJB之前要学习对象序列化和RMI，RMI是EJB的基础。接着学习JMS和EJB，对于EJB来说，最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的，以及在什么情况下要用到EJB。</p>
<p>在学习完EJB，JMS这些东西之后，你可能会意识到要急不可待学习两个领域的知识，一个是UML，另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计，一个好的软件框架是软件开发成功的必要条件。在这个时候，应该开始把学习的重点放在设计模式和框架的学习上，通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。</p>
<p>J2EE规范里面，除了EJB，JMS，JTA，Servlet/JSP，JDBC之外还有很多很多的企业技术，这里不一一进行介绍了。</p>
<p>另外还有一个最新领域Web Services。Web Services也完全没有任何新东西，它像是一种黏合剂，可以把不同的服务统一起来提供一个统一的调用接口，作为使用者来说，我只要获得服务提供者给我的WSDL（对服务的描述），就够了，我完全不知道服务器提供者提供的服务究竟是EJB组件，还是.Net组件，还是什么CORBA组件，还是其他的什么实现，我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式，实现了整个Internet服务的共享，是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍，但是可以通过在网络上面查资料的方式来学习。</p>
<p><strong>Java Learning Path（四） 方法篇</strong></p>
<p>Java作为一门编程语言，最好的学习方法就是写代码。当你学习一个类以后，你就可以自己写个简单的例子程序来运行一下，看看有什么结果，然后再多调用几个类的方法，看看运行结果，这样非常直观的把类给学会了，而且记忆非常深刻。然后不应该满足把代码调通，你应该想想看如果我不这样写，换个方式，再试试行不行。记得哪个高人说过学习编程就是个破坏的过程，把书上的例子，自己学习Documentation编写的例子在运行通过以后，不断的尝试着用不同的方法实现，不断的尝试破坏代码的结构，看看它会有什么结果。通过这样的方式，你会很彻底的很精通的掌握Java。</p>
<p>举个例子，我们都编过Hello World
</p>
<p class="code">public class HelloWorld {<br />
public static void main(String[] args) {<br />
System.out.println(&#8220;Hello World&#8221;);<br />
}<br />
}</p>
<p>很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args)，能不能不这样写？包括我刚学习Java的时候也有这样的疑问。想知道答案吗？很简单，你把main改个名字运行一下，看看报什么错误，然后根据出错信息进行分析；把main的public取掉，在试试看，报什么错误；static去掉还能不能运行；不知道main方法是否一定要传一个String[]数组的，把String[]改掉，改成int[]，或者String试试看；不知道是否必须写args参数名称的，也可以把args改成别的名字，看看运行结果如何。</p>
<p>我当初学习Java的时候就是这样做的，把Hello World程序反复改了七八次，不断运行，分析运行结果，最后就彻底明白为什么了main方法是这样定义的了。</p>
<p>此外，我对于staic，public，private，Exception，try{ }catch {}finally{}等等等等一开始都不是很懂，都是把参考书上面的例子运行成功，然后就开始破坏它，不断的根据自己心里面的疑问来重新改写程序，看看能不能运行，运行出来是个什么样子，是否可以得到预期的结果。这样虽然比较费时间，不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行，看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。<br />
其中特别值得一提的是JDK有一个非常棒的调试功能，-verbose，javac –verbose 以及其它很多JDK工具都有这个选项，-verbose 可以显示在命令执行的过程中，JVM都依次加载哪里Class，通过这些宝贵的调试信息，可以帮助我们分析出JVM在执行的过程中都干了些什么。</p>
<p>另外，自己在学习过程中，写的很多的这种破坏例程，应该有意识的分门别类的保存下来，在工作中积累的典型例程也应该定期整理，日积月累，自己就有了一个代码库了。遇到类似的问题，到代码库里面 Copy &amp; Paste ，Search &amp; Replace，就好了，极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层，形成一个通用的类库，封装好。那么可复用性就更强了。</p>
<p>所以我觉得其实不是特别需要例程的，自己写的破坏例程就是最好的例子，如果你实在对自己写的代码不放心的话，我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip，解开来就可以完整的看到整个JDK基础类库，也就是rt.jar的Java源代码，你可以参考一下Sun是怎么写Java程序的，规范是什么样子的。我自己在学习Java的类库的时候，当有些地方理解的不是很清楚的时候，或者想更加清晰的理解运作的细节的时候，往往会打开相应的类的源代码，通过看源代码，所有的问题都会一扫而空。</p>
<p><strong>Java Learning Path（五）资源篇</strong></p>
<p><a href="http://java.sun.com/">http://java.sun.com/</a> (英文)<br />
Sun的Java网站，是一个应该经常去看的地方。不用多说。</p>
<p><a href="http://www-900.ibm.com/developerWorks/cn/">http://www-900.ibm.com/developerWorks/cn/</a><br />
IBM的developerWorks网站，英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站，也是Web Services，Java，Linux极好的网站。强烈推荐！！！</p>
<p><a href="http://www.javaworld.com/">http://www.javaworld.com/</a> (英文)<br />
关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用，这里比较好。</p>
<p><a href="http://dev2dev.bea.com.cn/index.jsp">http://dev2dev.bea.com.cn/index.jsp</a><br />
BEA的开发者园地，BEA作为最重要的App Server厂商，有很多独到的技术，在Weblogic上做开发的朋友不容错过。</p>
<p><a href="http://www.theserverside.com/home/">http://www.theserverside.com/home/</a> (英文)<br />
TheServerSide是一个著名的专门面向Java Server端应用的网站。</p>
<p><a href="http://www.cnjsp.org/">http://www.cnjsp.org/</a><br />
JSP技术网站，有相当多的Java方面的文章和资源。</p>
<p><a href="http://sourceforge.net/">http://sourceforge.net/</a><br />
SourgeForge是一个开放源代码软件的大本营，其中也有非常非常丰富的Java的开放源代码的著名的软件。</p>
<p><strong>附：java入门与加深FAQ</strong></p>
<p><strong>一、准备篇</strong></p>
<p><strong>1</strong> 什么是Java、Java2、JDK？JDK后面的1.3、1.4.2版本号又是怎么回事？<br />
答：Java是一种通用的，并发的，强类型的，面向对象的编程语言（摘自Java规范第二版) JDK是Sun公司分发的免费Java开发工具，正式名称为J2SDK(Java2 Software Develop Kit)。<br />
<strong>2</strong> 什么是JRE/J2RE？<br />
答：J2RE是Java2 Runtime Environment，即Java运行环境，有时简称JRE。如果你只需要运行Java程序或Applet，下载并安装它即可。如果你要自行开发Java软件，请下载JDK。在JDK中附带有J2RE。<br />
注意:由于Microsoft对Java的支持不完全，请不要使用IE自带的虚拟机来运行Applet，务必安装一个J2RE或JDK。</p>
<p><strong>3</strong> 学习Java用什么工具比较好？<br />
答：作者建议首先使用JDK+文本编辑器，这有助你理解下列几个基础概念：path，classpath，package并熟悉基本命令：javac和java。并且下载和你的JDK版本一致的API帮助。</p>
<p>如果你不确定类或函数的用法，请先查阅API而不是发贴求助。当你熟悉Java之后，你可以考虑换一个IDE。很多人推荐JCreator，实际上JCreator的功能还 是很弱的。作者推荐eclipse，下载网<a href="http://www.eclipse.org/">http://www.eclipse.org</a>因eclispe是免费的.</p>
<p><strong>4</strong> 学习Java有哪些好的参考书？<br />
答：作者首先推荐Thinking in Java，中文名《Java编程思想》，有中文版。该书第一章介绍了很多面向对象的编程思想，作为新手应当认真阅读。除此以外，O´relly出版社和Wrox出版社的书也不错。作者本人不喜欢大陆作者的书。也许你觉得英文太难，但是网上大多数资料都是英文的。另外，你需要经常查阅API，而那也是英文的。</p>
<p><strong>5</strong> Java和C++哪个更好？<br />
答：这个问题是一个很不恰当的问题。你应该问：Java和C++哪个更适用于我的项目？如果你不需要跨平台，不需要分布式，要强调程序的运行速度，C++更为适用。反之?你应当考虑Java。</p>
<p><strong>6</strong> 什么是J2SE/J2EE/J2ME？<br />
答：J2SE就是一般的Java。<br />
J2ME是针对嵌入式设备的，比如Java手机，它有自己的SDK。而J2EE使用J2SE的SDK。<br />
J2EE规范更多的是对J2EE服务器的要求和开发人员的约束。详情见后继&#8221;J2EE FAQ&#8221;。</p>
<p><strong>二、命令篇</strong></p>
<p><strong>7</strong> 我写了第一个Java程序，应该如何编译/运行？<br />
答：首先请将程序保存为xxx.java文件，然后在dos窗口下使用javac xxx.java命令，你会发现该目录下多了一个xxx.class文件，再使用java xxx命令，你的java程序就开始运行了。</p>
<p><strong>8</strong> 我照你说的做了，但是出现什么&#8221;´javac´ 不是内部或外部命令，也不是可运行的程序或批处理文件。&#8221;。<br />
答：你遇到了path问题。操作系统在一定的范围(path)内搜索javac.exe，但是没能找到。请编辑你的操作系统环境变量，新增一个JAVA_HOME变量，设为你JDK的安装目录，再编辑Path变量，加上一项 %JAVA_HOME%\bin。然后关掉并新开一个dos窗口，你就可以使用javac和java命令了。</p>
<p><strong>9</strong> 环境变量怎么设置？<br />
答：请向身边会设的人咨询。</p>
<p><strong>10</strong> javac xxx.java顺利通过了，但是java xxx的时候显示什么“NoClassDefFoundError”。<br />
答：你遇到了classpath问题。java命令在一定的范围(classpath)内搜索你要用的class文件，但是未能找到。首先请确认你没有错敲成java xxx.class，其实你并不需要设置该变量，但如果你设置了该变量又没有包含.（代表当前目录）的项，你就会遇到这个问题。请在你的CLASSPATH环境变量中加入一项. 或干脆删掉这个变量。如果你使用了并非JDK自带的标准包，比如javax.servlet.*包，也会遇到这个问题，请将相应的jar文件加入classpath。如果你在java源文件中定义了package，请参见15。</p>
<p><strong>11</strong> 我在java xxx的时候显示&#8221;Exception in thread &#8220;main&#8221; java.lang.NoSuchMethodError: main&#8221;。<br />
答：首先，在你的程序中每个java文件有且只能有一个public类，这个类的类名必须和文件名的大小写完全一样。其次，在你要运行的类中有且只能有一个public static void main(String[] args)方法，这个方法就是你的主程序。</p>
<p><strong>12</strong> package是什么意思？怎么用？<br />
答：为了唯一标识每个类并分组，java使用了package的概念。每个类都有一个全名，例如String的全名是java.lang.String，其中java.lang是包名，String是短名。这样，如果你也定义了String，你可以把它放在mypackage中，通过使用全名mypackage.String和java.lang.String来区分这两个类。同时，将逻辑上相关的类放在同一个包中，可以使程序结构更为清楚。</p>
<p>你要做的就是在java文件开头加一行&#8221;package mypackage;&#8221;。注意包没有嵌套或包含关系，A包和A.B包对java命令来说是并列的两个包。<br />
<strong>13</strong> 我没有声明任何package会怎么样？<br />
答：你的类被认为放在默认包中。这时全名和短名是一致的。</p>
<p><strong>14</strong> 在一个类中怎么使用其他类？<br />
答：如果你使用java.lang包中的类，不用做任何事。如果你使用其他包中的类，使用import package1.class1; 或 import package2.*;这里.*表示引入这个包中的所有类。然后在程序中你可以使用其他类的短名。如果短名有冲突，使用全名来区分。</p>
<p><strong>15</strong> 我用了package的时候显示&#8221;NoClassDefFoundError&#8221;，但是我把所有package去掉的时候能正常运行。<br />
答：将你的java文件按包名存放。<br />
比如你的工作目录是/work，你的类是package1.class1，那么将它存放为/work/package1/class1.java。如果没有声明包，那么直接放在/work下。在/work下执行javac package1/class1.java，再执行java package1.class1，你会发现一切正常。另外，你可以考虑开始使用IDE。</p>
<p><strong>16</strong> 我想把java编译成exe文件，该怎么做？<br />
答：JDK只能将java源文件编译为class文件。class文件是一种跨平台的字节码，必须依赖平台相关的JRE来运行。Java以此来实现跨平台，有些开发工具可以将java文件编译为exe文件。作者反对这种做法，因为这样就取消了跨平台性。如果你确信你的软件只在Windows平台上运行，你可以考虑使用C++/C#来编程。</p>
<p><strong>17</strong> 我在编译的时候遇到什么&#8221;deprecated API&#8221;，是什么意思？<br />
答：所谓deprecated是指已经?时，但是为了向前兼容起见仍然保留的方法，这些方法可能会在以后取消支持。你应当改用较新的方法。一般在API里面会说明你应当用什么方法来代替之。</p>
<p><strong>三、I/O篇</strong></p>
<p><strong>18</strong> 我怎么给java程序加启动参数，就像dir /p/w那样？<br />
答：还记得public static void main(String[] args)吗？这里的args就是你的启动参数。<br />
在运行时你输入java package1.class1 -arg1 -arg2，args中就会有两个String，一个是arg1，另一个是arg2。</p>
<p><strong>19</strong> 我怎么从键盘输入一个int/double/字符串？<br />
答：java的I/O操作比C++要复杂一点。如果要从键盘输入，样例代码如下：
</p>
<p class="code">BufferedReader cin = new BufferedReader( new InputStreamReader( System.in ) )<br />
;<br />
String s = cin.readLine();</p>
<p>这样你就获得了一个字符串，如果你需要数字的话再加上：
</p>
<p class="code">int n = Integer.parseInt( s );</p>
<p>或者</p>
<p class="code">double d = Double.parseDouble( s );</p>
<p><strong>20</strong> 我怎么输出一个int/double/字符串？<br />
答：在程序开始写：</p>
<p class="code">PrintWriter cout = new PrintWriter( System.out );</p>
<p>需要时写：</p>
<p class="code">cout.print(n);</p>
<p>或者</p>
<p class="code">cout.println(&#8220;hello&#8221;)</p>
<p>等等。</p>
<p><strong>21</strong> 我发现有些书上直接用System.in和System.out输入输出，比你要简单得多。<br />
答：java使用unicode，是双字节。而System.in和System.out是单字节的stream。如果你要输入输出双字节文字比如中文，请使用作者的做法。<br />
<strong>22</strong> 我怎么从文件输入一个int/double/字符串？<br />
答：类似于从键盘输入，只不过换成</p>
<p class="code">BufferedReader fin = new BufferedReader( new FileReader(&#8221; myFileName &#8221; ) );<br />
PrintWriter fout = new PrintWriter( new FileWriter(&#8221; myFileName &#8221; ) );</p>
<p>另外如果你还没下载API，请开始下载并阅读java.io包中的内容。</p>
<p><strong>23</strong> 我想读写文件的指定位置，该怎么办？<br />
答：你肯定没有认真看API。java.io.RandomAccessFile可以满足你的需要。</p>
<p><strong>24</strong> 怎么判断要读的文件已经到了尽头？<br />
答：你肯定没有认真看API。在Reaer的read方法中明确说明返回-1表示流的结尾。</p>
<p><strong>四、 关键字篇</strong></p>
<p><strong>25</strong> java里面怎么定义宏？<br />
答：java不支持宏，因为宏代换不能保证类型安全。如果你需要定义常量，可以将它定义为某个类的static final成员。参见26和30。</p>
<p><strong>26</strong> java里面没法用const。<br />
答：你可以用final关键字。例如 final int m = 9。被声明为final的变量不能被再次赋值。也可以用于声明方法或类，被声明为final的方法或类不能被继承。注意const是java的保留字以备扩充。</p>
<p><strong>27</strong> java里面也不能用goto。<br />
答：甚至在面向过程的语言中你也可以完全不用goto。请检查你的程序流程是否合理。如果你需要从多层循环中迅速跳出，java增强了（和C++相比）break和continue的功能。<br />
例如：
</p>
<p class="code">outer :<br />
while( &#8230; )<br />
{<br />
inner :<br />
for( &#8230; )<br />
{<br />
&#8230; break inner; &#8230;<br />
&#8230; continue outer; &#8230;<br />
}<br />
}</p>
<p>和const一样，goto也是java的保留字以备扩充。</p>
<p><strong>28</strong> java里面能不能重载操作符？<br />
答：不能。String的+号是唯一一个内置的重载操作符。你可以通过定义接口和方法来实现类似功能。</p>
<p><strong>29</strong> 我new了一个对象，但是没法delete掉它。<br />
答：java有自动内存回收机制，即所谓Garbarge Collector。你再也不用担心指针错误。</p>
<p><strong>30</strong> 我想知道为什么main方法必须被声明为public static？<br />
答：声明为public是为了这个方法可以被外部调用，详情见面向对象篇37。<br />
static是为了将某个成员变量/方法关联到类（class）而非实例（instance）。你不需要创建一个对象就可以直接使用这个类的static成员，在A类中调用B类的static成员可以使用B.staticMember的写法。注意一个类的static成员变量是唯一的，被所有该类对象所共享的。</p>
<p><strong>31</strong> throw和throws有什么不同？<br />
答：throws用于声明一个方法会抛出哪些异常。而throw是在方法体中实际执行抛出异常的动作。如果你在方法中throw一个异常，却没有在方法声明中声明之，编译器会报错。注意Error和RuntimeException的子类是例外，无需特别声明。</p>
<p><strong>32</strong> 什么是异常？<br />
答：异常最早在Ada语言中引入，用于在程序中动态处理错误并恢复。你可以在方法中拦截底层异常并处理之，也可以抛给更高层的模块去处理。你也可以抛出自己的异常指示发生了某些不正常情况。常见的拦截处理代码如下：
</p>
<p class="code">try<br />
{<br />
&#8230;&#8230; //以下是可能发生异常的代码<br />
&#8230;&#8230; //异常被抛出，执行流程中断并转向拦截代码。<br />
&#8230;&#8230;<br />
}</p>
<p>catch(Exception1 e) //如果Exception1是Exception2的子类并要做特别处理，应排在前面<br />
{<br />
//发生Exception1时被该段拦截<br />
}<br />
catch(Exception2 e)<br />
{<br />
//发生Exception2时被该段拦截<br />
}<br />
finally //这是可选的<br />
{<br />
//无论异常是否发生，均执行此段代码<br />
}
</p>
<p class="code"><strong>33</strong> final和finally有什么不同？<br />
答：final请见26。finally用于异常机制，参见32。</p>
<p><strong>五、 面向对象篇</strong></p>
<p><strong>34</strong> extends和implements有什么不同？<br />
答：extends用于（单）继承一个类（class），而implements用于实现一个接口（interface）。interface的引入是为了部分地提供多继承的功能。<br />
在interface中只需声明方法头，而将方法体留给实现的class来做。这些实现的class的实例完全可以当作interface的实例来对待。有趣的是在interface之间也可以声明为extends（单继承）的关系。</p>
<p><strong>35</strong> java怎么实现多继承？<br />
答：java不支持显式的多继承。因为在显式多继承的语言例如c++中，会出现子类被迫声明祖先虚基类构造函数的问题，而这是违反面向对象的封装性原则的。java提供了interface和implements关键字来部分地实现多继承。参见34。</p>
<p><strong>36</strong> abstract是什么？<br />
答：被声明为abstract的方法无需给出方法体，留给子类来实现。而如果一个类中有abstract方法，那么这个类也必须声明为abstract。被声明为abstract的类无法实例化，尽管它可以定义构造方法供子类使用。</p>
<p><strong>37</strong> public,protected,private有什么不同？<br />
答：这些关键字用于声明类和成员的可见性。<br />
public成员可以被任何类访问，<br />
protected成员限于自己和子类访问，<br />
private成员限于自己访问。<br />
Java还提供了第四种的默认可见性，一般称为package private，当没有任何public,protected,private修饰符时，成员是同一包内可见。类可以用public或默认来修饰。</p>
<p><strong>38</strong> Override和Overload有什么不同？<br />
答：Override是指父类和子类之间方法的继承关系，这些方法有着相同的名称和参数类型。Overload是指同一个类中不同方法（可以在子类也可以在父类中定义）间的关系，这些方法有着相同的名称和不同的参数类型。</p>
<p><strong>39</strong> 我继承了一个方法，但现在我想调用在父类中定义的方法。<br />
答：用super.xxx()可以在子类中调用父类方法。</p>
<p><strong>40</strong> 我想在子类的构造方法中调用父类的构造方法，该怎么办？<br />
答：在子类构造方法的第一行调用super(&#8230;)即可。</p>
<p><strong>41</strong> 我在同一个类中定义了好几个构造方法并且想在一个构造方法中调用另一个。<br />
答：在构造方法第一行调用this(&#8230;)。</p>
<p><strong>42</strong> 我没有定义构造方法会怎么样？<br />
答：自动获得一个无参数的构造方法。</p>
<p><strong>43</strong> 我调用无参数的构造方法失败了。<br />
答：如果你至少定义了一个构造方法，就不再有自动提供的无参数的构造方法了。你需要显式定义一个无参数的构造方法。</p>
<p><strong>44</strong> 我该怎么定义类似于C++中的析构方法（destructor）？<br />
答：提供一个void finalize()方法。在Garbarge Collector回收该对象时会调用该方法。注意实际上你很难判断一个对象会在什么时候被回收。作者从未感到需要提供该方法。</p>
<p><strong>45</strong> 我想将一个父类对象转换成一个子类对象该怎么做？<br />
答：强制类型转换。如
</p>
<p class="code">public void meth(A a)<br />
{<br />
B b = (B)a;<br />
}
</p>
<p class="code">如果a实际上并不是B的实例，会抛出ClassCastException。所以请确保a确实是B的实例。</p>
<p><strong>46</strong> 其实我不确定a是不是B的实例，能不能分情况处理？<br />
答：可以使用instanceof操作符。例如</p>
<p class="code">if( a instanceof B )<br />
{<br />
B b = (B)a;<br />
}<br />
else<br />
{<br />
&#8230;<br />
}</p>
<p class="code"><strong>47</strong> 我在方法里修改了一个对象的值，但是退出方法后我发现这个对象的值没变！<br />
答：很可能你把传入参数重赋了一个新对象，例如下列代码就会造成这种错误：</p>
<p class="code">public void fun1(A a) //a是局部参数，指向了一个外在对象。<br />
{<br />
a = new A(); //a指向了一个新对象，和外在对象脱钩了。如果你要让a作为传出变量，不要写这一句。<br />
a.setAttr(attr);//修改了新对象的值，外在对象没有被修改。<br />
}
</p>
<p class="code">基本类型也会出现这种情况。例如：</p>
<p class="code">public void fun2(int a)<br />
{<br />
a = 10;//只作用于本方法，外面的变量不会变化。<br />
}
</p>
<p class="code"><strong>六、java.util篇</strong></p>
<p><strong>48</strong> java能动态分配数组吗？<br />
答：可以。例如int n = 3; Language[] myLanguages = new Language[n];</p>
<p><strong>49</strong> 我怎么知道数组的长度？<br />
答：用length属性。如上例中的 myLanguages.length 就为 3。</p>
<p><strong>50</strong> 我还想让数组的长度能自动改变，能够增加/删除元素。<br />
答：用顺序表&#8211;java.util.List接口。你可以选择用ArrayList或是LinkedList，前者是数组实现，后者是链表实现。例如：</p>
<p class="code">List list = new ArrayList();</p>
<p class="code">或是</p>
<p class="code">List list = new LinkedList();</p>
<p class="code"><strong>51</strong> 什么是链表？为什么要有两种实现？<br />
答：请补习数据结构。</p>
<p><strong>52</strong> 我想用队列/栈。<br />
答：用java.util.LinkedList。</p>
<p><strong>53</strong> 我希望不要有重复的元素。<br />
答：用集合&#8211;java.util.Set接口。例如：Set set = new HashSet()。</p>
<p><strong>54</strong> 我想遍历集合/Map。<br />
答：用java.util.Iterator。参见API。</p>
<p><strong>55</strong> 我还要能够排序。<br />
答：用java.util.TreeSet。例如：Set set = new TreeSet()。放进去的元素会自动排序。你需要为元素实现Comparable接口，还可能需要提供equals()方法，compareTo()方法，hashCode()方法。</p>
<p><strong>56</strong> 但是我想给数组排序。<br />
答：java.util.Arrays类包含了sort等实用方法。</p>
<p><strong>57</strong> 我想按不同方法排序。<br />
答：为每种方法定义一个实现了接口Comparator的类并和Arrays综合运用。</p>
<p><strong>58</strong> Map有什么用？<br />
答：存储key-value的关键字-值对，你可以通过关键字来快速存取相应的值。</p>
<p><strong>59</strong> set方法没问题，但是get方法返回的是Object。<br />
答：强制类型转换成你需要的类型。参见45。</p>
<p><strong>60</strong> 我要获得一个随机数。<br />
答：使用java.util.Random类。</p>
<p><strong>61</strong> 我比较两个String总是false，但是它们明明都是&#8221;abc&#8221; ！<br />
答：比较String一定要使用equals或equalsIgnoreCase方法，不要使用 == ！<br />
==比较的是两个引用（变量）是否指向了同一个对象，而不是比较其内容。</p>
<p><strong>62</strong> 我想修改一个String但是在String类中没找到编辑方法。<br />
答：使用StringBuffer类。
</p>
<p class="code">String str = &#8220;&#8230;&#8230;.&#8221;; //待处理的字符串<br />
StringBuffer buffer = new StringBuffer(str); //使用该字符串初始化一个<br />
StringBuf<br />
fer<br />
buffer.append(&#8220;&#8230;&#8221;); //调用StringBuffer的相关API来编辑字符串<br />
String str2 = buffer.toString(); //获得编辑后的字符串
</p>
<p class="code">另外，如果你需要将多个字符串连接起来，请尽量避免使用+号直接连接，而是使用StringBuffer.append()方法。</p>
<p><strong>63</strong> 我想处理日期/时间。<br />
答：使用java.util.Date类。你可以使用java.text.SimpleDateFormat类来在String和Date间互相转换。</p>
<p class="code">SimpleDateFormat formatter = new SimpleDateFormat(&#8220;yyyy-MM-dd HH:mm:ss&#8221;); //规定日期格式<br />
Date date = formatter.parse(&#8220;2003-07-26 18:30:35&#8243;); //将符合格式的String转换为Date<br />
String s = formatter.format(date); //将Date转换为符合格式的String
</p>
<p class="code">关于定义日期格式的详细信息请参见API。</p>
]]></content:encoded>
			<wfw:commentRss>http://yutao.net/native/java-to-learn-from-entry-to-the-master.shtml/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>择录：jsp入门学习教程</title>
		<link>http://yutao.net/native/getting-started-tutorial-jsp-learning.shtml</link>
		<comments>http://yutao.net/native/getting-started-tutorial-jsp-learning.shtml#comments</comments>
		<pubDate>Mon, 23 Feb 2009 23:54:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[兔生兔长]]></category>
		<category><![CDATA[JAVA]]></category>

		<guid isPermaLink="false">http://yutaoblog.cn/?p=48</guid>
		<description><![CDATA[<p><strong>一、 什么是JSP</strong></p>
<p>JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种 动态网页技术标准，其网址为http://www.javasoft.com/products/jsp。 在传统的网页HTML文件(*htm,*.html)中加入Jav[......]</p><p class='read-more'><a href='http://yutao.net/native/getting-started-tutorial-jsp-learning.shtml'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>一、 什么是JSP</strong></p>
<p>JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种 动态网页技术标准，其网址为http://www.javasoft.com/products/jsp。 在传统的网页HTML文件(*htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag)，就构成了JSP网页(*.jsp)。Web服务器在遇到访问JSP网页的请求时，首先执行其中的程序片段，然后将执行结果以HTML格式返回给客户。程序片段可以操作数据库、重新定向网页以及发送 email 等等，这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行，网络上传送给客户端的仅是得到的结果，对客户浏览器的要求最低，可以实现无Plugin，无ActiveX，无Java Applet，甚至无Frame。 本文将介绍利用JSP技术开发动态网页的方法，还将简要分析JSP技术和 Microsoft 公司的 ASP 技术的不同之处。</p>
<p><strong>二、 如何安装和启动</strong></p>
<p>为了实验JSP技术，首先需要建立运行环境，这个过程相当简单：</p>
<p>1、在 http://java.sun.com/jdk/处下载JDK(Java 2 SDK、Standard Edition、v 1.2.2)。</p>
<p>2、在http://java.sun.com/products/jsp/处下载JSWDK(JavaServer Web Development Kit 1.0.1)。Linux用户可以在ttp://jakarta.apache.org/处下载Tomcat 3.0。</p>
<p>3、安装 以Windows NT环境为例，JDK的安装是首先运行下载得到的jdk1_2_2-win.exe，然后修改系统环境参数，在PATH参数中加入[x:]\jdk1.2.2\bin以及增加新的环境参数 CLASSPATH=[x:]\jdk1.2.2\lib\tools.jar，其中[x:]是安装JDK的硬盘符（c:、d: 等）。 JSWDK的安装仅需将jswdk1_0_1-win.zip带目录释放到硬盘根目录下（c:\、d:\ 等），然后就可以在硬盘上找到\jswdk-1.0.1\目录。将来如果不想保留JSWDK，删除这个目录就可以了，没有任何系统文件和注册表遗留问题。更详细的安装过程以及Solaris/Unix和Linux下JDK、Tomcat的安装可以参考下载得到的文件包中的安装说明。</p>
<p>4、启动 以Windows NT环境为例，在\jswdk-1.0.1\目录下执行startserver.bat，就可启动JSWDK中一个支持JSP网页技术的Web服务器。为了不与现有的Web服务器（例如IIS、PWS等）冲突，JSWDK的Web服务器使用了8080端口。 在浏览器的地址栏中键入http://localhost:8080或者http://127.0.0.1:8080后，如果能看到 JSWDK 的欢迎页就说明JSP实验环境已经建成，可进入下一步实验。 要关闭Web服务器则运行stopserver.bat。</p>
<p><strong>三、 JSP简单示例</strong></p>
<p>JSWDK中包含的Web服务器的文档目录在缺省状态下为\jswdk-1.0.1\webpages，主文档在缺省状态下为index.html和index.jsp。也就是说访问http://localhost:8080等于访问\jswdk-1.0.1\webpages\index.html。 用文本编辑器，如Windows中的记事本(Notepad)，创建一个文本文件hi.jsp，保存在\jswdk-1.0.1\webpages\目录下，其内容如下：</p>
<p><code>＜html＞<br />
＜head＞<br />
＜title＞Hi-JSP实验＜/title＞<br />
＜/head＞<br />
＜body＞<br />
＜%<br />
String Msg = "This JSP test.";<br />
out.print("Hello World!");<br />
%＞<br />
＜h2＞＜%=Msg%＞＜/h2＞<br />
＜/body＞<br />
＜/html＞ </code></p>
<p>在浏览器的地址栏中键入http://localhost:8080/hi.jsp，JSWDK中的Web服务器会执行JSP 文件中用＜%以及%＞括起来的Java程序语句，其中out.print是将文字输出到网页，语句＜%= 变量 | 表达式 %＞的作用是将Java Scriptlet中变量或表达式的值输出到网页，执行结果如图1。 图1 将变量Msg赋值为中文字符串，用＜%= %＞输出，或者用out.print输出中文字符串，则在英文版NT4及Redhat 6.1下实验运行结果正常，而在中文NT 4.0和中文98下，则反而会出现乱码。</p>
<p><strong>四、 统一的网站界面</strong></p>
<p>JSP支持服务器端的文件包含，即可以在一个JSP文件中插入多个其他文件，用来实现统一的网站界面。修改上述hi.jsp并另存为mypage.jsp：</p>
<p><code>＜%@ include file="top.htm" %＞<br />
＜%<br />
String Msg = "This JSP test.";<br />
out.print("Hello World!");<br />
%＞<br />
＜h2＞＜%=Msg%＞＜/h2＞<br />
＜%@ include file="bot.htm" %＞ </code></p>
<p>用可视化HTML编辑器，例如FrontPage、Dreamweave等设计网站的框架结构，将设计好的框架结构文件分割成两个部分，上面一半保存为top.htm, 下面一半保存为bot.htm，代码如下面所示：</p>
<p><code>＜html＞<br />
＜head＞<br />
＜meta http-equiv="Content-Type" content="text/html; charset=gb2312"＞<br />
＜title＞我的主页＜/title＞<br />
＜/head＞<br />
＜body＞<br />
＜table border="0" width="100%" cellpadding="4" cellspacing="0" align="center"＞<br />
＜tr＞<br />
＜td width="100%" colspan="2" bgcolor="#837ED1" align="center"＞＜font face="隶书"<br />
color="#FFFF00" size=5＞主页标题＜/font＞<br />
＜/td＞<br />
＜/tr＞<br />
＜tr＞<br />
＜td bgcolor="#837ED1" width="15%" valign="top" align="center"＞＜br＞<br />
＜font color="#FFFFFF"＞选项＜/font＞＜p＞＜font color="#FFFFFF"＞选项＜/font＞＜/p＞<br />
＜p＞＜font color="#FFFFFF"＞选项＜/font＞＜/p＞<br />
＜p＞＜font color="#FFFFFF"＞......＜/font＞＜/p＞<br />
＜p＞＜/p＞<br />
＜/td＞<br />
＜td width="85%" valign="top"＞<br />
----------------------------------------------------------------------------------------------------------------<br />
＜/td＞<br />
＜/tr＞<br />
＜/table＞<br />
＜/body＞<br />
＜/html＞ </code></p>
<p>在浏览器的地址栏中键入http://localhost:8080/mypage.jsp，得到结果如图2。 图2 这样网站的界面就能统一起来，而设计者可以集中精力在功能模块上处理用户登录、连接数据库、发送email等等。每个</p>
<p>JSP文件都有如下结构：</p>
<p><code>＜%@ include file="top.htm" %＞<br />
＜%<br />
// 实现某些功能<br />
%＞<br />
＜%@ include file="bot.htm" %＞ </code><br />
维护网站的界面也相对比较容易，只要修改top.htm和bot.htm，就能影响到所有网页。</p>
<p><strong>五、 服务器参数设置</strong></p>
<p>JSWDK的Web服务器参数保存在\jswdk-1.0.1\webserver.xml中，用Windows写字板打开并编辑这个文件就可以修改缺省设置值。本节内容主要针对JSWDK，Linux下Tomcat的设置方法略有不同。 JSWDK缺省的文档目录是\jswdk-1.0.1\webpages，在此目录下可以建立子目录，例如\jswdk-1.0.1\webpages\test，就能在浏览器中用http://localhost/test访问这个目录，为了使得这个子目录能执行JSP程序，还必须在webserver.xml中的＜Service＞＜/Service＞节加入：<br />
＜WebApplication id=&#8221;test&#8221; mapping=&#8221;/test&#8221; docBase=&#8221;webpages/test&#8221; /＞<br />
并且，还必须建立\jswdk-1.0.1\webpages\test\WEB-INF目录，并从\jswdk-1.0.1\webpages\WEB-INF目录中复制过来以下四个文件：mappings.properties、mime.properties、servlets.properties以及webapp.properties。完成这些过程，才能通知JSWDK的Web服务器执行http://localhost/test 中的JSP程序。</p>
<p><strong>六、 JavaBean</strong></p>
<p>JSP网页吸引人的地方之一就是能结合JavaBean技术来扩充网页中程序的功能。 JavaBean是一种Java类 (class)，通过封装属性和方法成为具有某种功能或者处理某个业务的对象。JavaBean被组织成为package（数据包）以便进行管理，实际上就是把一组JavaBean一起放在某某目录中，每个类的定义前加上package某某，本例中为test。目录test必须放在系统环境CLASSPATH包含的目录下，系统才能找到其中的JavaBean。JSWDK在缺省状态下将\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\ 加入CLASSPATH。建立自己的JavaBean和package时，就放在这个目录中也不失为一种简易的方法。 下面介绍一个简单的JavaBean框架。用文本编辑器创建一个文本文件helloWorld.java，并保存在\jswd</p>
<p>k-1.0.1\webpages\WEB-INF\jsp\beans\test目录下，其内容如下：</p>
<p><code>package test;<br />
public class helloWorld {<br />
public String name = "My first bean";<br />
public String getHi()<br />
{<br />
return "Hello from " + name;<br />
}<br />
} </code><br />
helloWorld.java编辑好后，在DOS状态下，进入目录\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\，用JDK的javac命令编译helloWorld.java如下：</p>
<p>javac helloWorld.java</p>
<p>注意，Java是区分大小写的，在程序中，编译命令行中字母的大小写都不能写错。 编译成功就表示建立了一个JavaBean。下面看如何在JSP中使用这个JavaBean。用文本编辑器创建一个文本文件hi-bean.jsp，并保存在\jswdk-1.0.1\webpages\test目录下，其内容如下：</p>
<p><code>＜html＞<br />
＜head＞<br />
＜title＞JavaBean 试验＜/title＞<br />
＜/head＞<br />
＜body＞<br />
＜jsp:useBean id="helloBean" scope="session" class="test.helloWorld" /＞<br />
＜%= helloBean.getHi() %＞<br />
＜hr＞<br />
＜%<br />
helloBean.name = "JSP";<br />
out.print(helloBean.getHi());<br />
%＞<br />
＜/body＞<br />
＜/html＞ </code></p>
<p>在JSP网页中，使用 ＜jsp:useBean &#8230; /＞语法来创建JavaBean对象，并命名为helloBean。读者可从这个简单的例子中看出设置、获取JavaBean属性，以及调用JavaBean方法的做法。在浏览器的地址栏中键入http://localhost:8080/test/hi-bean.jsp，得到结果如图3所示。 注意，如果修改和重新编译了JavaBean程序，则需要关闭和重新启动JSWDK的Web服务器以后修改的结果才会有效。如果仅仅修改JSP文件，则不用重新启动JSWDK的Web服务器. 虽然，这仅仅完成了一个非常简单的JavaBean框架，但是遵循这个框架可以设计出多种多样的JavaBean。例如，从JSP中访问数据通常就是通过JavaBean来实现的。</p>
<p><strong>七、 数据库连接</strong></p>
<p>数据库连接对动态网站来说是最为重要的部分，Java中连接数据库的技术是JDBC(Java Database Connectivity)。很多数据库系统带有JDBC驱动程序，Java程序就通过JDBC驱动程序与数据库相连，执行查询、提取数据等等操作。Sun公司还开发了JDBC-ODBC bridge，用此技术Java程序就可以访问带有ODBC驱动程序的数据库，目前大多数数据库系统都带有ODBC驱动程序，所以Java程序能访问诸如Oracle、Sybase、MS SQL Server和MS Access等数据库。下面介绍如何用Access实现一个动态FAQ（常见问题及答案）网站。</p>
<p>首先建立一个Access数据库faq.mdb，其中的表faqs有字段id（自动增量型，并设为主关键字）、subject（文字型，长度200）、answers（备注型）。这个表中可以存放一些编程知识的常见问题及答案，</p>
<p>如图4。</p>
<p>图 4</p>
<p>然后，在Control Panel（控制面板）的ODBC Datasource模块中加入System DSN，取名faq，并指向faq.mdb。</p>
<p>创建一个JavaBean，名为faq.java，并保存在\jswdk-1.0.1\webpages\WEB-INF\jsp\beans\test目录下。faq.java 的内容如下：</p>
<p><code>package test;<br />
import java.sql.*;<br />
public class faq {<br />
String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";<br />
String sConnStr = "jdbc:odbc:faq";<br />
Connection conn = null;<br />
ResultSet rs = null;<br />
public faq() {<br />
try {<br />
Class.forName(sDBDriver);<br />
}<br />
catch(java.lang.ClassNotFoundException e) {<br />
System.err.println("faq(): " + e.getMessage());<br />
}<br />
}<br />
public ResultSet executeQuery(String sql) {<br />
rs = null;<br />
try {<br />
conn = DriverManager.getConnection(sConnStr);<br />
Statement stmt = conn.createStatement();<br />
rs = stmt.executeQuery(sql);<br />
}<br />
catch(SQLException ex) {<br />
System.err.println("aq.executeQuery: " + ex.getMessage());<br />
}<br />
return rs;<br />
}<br />
} </code></p>
<p>用上一节介绍的方法编译faq.java以后，在\jswdk-1.0.1\webpages\test目录下创建JSP文件faq.jsp，其内容如下：</p>
<p><code>＜html＞<br />
＜head＞<br />
＜meta http-equiv="Content-Type" content="text/html; charset=gb2312"＞<br />
＜title＞我的FAQ !＜/title＞<br />
＜/head＞<br />
＜body＞<br />
＜p＞＜b＞这是我的FAQ!＜/b＞＜/p＞<br />
＜%@ page language="java" import="java.sql.*" %＞<br />
＜jsp:useBean id="workM" scope="page" class="test.faq" /＞<br />
＜%<br />
ResultSet RS = workM.executeQuery("SELECT * FROM faqs");<br />
String tt;<br />
while (RS.next()) {<br />
tt = RS.getString("Answer");<br />
out.print("＜LI＞" + RS.getString("Subject") + "＜/LI＞");<br />
out.print("＜pre＞" + tt + "＜/pre＞");<br />
}<br />
RS.close();<br />
%＞ </code></p>
<p>在浏览器的地址栏中键入http://localhost:8080/test/faq.jsp，faq.jsp调用JavaBean，从数据库中读出内容并输出，得到结果如图5所示. 限于篇幅，本文不能列举JSP-JavaBean-JDBC/ODBC-数据库的复杂例子，读者可以从本文最后所推荐的网址中找到并下载到数据库连接范例。</p>
<p><strong>八、 技术分析</strong></p>
<p>Microsoft 公司的 ASP 技术也是动态网页开发技术。JSP和ASP从形式上非常相似，ASP程序员一眼就能认出＜% %＞以及＜%= %＞。但是深入探究下去会发现它们很多的差别，其中最主要的有以下三点：</p>
<p>1、 JSP的效率和安全性更高</p>
<p>ASP以源码形式存放，以解释方式运行，每次ASP网页调用都需要对源码进行解释，运行效率不高。另外，IIS的漏洞曾使得许多网站源程序大曝光，包括笔者以前用ASP开发的网站，ASP程序全部被人下载了去。 JSP在执行以前先被编译成字节码 (bytecode)，字节码由Java虚拟机(Java Virtual Machine)解释执行，比源码解释的效率高；服务器上还有字节码的Cache机制，能提高字节码的访问效率。第一次调用JSP网页可能稍慢，因为它被编译成Cache，以后就快得多了。同时，JSP源程序不大可能被下载，特别是</p>
<p>JavaBean程序完全可以放到不对外的目录中。</p>
<p>2、 JSP的组件 (Component) 方式更方便 ASP通过COM来扩充复杂的功能，如文件上载、发送email以及将业务处理或者复杂计算分离出来成为独立可重复利用的模块。JSP通过JavaBean实现了同样的功能扩充。 在开发方面，COM的开发远比JavaBean复杂和繁琐，学会ASP不难，但学会开发COM可不简单。而JavaBean就简单多了，从本文上述示例中可以看出开发JavaBean很方便。 在维护方面，COM必须在服务器上注册，如果修改了COM程序，就必须重新注册，甚至必须关机和重新启动。JavaBean则不需要注册，放在CLASSPATH包含的目录中就行了。如果JavaBean进行了修改，则JSWDK和Tomcat现在还需要关闭和重新运行（但不是关机），但开发者已经许诺将在以后的版本中做到不需要关闭服务器。 另外JavaBean是完全的OOP，可以针对不同的业务处理功能方便地建立一整套可重复利用的对象库，例如用户权限控制、email自动回复等等。</p>
<p>3、 JSP的适应平台更广</p>
<p>ASP目前仅适用于NT和IIS。虽然Unix下有ChiliSoft的插件来支持ASP，但是ASP本身的功能有限，必须通过ASP+COM的组合来扩充，Unix下的COM实现起来非常困难。 JSP则不同，几乎所有平台都支持Java，JSP+JavaBean可以在所有平台下通行无阻。NT下IIS通过一个插件，例如JRUN(http://www3.allaire.com/products/jrun/)或者ServletExec(http://www.newatlanta.</p>
<p>com/)，就能支持JSP。著名的Web服务器Apache已经能够支持JSP。由于Apache广泛应用在NT、Unix和Linux上，因此JSP有更广泛的运行平台。虽然现在NT操作系统占了很大的市场份额，但是在服务器方面Unix的优势仍然很大，而新崛起的Linux更是来势不小。 从一个平台移植到另外一个平台，JSP和JavaBean甚至不用重新编译，因为Java字节码都是标准的与平台无关的。笔者将在NT下实验的JSP网页原封不动地拿到Linux下就运行起来了，感觉非常满意。</p>
<p><strong>九、 结论</strong></p>
<p>综上所述，JSP可谓是构建动态网站的一个利器，故推荐给读者，祝愿你们掌握JSP，开发出优秀的网站。ASP程序员也请试一下，JSP里也有session、request、response/out等对象，亲自试试看如何。</p>
<p><strong>附文</strong></p>
<p>这里是关于JSP的重要参考资料，有兴趣的读者可以进一步阅读。</p>
<p>http://java.sun.com/products/jsp/faq.html</p>
<p>http://www.esperanto.org.nz/jsp/jspfaq.html</p>
<p>http://www.zdnet.com/pcweek/stories/news/0,4153,410709,00.html</p>
<p>http://developer.netscape.com/viewsource/kuslich_jsp</p>
<p>/kuslich_jsp.html</p>
<p>http://web2.java.sun.com/products/jsp/jsp-asp.html</p>
<p>http://www.asptoday.com/articles/19991022.htm</p>
<p>欢迎光临www.dukejava.com！</p>
<p>JavaServer Pages (JSP)是基于Java的技术，用于创建可支持跨平台及跨Web服务器的动态网页。 JSP可与微软的Active Server Pages (ASP)相媲美，但JSP使用的是类似于HTML的标记和Java 代码片段而不是用VBScript。当你使用不提供ASP本地支持的Web服务器（例如 Apache或Netscape服务器）时，你就可以考虑使用JSP了。你虽然也可以为这些服务器弄一个ASP附加软件模块，但是太昂贵了。现在Sun公司并不会因你使用JSP向你收费（虽然将来可能要收），况且用于Solaris、 Linux以及Windows系统的组件都很容易获得。 不要把JSP与服务器端的JavaScript语言搞混了。Web服务器自动将通过JSP生成的Java代码片段转换成Java 片段（servlets）。 JSP也可自动控制许多功能，如过去用Perl脚本编写功能程序或像ASP这样的服务器专用API（应用编程接口）.我们马上就要开始帮助你建立一个使用JSP 技术的网站范例了。</p>
<p>准备好计算机以使用JSP 你需要Java2软件开发工具箱（J2SDK），过去称之为Java开发工具箱（JDK）、JavaServer 网络开发工具箱（JSWDK）、Tomcat，或者其它能支持JSP的Web服务器。升阳公司为Windows、Solaris以及 Linux平台提供免费的J2SDK和JSWDK。 如果你想在现有的Web服务器上使用JSP，而此服务器本身不支持JSP和Java 代码片段，可以试用Allaire公司的Jrun。它可以为Netscape的Enterprise Server和Fasttrack Server、微软的Internet Information Server（IIS）和Personal WebServer（PWS）、Apache以及其他服务器充当Web服务器附件。你也可以使用Apache服务器的Java版，其中包含最新的JSWDK。 下载并安装所需的软件 目前，版本号为1.2.2-001的J2SDK可下载版以可安装的归档文件形式出现。这个大约20MB的下载量软件可提供一个彻底的Java开发环境，让你创造任何基于Java并且利用了而标准核心API的解决方案。其实，你的Web服务器使用JSP的唯一条件是要有Java编辑器。要让Web服务器知道编辑器的位置，需要JAVA_HOME 环境变量设置为J2SDK安装目录。如果你已经在Windows系统中进行了安装并且接受了默认目录， 请将“set JAVA_HOME=C:\1.2.2”添加到你的“autoexec.bat”文件中，然后重新启动。 安装J2SDK后，下载并安装JSWDK或者是Tomcat β版，即基于Java的Apache Web服务器的β版。你把JSWDK放在什么地方是无关紧要的，只要你以后能找到它就行。通常，将其放在顶层目录中，这样你在替换JSWDK或JSDK时无需删除另一个软件。安装好这个文件后，准备工作已经就绪，你可以开始JSP开发工作了。 正确地安装JSWDK后，请运行“startserver”脚本程序，以启动Web服务器，使其按照默认情况监听8080端口。你要在启动服务器之后查看您是否已正确地安装了此工具，请加载一个JSP样本文件（http://locahost:8080/examples/jsp/）。如果你能成功地运行这些样本文件，说明你已经正确地安装了这个软件。如果你在用来启动服务器的控制台窗口中看到报错信息，你就需要做些修改。最经常发生的问题是没有设置或不正确地设置了JAVA_HOME环境变量。要看到当前环境变量设置情况，要请在DOS提示符下键入“set”设置。 开始 在解释 JSP语法前，创建一个快捷网页，显示目当前的日期和时间，并然后将之其保存为sample.jsp：</p>
<p><code>＜html＞<br />
＜head＞<br />
＜title＞First Page＜/title＞<br />
＜/head＞<br />
＜body＞<br />
＜H3＞Today is:<br />
＜%= new java.util.Date() %＞<br />
＜/H3＞<br />
＜/body＞<br />
＜/html＞. </code></p>
<p>把这个文件以及你所有的HTML 和 JSP 页面放在JSWDK安装目录下的网页目录里。你可以从http://localhost:8080/sample.jsp加载此网页。该网页首次被访问时，Web服务器会把JSP编译成Java代码片段，这样你就能够看到当前的日期和时间了。 你已经下载、安装并配置好了开发环境，你可以开始学习JSP语法并创建自己的基于JSP的解决方案了。</p>
<p><strong>JSP基本语法</strong></p>
<p>讲完安装问题后，现在进入来讨论JSP语法。一个投机取巧的办法是下载语法卡片。如果你不熟悉Java编程，也许你想看一下Sun的指南 。然而网页创建者并不需要进行太多的Java开发。除了一些方法调用，在你的JSP网页里应尽可能少用Java代码。 记住以上提示，我们首先来看一看JSP指令和脚本元素，之后我们会解释JavaBeans和隐含对象。共有五种JSP指令和脚本元素。在JSP 1.0版中，大部分JSP被一个以“＜%” 开头和以“%＞”结尾的的标记括在其中。在更新的JSP 1.1规范出台后，就有了与XML兼容的版本。 JSP指令和脚本元素</p>
<p><code>Directives ＜%@ directive %＞<br />
Declarations ＜%! declaration %＞<br />
Expressions ＜%= expression %＞<br />
Code Fragment/Scriptlet ＜% code fragment %＞<br />
Comments ＜%-- comment --%＞</code></p>
<p><strong>指令</strong></p>
<p>JSP指令是为JSP引擎而设计的。他们并不直接产生任何可见输出，而只是告诉引擎如何处理其余JSP页面。这些指令始终被括在 “＜%@ ?%＞”标记中。两个最重要的指令是“pagePage”和“Include”。“Taglib”指令不在讨论之列，但是在用JSP1.1创建自定义标记可以使用它。 几乎在所有JSP页面顶部都会看到“Page”指令。尽管不是必须的，但它可以让你指定： 到何处查找起支持作用的Java类别：</p>
<p><code>＜%@ page import="java.util.Date" %＞, </code></p>
<p>出现Java运行问题时，将网上冲浪者引向何处：</p>
<p><code>＜%@ page errorPage="errorPage.jsp" %＞, </code></p>
<p>还有你是否需要管理用户的会话级信息，这些信息可能来自多个网页（在下面的JavaBeans一节将对此做进一步讲）述：</p>
<p><code>＜%@ page session="true" %＞. </code></p>
<p>“Include”指令可以把你的内容分成更多可管理的元素，比如包括一个普通页面页眉或页脚的元素。包含的网页可以是一个固定的HTML 页面或更多的JSP内容：</p>
<p><code>＜%@ include file="filename.jsp" %＞ </code></p>
<p><strong>声明</strong></p>
<p>JSP声明用来让你定义页面级变量，以保存信息或定义JSP页面的其余部分可能需要的支持方法。如果你发现代码太多，通常最好把它们写成一个独立的Java类别。声明一般都在“＜%! ?%＞”标记中。一定要以分号（；）结束变量声明，因为任何内容都必须是有效的Java语句：</p>
<p><code>＜%! int i=0; %＞。 </code></p>
<p><strong>表达式</strong></p>
<p>有了JSP表达式，表达式评估结果会被转换成一个字符串，并且被直接包括在输出页面之内。JSP 表达式包含在“＜%= ?%＞” 标记中，没有分号，除非在加引号的字符串部分使用分号。</p>
<p><code>＜%= i %＞<br />
＜%= "Hello" %＞ . </code></p>
<p><strong>代码片段/脚本片段</strong></p>
<p>代码片段/脚本片段（Scriptlets） JSP代码片段或脚本片段是嵌在“＜% ?%＞”标记中的。这种Java代码在Web服务器响应请求时就会运行。在脚本片段周围可能是原始的HTML或XML语句，在这些地方，代码片段可以使你创建条件执行代码，或要用到另外一段代码的代码。例如，以下的代码组合使用表达式和代码片段，显示H1、H2、H3和H4标记中的字符串“Hello”。代码片段并不局限于一行源代码：</p>
<p><code>＜% for (int i=1; i＜=4; i++) { %＞<br />
＜H＜%=i%＞＞Hello＜/H＜%=i%＞＞<br />
＜% } %＞. </code></p>
<p><strong>注释</strong></p>
<p>最后一个主要的JSP元素是嵌入式注释。尽管你始终可以在文件中加入HTML注释，但用户在查看页面源代码时会看到这些注释。如果你不想让用户看到它，你就应该将其嵌入“＜%&#8211; ?&#8211;%＞” 标记中： <code>＜%-- comment for server side only --%＞.</code> 带JavaBean 的JSP 虽然你可以把大段的代码放在脚本片段（scriptlet）内，但是绝大多数的Java代码属于可重复使用的名为JavaBea的组件。JavaBean类似于ActiveX控件：他们都能提供常用功能并且可以重复使用。 JavaBean的值是通过一些属性获得的，你可通过这些属性访问JavaBean设置。以一个人来打比方，这个人就是一个JavaBean，这个人的名字、身份证号码以及住址就是其属性。在JSP网站，你基本上就是通过玩“Connect the beans）”来使你的网站动态化。 假设JavaBean先于网站被创建出来，你需要做的第一件事就是告诉JSP页面它将要用到一个“Bean”。你可以用“＜jsp:useBean＞”标记来做到这一点：</p>
<p><code>＜jsp:useBean id="localName" class="com.jguru.Person" scope="application" /＞。</code> “＜jsp:useBean＞”标记要求你用“id”属性来识鉴别Bean。这里你提供一个名字来JSP页面其余部分的Bean。除了“id”属性，你还须告诉网页面从何处查找Bean，或者它的Java类别名是什么。这种类别属性提供确认Bean的功能，其他一些方法也可以做到这一点。最后一个必需的元素是“scope”属性。有了“scope”属性的帮助，你就能告诉Bean为单一页面（默认情况）[scope="page"]、为[scope="request"]请求为会话[scope="session"]，或者为整个应用程序[scope="application"]保持留信息。有了会话范围，你就能非常容易地在JSP网页面上维护购物车等项目。 一旦你声名了一个JavaBean，你就可以访问它的属性来定制它。要获得属性值，请用“＜jsp:getProperty＞”标记。有了这个标记，你就能指定将要用到的Bean名称（从useBean的&#8221;id&#8221;字段得到）以及你想得到其值的属性。实际的值被放在输出中：</p>
<p><code>＜jsp:getProperty id="localName" property="name" /＞。</code></p>
<p>要改变JavaBean属性，你必须使用“＜jsp:setProperty＞”标记。对这个标记，你需要再次识别Bean和属性，以修改并额外提供新值。如果命名正确，这些值可以从一个已提交的表中直接获得：参数获得：</p>
<p><code>＜jsp:setProperty id="localName" property="*" /＞;</code></p>
<p>可以从一个参数获得，但你必须直接命名属性和参数：</p>
<p><code>＜jsp:setProperty id="localName" property="serialNumber" value="string" /＞</code></p>
<p>或者直接用一个名字称和值来设置：<br />
<code>＜jsp:setProperty id="localName" property="serialNumber" value= ＜%= expression %＞ . </code></p>
<p>关于JavaBean 的最后一件事： 为了Web服务器能找到JavaBean，你需要将其类别文件放在一个特殊位置。用JSWDK，最 方便的位置是安装目录下的类别目录，如\jswdk-1.0.1\classes。</p>
<p><strong>JSP隐含对象</strong></p>
<p>与JSP语法相关的最后的元素是一些叫做“隐含对象”的东西。在JSP代码片段中，你可以利用这些隐含对象与JSP页面的代码片段执行环境产生互动。应尽量少访问这些内置隐含对象。但是，在一某些情况下，访问隐含对象是可被接受的。若要充分利用隐含对象，就需了解最新的Java Servlet API。 下表列出可用的隐含对象集合。</p>
<p><strong>隐含对象说明</strong></p>
<p>request 客户端请求，包括从GET/POST请求传递过来的参数</p>
<p>response 网页传回客户端的反应</p>
<p>pageContext 在此管理网页属性</p>
<p>session 与请求关联的会话</p>
<p>application 代码片段的运行环境</p>
<p>out 传送响应的输出流</p>
<p>config 代码片段配置对象</p>
<p>page JSP网页本身</p>
<p>exception 有错的网页中未被捕获的例外</p>
<p>这些都是用来做什么的，你又如何来使用它们呢？基本上说，在你的脚本片段里，你可以用它们进入执行JSP代码的代码片段。用不着深入了解太多的Servlet API细节，我们来看看能用它们来做到的某些事情： 你可以不用表达式，直接进入“Out”隐含对象，将某些内容输出到响应中：</p>
<p><code>＜% out.println("Hello"); %＞。</code></p>
<p>用不着把一个参数直接送到JavaBean，你可以从请求对象获取参数值：</p>
<p><code>＜% String name=request.getParameter("name"); out.println(name); %＞.</code></p>
<p>在你用JSP进行开发的过程中，进行更多的开发的过程中，如果创建了JavaBeans或发现JSP文件中加入了太多的Java源代码，你就需要创建起支持作用的Java分类（class）了，它可以协助你重复利用源代码并减少JSP网页编译时间。当你需要创建Java分类文件时，你必须： 将JDSWK installation\bin目录添加到PATH中。在autoexec.bat文件PATH行的末尾，加入“C:1.2.2/bin”。</p>
<p>用这个命令将JAR文件复制到“\jre\lib\ext：”目录中： copy c:\jswdk-1.0.1\lib\servlet.jar</p>
<p>c:\jdk1.2.2\jre\lib\ext.</p>
<p><strong>创建一个JSP网站</strong></p>
<p>现在该是把所有这些JSP语法派上用场的时候了。我们将创建一个网页，它有一个输入表单，可以使用户输入一个股票代号以获得出当前股价（有20分钟）。如果输入有误，则显示报错网页。</p>
<p>quote.jsp</p>
<p>首先，用 这个代码 创建一个quote.jsp网页并将其保存在JSWDK安装目录下的网页目录中。大多数的网页是标准的HTML，其间散布着JSP代码。第六行是一个网页指示，表示将把所有错误发送到“errorPage.jsp”文中。第13到15行是一个脚本片段，主要说明只有提供“符号”参数才会显示表格。“If”代码段在</p>
<p>32到34行结束。第17行定义了要用的JavaBean，第18行从参数加载JavaBean的符号属性。第27行到29行显示Bean的属性。除了&#8221;if &#8220;代码段，实际上并不涉及其它Java代码。</p>
<p>errorPage.jsp</p>
<p>下一步，将下列JSP源代码保存到网页目录中的“errorPage.jsp”文件中。“这是一个错误网页”的提示为第一行，它将isErrorPage网页提示属性设置为真。上一页说了明错误网页的位置，本页则说明这就是错误网页。其它JSP文件中的JSP专用代码只有访问隐含例外对象才用到。网页只显示其值：</p>
<p><code>＜%@ page isErrorPage="true" %＞<br />
＜html＞<br />
＜head＞<br />
＜title＞Error Page＜/title＞<br />
＜/head＞<br />
＜body＞<br />
＜h1＞Our Error Page＜/h1＞＜/font＞<br />
＜!-- Print Exception --＞<br />
We got ourselves an exception:<br />
＜%= exception %＞<br />
＜a href="quote.jsp"＞Restart＜/a＞<br />
＜/body＞<br />
＜/html＞。<br />
Quotes.java<br />
Quotes JavaBean<br />
</code>利用Yahoo资源来获得股票价格。需要将此 资源保存到JSWDK安装目录下“classes\com\jguru”目录中的“quotes.java”文件中。请在此用JSDK中的Javac编辑器来编辑它。</p>
<p><strong>你的第一个JSP网页。</strong></p>
<p>创建了这两个JSP文件，建立了JavaBean资源文件并编辑了它后，你就可以从http://localhost:8080/quote.jsp加载“quote.jsp”文件以查看结果，假设你没有更改JSWDK安装设置，转而使用别的端口。这个网页当然能做得更漂亮，但是它已实现了需要实现的功能，并且很好地展示了JSP的功能。</p>
]]></content:encoded>
			<wfw:commentRss>http://yutao.net/native/getting-started-tutorial-jsp-learning.shtml/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
