﻿<?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-风依归林鹤 云憩隐山居</title><link>http://www.blogjava.net/tianlinux/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 03 Apr 2026 21:32:11 GMT</lastBuildDate><pubDate>Fri, 03 Apr 2026 21:32:11 GMT</pubDate><ttl>60</ttl><item><title>游戏引擎脚本系统（二）</title><link>http://www.blogjava.net/tianlinux/archive/2007/06/01/121434.html</link><dc:creator>tianlinux</dc:creator><author>tianlinux</author><pubDate>Fri, 01 Jun 2007 14:35:00 GMT</pubDate><guid>http://www.blogjava.net/tianlinux/archive/2007/06/01/121434.html</guid><wfw:comment>http://www.blogjava.net/tianlinux/comments/121434.html</wfw:comment><comments>http://www.blogjava.net/tianlinux/archive/2007/06/01/121434.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/tianlinux/comments/commentRss/121434.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianlinux/services/trackbacks/121434.html</trackback:ping><description><![CDATA[<p goog_ds_charIndex="1">这两天，有关游戏引擎脚本系统的预研还在继续。在google上找了一些资料来学习，目前网络上这部分的资料是比较少的，主要还是在gamedev上有一些相关的主题。泡了两天的鸟文论坛，做了一打的摘录。现在整理一下思绪，感觉脚本系统的轮廓已经比较清晰了，但还有很多细节需要去了解，后续会对这些细节再慢慢研究道来。</p>
<p goog_ds_charIndex="155">&nbsp;</p>
<p goog_ds_charIndex="156">脚本的基本特性</p>
<p goog_ds_charIndex="165">1、从语法的角度来说需要支持到顺序、条件、循环，并且最好语法接近某种成熟语言（比如C），这样有利于学习＆使用；</p>
<p goog_ds_charIndex="222">2、性能，性能，性能。要在实时的游戏里面发挥作用，性能无异是贯穿始终的话题。</p>
<p goog_ds_charIndex="262">&nbsp;</p>
<p goog_ds_charIndex="263">语法功能解决方案</p>
<p goog_ds_charIndex="273">1、可以选择一门成熟语言作为借鉴；</p>
<p goog_ds_charIndex="292">2、删掉不需要的Keyword，裁剪语言元素。特别对于C语言，完全去掉有关函数声明等部分可以大大降低parse&amp;excute的复杂性。</p>
<p goog_ds_charIndex="361">&nbsp;</p>
<p goog_ds_charIndex="362">脚本库</p>
<p goog_ds_charIndex="367">1、脚本语言的函数库比脚本语言的语法更加重要，这个说法的出发点仍然是性能。在上一篇文章中，我有提到&#8220;冗余&#8221;的概念，就是这句话很好的体现。尽量将复杂的函数功能封装在游戏引擎本身，而不要在脚本中编写这些函数，甚至可以在脚本中不提供用户自定义函数的功能。</p>
<p goog_ds_charIndex="493">2、提供给用户（脚本编写者）完善的库函数集，从环境配置命令到信息查询等等。用户用这些函数来控制游戏环境，脚本语法只是提供分支＆循环控制。&nbsp;</p>
<p goog_ds_charIndex="564">&nbsp;</p>
<p goog_ds_charIndex="565">事件响应</p>
<p goog_ds_charIndex="571">1、上篇提到&#8220;事件&#8221;(event)指的是所有外设输入的统称，这种说法是不全面的。除了外设输入，事件还可以由游戏引擎内部来触发，比如timer事件，这里做一个小小的更正。</p>
<p goog_ds_charIndex="657">2、事件包含一些参数，参数的内容是&#8220;哪些Object要响应&#8221;＆&#8220;事件类型&#8221;。</p>
<p goog_ds_charIndex="697">3、一个脚本可以调用其他脚本，实现脚本之间的通信。</p>
<p goog_ds_charIndex="724">4、事件，可作为脚本系统＆游戏引擎的连接，也就是说，游戏引擎只有在处理事件的时候才会调用脚本系统，而脚本系统的唯一任务，就是响应事件。</p>
<p goog_ds_charIndex="793">5、再次强调一下，事件不是只能有游戏引擎内部的object来触发，还有timer、startUp、sceneEnd等等。</p>
<p goog_ds_charIndex="855">&nbsp;</p>
<p goog_ds_charIndex="856">脚本运行模型</p>
<p goog_ds_charIndex="864">1、每个脚本都可以&#8220;挂&#8221;到任何数量的object上去；</p>
<p goog_ds_charIndex="893">2、每个脚本都可以看作是独立的虚拟机，拥有自己独立的变量、堆栈＆运行点(execution pointer)，这一点我自己有保留的想法，出于性能原因，可能独立虚拟机的概念难以实施，需要进一步寻找变通的方法。</p>
<p goog_ds_charIndex="998">&nbsp;</p>
<p goog_ds_charIndex="999">访问控制</p>
<p goog_ds_charIndex="1005">1、上篇提到脚本需要能读取＆改变游戏引擎内部object的属性，这里需要注意一个问题：让脚本直接访问object的属性是很危险的事情，出于defensive coding的考虑，个人认为不应该让脚本直接地来访问内部数据，而应该提供库函数，通过库函数来对内部数据进行访问，这样做的好处是：将边界检查等等安全性工作加入了进来，并且让脚本编写者在编写脚本的时候不用对安全性进行考虑；坏处是：肯定效率是有所降低的。（或者还有更好的办法？想想。。。）</p>
<p goog_ds_charIndex="1227">&nbsp;</p>
<p goog_ds_charIndex="1228">库函数</p>
<p goog_ds_charIndex="1233">1、库函数的实质是C/C++（引擎编写语言）的函数指针，对于脚本系统来说它们是可见的全局symbols。这里引入两个小话题：一是在引擎初始化的时候，需要注意建立这些函数的入口地址表，让引擎在需要调用的时候有表可查；二是，java呢？有没有类似函数指针的东西？（这里属于实现阶段的问题，我只是提出，没有去研究）</p>
<p goog_ds_charIndex="1389">2、脚本运行的时候，如果遇到调用库函数，则跳转到native C/C++代码去。这里存在运行环境切换的问题，从脚本语言的堆栈里弹出参数，传给native C/C++函数来执行，执行结束以后，返回结果压入脚本语言的堆栈中。如果把游戏引擎看做虚拟机，那么脚本系统就是嵌套在这个虚拟机里面的虚拟机，^_^，拗口哦，不知道您明白了没有？</p>
<p goog_ds_charIndex="1555">====================================================================================================&nbsp;</p>
<p goog_ds_charIndex="1658">以上讨论的，是运行与游戏引擎部分的脚本系统。以下的，是有关脚本本身的一些讨论，这个应该归属于游戏制作工具的一部分。</p>
<p goog_ds_charIndex="1717">====================================================================================================</p>
<p goog_ds_charIndex="1819">编译</p>
<p goog_ds_charIndex="1823">1、当然，这个步骤叫&#8220;解释&#8221;，与C语言一类编译式语言有所区分的话更加准确。但由于在做法上跟C是类似的，所以也可以叫&#8220;编译&#8221;。</p>
<p goog_ds_charIndex="1887">2、两个阶段：一是把脚本源代码拆成语言元素，token，不知道这个用哪个中文表达好，编译原理学了都忘了；二是把所有token组织起来，组成基本命令序列。</p>
<p goog_ds_charIndex="1965">3、什么&#8220;基本命令序列&#8221;？刚才不是说把脚本看过虚拟机吗？这个&#8220;基本命令&#8221;就相当于这个虚拟机CPU的机器指令或汇编指令。也就是对于这个虚拟机来说的可执行代码。</p>
<p goog_ds_charIndex="2045">&nbsp;</p>
<p goog_ds_charIndex="2046">&#8220;汇编指令&#8221;</p>
<p goog_ds_charIndex="2054">1、为了简单，就把脚本这个虚拟机设计成单堆栈的吧。</p>
<p goog_ds_charIndex="2081">2、基本的命令包括：push，pop，go，stop，callfunc，add，asign等等。</p>
<p goog_ds_charIndex="2131">&nbsp;</p>
<p goog_ds_charIndex="2132">举个小例子吧：比如写了如下的脚本（语法上近C）</p>
<p goog_ds_charIndex="2157">a = 1 + 2;</p>
<p goog_ds_charIndex="2169">通过编译，变化成如下的&#8220;可执行序列&#8221;：</p>
<p goog_ds_charIndex="2190">push 1</p>
<p goog_ds_charIndex="2198">push 2</p>
<p goog_ds_charIndex="2206">pop&nbsp;&nbsp;&nbsp;// store 1 </p>
<p goog_ds_charIndex="2225">pop&nbsp;&nbsp;&nbsp;// store 2</p>
<p goog_ds_charIndex="2243">add&nbsp;&nbsp;&nbsp;// store result</p>
<p goog_ds_charIndex="2266">push 3&nbsp;&nbsp;&nbsp;// push result</p>
<p goog_ds_charIndex="2291">pop&nbsp;&nbsp;&nbsp;// store 3</p>
<p goog_ds_charIndex="2309">pop&nbsp;&nbsp;&nbsp;// var name a</p>
<p goog_ds_charIndex="2330">asign&nbsp;&nbsp;&nbsp;// a = 3</p>
<p goog_ds_charIndex="2348">这里只是示意，可能与实际实现有出入。</p>
<p goog_ds_charIndex="2368">&nbsp;</p>
<p goog_ds_charIndex="2369">这篇略显枯燥了，聊点轻松的。一直在强调脚本语言的性能问题，来看看 <a title=各种语言性能比较 href="http://shootout.alioth.debian.org/gp4/index.php" target=_blank goog_ds_charIndex="2403"><u><font color=#0000ff>各种语言性能比较</font></u></a> 吧。LUA好像在脚本语言里面排名靠前呵，我正好也下载了它的源码，并在VC上编译好了。在Python＆LUA之间犹豫了一下，还是选择LUA吧，比较小，简单，Python目前已经做得很复杂了。再说偶的脚本系统里面目前不需要提供自定义函数机制，也不需要OO滴，看看几个月后能不能作出自己的脚本语言来？到时候再跟Python等等一较高低！:)<br><br>好戏在后头哦，下期开始实际以LUA为例子研究脚本系统了。。</p>
<img src ="http://www.blogjava.net/tianlinux/aggbug/121434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianlinux/" target="_blank">tianlinux</a> 2007-06-01 22:35 <a href="http://www.blogjava.net/tianlinux/archive/2007/06/01/121434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP-Servlet学习笔记（二）——JSP到Servlet</title><link>http://www.blogjava.net/tianlinux/archive/2007/05/31/121249.html</link><dc:creator>tianlinux</dc:creator><author>tianlinux</author><pubDate>Thu, 31 May 2007 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/tianlinux/archive/2007/05/31/121249.html</guid><wfw:comment>http://www.blogjava.net/tianlinux/comments/121249.html</wfw:comment><comments>http://www.blogjava.net/tianlinux/archive/2007/05/31/121249.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/tianlinux/comments/commentRss/121249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianlinux/services/trackbacks/121249.html</trackback:ping><description><![CDATA[<p>原本的打算是在第二篇介绍JSP的基本语法，逛了一些坛子，这类的文章实在是太多了。就在blogjava里面，都有博友正在推出系列的讲座。我一一翻阅过，所以觉得这里应该讲一些他们没有讲到的地方。如果您还不了解JSP的语法，并且对这个部分比较关注，您可以去<a title=JSP基本语法参考 href="http://www.blogjava.net/alecwen/" target=_blank><u><font color=#0000ff>alecwen的博客</font></u></a> 看看，那里有alecwen博友有关JSP基本语法＆用法的文章，比较简洁实用。 </p>
<p>选择什么样的题材来写第二篇呢？我在第一篇里面有提到&#8220;JSP需要经过转译成servlet&#8221;，那干脆就在这里讲讲这个转译过程。对于网页设计人员来说，这个部分的知识比较多余，也不适合没有程序设计基础的人看，对于程序设计人员来说，应该可以加深您对JSP＆Servlet的理解，最最重要的，我认为有了这个部分的知识，可以方便你进行JSP的相关调试。从我现在的经验来讲，在不借助于大型的IDE的情况下（只为学习目的的话，我是不喜欢用大型IDE的，比如Netbean，Eclipse等等，一是太占资源，偶的本本跑起比较慢:(；二是对于新手往往会在太多的菜单选项里面迷失方向，甚至花很大精力在建立工程、添加\删除工程文件等等事情上，难以专注于要学习的东西），JSP的调试是比较难的。虽然运行方式非常的简单，您只需要在浏览器地址栏输入您发布的jsp文件路径，回车即可测试，但如果JSP包含有错误（包括编译式错误＆运行时异常），都会输出一堆看不太懂的调用堆栈。堆栈里面往往会提及xxx.java文件的xxx行，但对于JSP开发来说，看不到这些文件，甚至不知道有这些文件的存在。所以，大多数情况下，JSP里面是不提倡写太过复杂的java代码的。 </p>
<p>好了，正式开始研究JSP到Servlet的转换过程。接着上篇讲的例子。在/webapp/hello.jsp（<a href="http://localhost:8080/tianlinux/hello.jsp"><u><font color=#0000ff>http://localhost:8080/tianlinux/hello.jsp</font></u></a>）里边有如下的代码：</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">&nbsp;out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello,&nbsp;JSP/Servlet</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">&nbsp;</span></div>
<p>&nbsp;</p>
<p>简单的，只有一句代码。我们在初学java的时候，写一个hello world应该都远远不止这点代码，里面一定有文章。并且，您发现了吗：第一次访问hello.jsp，浏览器停顿了一下下，才显示出了"Hello, JSP/Servlet"这句话，后面再次访问，就不会再停顿了。是的，这正是因为第一次访问jsp的时候，JSP有个转译的过程。这个过程包括以下几个步骤：</p>
<p>1、根据jsp文件生成java文件；</p>
<p>2、调用编译器对java文件进行编译；</p>
<p>3、如果编译通过，载入JVM运行；</p>
<p>4、将执行结果返回。</p>
<p>我们先看第一个步骤。由jsp转化而成的java文件在什么位置呢？我们在Tomcat的安装目录下搜索一下，比如刚才的hello.jap，%tomcat%表示tomcat的安装目录，则在如下的路径%tomcat%\work\Catalina\localhost\tianlinux\org\apache\jsp\找到了hello_jsp.java文件。打开看看。这里我们偏偏题，看看大家一般用什么文本编辑器？不要告诉我说您写一个简单的java文件都要用IDE哦，也不要告诉我您还在使用寒碜的notepad哦^_^，我推荐使用<a title="Notepad-plus home" href="http://notepad-plus.sourceforge.net/tw/site.htm" target=_blank><u><font color=#0000ff>notepad++</font></u></a>。功能跟UltraEdit基本类似，但UE是付费的（虽然在伟大的祖国，基本上没有需要真正付费的，但谁知道这种天堂般的日子什么时候会到头呢？），notepad++是完全免费的，并且加入了sourceforge，遵从GPL，作者是台湾人侯今吾，侯工可是学法国文学出生的哦~。在台湾企业工作了2年多，跟很多台湾籍工程师有所接触，别的不说，感觉在敬业精神＆技术能力上，大陆工程师还是普遍落后于海峡那边的同胞的，这跟受到的教育＆经济水平是有直接联系的。扯远了，反正为了一句话，为了民族xxx产业，为了实现自我xxx，也为了大把的银子，大家一起努力了~。好了，打开那个hello_jsp.java了吗？我们看到如下的代码：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;org.apache.jsp;<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.http.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.servlet.jsp.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;hello_jsp&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;org.apache.jasper.runtime.HttpJspBase<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img id=Codehighlighter1_242_1681_Open_Image onclick="this.style.display='none'; Codehighlighter1_242_1681_Open_Text.style.display='none'; Codehighlighter1_242_1681_Closed_Image.style.display='inline'; Codehighlighter1_242_1681_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_242_1681_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_242_1681_Closed_Text.style.display='none'; Codehighlighter1_242_1681_Open_Image.style.display='inline'; Codehighlighter1_242_1681_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;org.apache.jasper.runtime.JspSourceDependent&nbsp;</span><span id=Codehighlighter1_242_1681_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_242_1681_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;java.util.List&nbsp;_jspx_dependants;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_328_361_Open_Image onclick="this.style.display='none'; Codehighlighter1_328_361_Open_Text.style.display='none'; Codehighlighter1_328_361_Closed_Image.style.display='inline'; Codehighlighter1_328_361_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_328_361_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_328_361_Closed_Text.style.display='none'; Codehighlighter1_328_361_Open_Image.style.display='inline'; Codehighlighter1_328_361_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Object&nbsp;getDependants()&nbsp;</span><span id=Codehighlighter1_328_361_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_328_361_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;_jspx_dependants;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;_jspService(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img id=Codehighlighter1_501_1679_Open_Image onclick="this.style.display='none'; Codehighlighter1_501_1679_Open_Text.style.display='none'; Codehighlighter1_501_1679_Closed_Image.style.display='inline'; Codehighlighter1_501_1679_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_501_1679_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_501_1679_Closed_Text.style.display='none'; Codehighlighter1_501_1679_Open_Image.style.display='inline'; Codehighlighter1_501_1679_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;java.io.IOException,&nbsp;ServletException&nbsp;</span><span id=Codehighlighter1_501_1679_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_501_1679_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;JspFactory&nbsp;_jspxFactory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;PageContext&nbsp;pageContext&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HttpSession&nbsp;session&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ServletContext&nbsp;application&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ServletConfig&nbsp;config&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;JspWriter&nbsp;out&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;page&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;JspWriter&nbsp;_jspx_out&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;PageContext&nbsp;_jspx_page_context&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img id=Codehighlighter1_815_1302_Open_Image onclick="this.style.display='none'; Codehighlighter1_815_1302_Open_Text.style.display='none'; Codehighlighter1_815_1302_Closed_Image.style.display='inline'; Codehighlighter1_815_1302_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_815_1302_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_815_1302_Closed_Text.style.display='none'; Codehighlighter1_815_1302_Open_Image.style.display='inline'; Codehighlighter1_815_1302_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_815_1302_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_815_1302_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_jspxFactory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;JspFactory.getDefaultFactory();<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageContext&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_jspxFactory.getPageContext(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,&nbsp;request,&nbsp;response,<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">8192</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_jspx_page_context&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pageContext;<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;application&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pageContext.getServletContext();<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pageContext.getServletConfig();<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pageContext.getSession();<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pageContext.getOut();<br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_jspx_out&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;out;<br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Hello,&nbsp;JSP/Servlet</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img id=Codehighlighter1_1324_1574_Open_Image onclick="this.style.display='none'; Codehighlighter1_1324_1574_Open_Text.style.display='none'; Codehighlighter1_1324_1574_Closed_Image.style.display='inline'; Codehighlighter1_1324_1574_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1324_1574_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1324_1574_Closed_Text.style.display='none'; Codehighlighter1_1324_1574_Open_Image.style.display='inline'; Codehighlighter1_1324_1574_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(Throwable&nbsp;t)&nbsp;</span><span id=Codehighlighter1_1324_1574_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1324_1574_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img id=Codehighlighter1_1370_1568_Open_Image onclick="this.style.display='none'; Codehighlighter1_1370_1568_Open_Text.style.display='none'; Codehighlighter1_1370_1568_Closed_Image.style.display='inline'; Codehighlighter1_1370_1568_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1370_1568_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1370_1568_Closed_Text.style.display='none'; Codehighlighter1_1370_1568_Open_Image.style.display='inline'; Codehighlighter1_1370_1568_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">(t&nbsp;</span><span style="COLOR: #0000ff">instanceof</span><span style="COLOR: #000000">&nbsp;SkipPageException))</span><span id=Codehighlighter1_1370_1568_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1370_1568_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;_jspx_out;<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(out&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;out.getBufferSize()&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.clearBuffer();<br></span><span style="COLOR: #008080">48</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(_jspx_page_context&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;_jspx_page_context.handlePageException(t);<br></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img id=Codehighlighter1_1584_1675_Open_Image onclick="this.style.display='none'; Codehighlighter1_1584_1675_Open_Text.style.display='none'; Codehighlighter1_1584_1675_Closed_Image.style.display='inline'; Codehighlighter1_1584_1675_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1584_1675_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1584_1675_Closed_Text.style.display='none'; Codehighlighter1_1584_1675_Open_Image.style.display='inline'; Codehighlighter1_1584_1675_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">finally</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_1584_1675_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_1584_1675_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(_jspxFactory&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;_jspxFactory.releasePageContext(_jspx_page_context);<br></span><span style="COLOR: #008080">52</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">53</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">54</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">55</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">56</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br>以目前的情况，我们并没有必要把代码一句一句的都去搞懂。因为大部分的代码所有jsp文件转换出来都是相同，是JSP容器已经设定好的。所以我们只关注其中的部分。</p>
<p>首先是import语句组。这里import了javax.servlet，注意这个包并不是JDK里面默认包含的包，所以现在如果在cmd里面输入javac hello_jsp.java（当然要在这个文件的路径下输入！）可能会出现下面的画面</p>
<p><img src="http://docs.google.com/FilePage?id=dchz9tb3_10c2nq9gcs">&nbsp;</p>
<p>出现了找不到javax.servlet这个包的情况，我的机机上就是这种情况。怎么办呢？赶紧google一下解决办法。</p>
<p>1、在环境变量设置里面找到classpath，然后把%tomcat%/common/lib添加进去。注意Tomcat的版本更新十分频繁，如果版本不是5.5.12，可能文件名或者路径稍有不同，请注意变通。还有需要提醒的是，完成环境变量的设置以后，需要重新开启cmd哦。</p>
<p>2、运气好的GGMM现在已经可以正确编译了吧^_^，但偶不是。目前没有搞清楚是什么原因，我将/common/lib加入到classpath后仍然找不到servlet等包，所以我采用了笨办法，将/common/lib下的这三个文件：servlet-api.jar，jsp-api.jar，jasper-runtime.jar都手动加到了classpath里面，就OK了~各位有没有更好的方法或者知道1不能成功的原因的，还望不吝赐教哦。</p>
<p>不知道您发现没有，我在写这篇博客的时候正在听林忆莲的《<a title=我坐在这里 href="http://music.cnnb.com.cn/music/l/林忆莲/最好的&#8230;林忆莲/林忆莲-我坐在这里.wma" target=_blank><u><font color=#0000ff>我坐在这里</font></u></a>》，一首很好听的，快节奏的歌，翻唱自Lene Martin的《<a title="Sitting down here" href="http://zxs.kdhrb.com/music/yingwen/may_it_be_sitting_down_here.mp3" target=_blank><u><font color=#0000ff>Sitting down here</font></u></a>》。我喜欢在工作的时候听歌，这里推荐给大家这两首:)。</p>
<p>接着我们会关注的是_jspService这个函数，这个函数源自javax.servlet.Servlet的HttpJSPPage，对于JSP/Servlet创建者，不用重新定义，只需要重载，如果是JSP创建的，那么重载的过程由JSP容器来完成了。这个函数大家可以把它看作是一个callback，由用户编写，但由系统来调用。</p>
<p>最后我们来看看那句在JSP里面的"out.println"在java代码里面再次出现了。out对实质是JSPWriter的实例，这个对象负责将字符串等等发送到客户端显示。</p>
<p>步骤3＆4不属于本文的范畴，不过我想在将来对这个部分做进一步的解释，因为我对JVM还蛮有兴趣的哦。</p>
<p>以上就是今天的分享，包括jsp到java文件的转换＆javax包的import方法。希望大家觉得有用。<br>PS:有朋友留言在第一篇，要求介绍一些其他的JSP容器，由于这个部分我目前只用过Tomcat，所以将在未来对其他的JSP容器有了使用经验再向大家介绍。</p>
<img src ="http://www.blogjava.net/tianlinux/aggbug/121249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianlinux/" target="_blank">tianlinux</a> 2007-05-31 21:28 <a href="http://www.blogjava.net/tianlinux/archive/2007/05/31/121249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏引擎脚本系统（一）</title><link>http://www.blogjava.net/tianlinux/archive/2007/05/30/121006.html</link><dc:creator>tianlinux</dc:creator><author>tianlinux</author><pubDate>Wed, 30 May 2007 14:07:00 GMT</pubDate><guid>http://www.blogjava.net/tianlinux/archive/2007/05/30/121006.html</guid><wfw:comment>http://www.blogjava.net/tianlinux/comments/121006.html</wfw:comment><comments>http://www.blogjava.net/tianlinux/archive/2007/05/30/121006.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tianlinux/comments/commentRss/121006.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianlinux/services/trackbacks/121006.html</trackback:ping><description><![CDATA[<p>今天开始进行新项目的预研，有关游戏引擎的脚本系统。之前自己对Python有所了解，但也仅仅限于应用层，如今要把一个脚本系统加入到游戏引擎里面，一时还有点不知道如何下手。赶紧上网查资料，逛了大半天的gamedev，现在总算有点眉目了。<br>首先要明确的是脚本系统在游戏引擎中扮演什么样的角色。 </p>
<p><strong>脚本系统的必要性</strong></p>
<p>游戏作为上层应用程序，是在游戏引擎的基础上运行的，现在游戏的发展趋势来看，游戏者（gamer）对游戏的可自我配置性有非常高的需求，特别是在游戏运行时的自我配置，已经不能通过简单的传参数来完成这种配置。所以，整个游戏的架构有分成两大块的发展趋势。一块是kernel，另一块是configuration。Kernel是游戏的基础类＆Object的集合，而configuration是针对特定的上层应用程序（游戏本身），对kernel的元素进行组织＆配置。脚本系统无疑将是configuration的重要组成部分。</p>
<p><strong>游戏引擎需要为脚本系统提供的接口</strong></p>
<p>我们把游戏中的物体（实例）称为object，把可以作用于object的函数叫action<br>1、保存全局变量＆局部变量<br>2、得到object(s)的引用<br>3、得到object(s)的属性，并调用object的action<br>4、提供timer进行周期性触发action&nbsp;<br>以上4点并不全面，但是却是最最基本需要支持的部分。如果需要更深入，应该还要提供对静态场景的配置、设置场景结束条件以及完善的Debug机制等等。&nbsp;</p>
<p><strong>游戏引擎不应该为脚本系统提供的接口</strong></p>
<p>1、画图&amp;播放声音等算法<br>2、内存管理<br>以上2点也并不全面，因为目前的项目没有网络方面的需求，所以没有考虑安全等因素进来。<br><strong>杂七杂八</strong></p>
<p>外设响应</p>
<p>我们把所有的gamer的输入都归纳为外设输入。那么在游戏引擎里面，对外设的响应应该是游戏实时反应能力的直接体现，在去年从事的游戏引擎项目中，采用了类似于windows消息队列的方式，对某种特定外设输入（比如：游戏手柄左键按下），挂上一个写死的函数。在脚本系统引入以后，应该不再挂上一个编译式语言编写的响应函数，而是调用脚本解释器来运行挂在这个外设上的脚本。<strong>所有外设都采用脚本来响应</strong>，这一思想是保证游戏可用户自我配置的关键之一。</p>
<p>冗余</p>
<p>脚本的性能总是令人头疼的。所以在引擎提供给脚本的接口当中（全面所述4点当然在内），不要害怕冗余的情况出现，而是要针对游戏开发者的需求，适当的增加引擎输出的功能，让游戏开发者在使用脚本的时候，能用将脚本写得尽量的简单。举例来讲：比如需要在某个时刻获得离主角最近的怪兽，如果只使用前面所提的4种接口，需要在脚本里面枚举出所有的怪兽，然后一一与主角的坐标进行距离计算，然后才能得到最近的一个怪兽。这是十分低效的。如果这一动作需要频繁发生，那么势必影响游戏的整体运行效率。解决办法就是在游戏引擎里面提供一个类似功能的API，由游戏引擎本身的开发语言（一般是编译式语言）来完成这项功能，而游戏开发者只需要在脚本里面调用这个API即可完成这项运算。如此做法在效率上应该比前面的做法要高出许多。</p>
<img src ="http://www.blogjava.net/tianlinux/aggbug/121006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianlinux/" target="_blank">tianlinux</a> 2007-05-30 22:07 <a href="http://www.blogjava.net/tianlinux/archive/2007/05/30/121006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP/Servlet学习笔记（一）——JSP容器</title><link>http://www.blogjava.net/tianlinux/archive/2007/05/29/JSP-Servlet.html</link><dc:creator>tianlinux</dc:creator><author>tianlinux</author><pubDate>Tue, 29 May 2007 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/tianlinux/archive/2007/05/29/JSP-Servlet.html</guid><wfw:comment>http://www.blogjava.net/tianlinux/comments/120767.html</wfw:comment><comments>http://www.blogjava.net/tianlinux/archive/2007/05/29/JSP-Servlet.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/tianlinux/comments/commentRss/120767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianlinux/services/trackbacks/120767.html</trackback:ping><description><![CDATA[出于工作＆兴趣，最近在学习研究jsp/servlet ，结合理论再编程实践，感觉学到的东西多而杂，需要好好梳理一下<wbr>，于是写下这篇心得，与大家一起分享。由于初涉java ，很多总结出的仅仅是经验或个人感受，加上第一次写技术博，紧张得流汗，谬误难免，欢迎大家多多指教。我的联系方式是：tianlinux at gmail dot com 。MSN 帐号：tianlinx at hotmail dot com 。 我假设了您已经熟悉基本的java 语法，并且对Web 应用程序的概念也有基本的了解了。我还假设了您的计算机已经安装了JDK1.4以上，如果还没有装，就到sun的官网去下载吧，或者google一下，应该很好找到的。当您准备好这一切，我们就可以开始一起学习JSP/Servlet了。
<p>&nbsp;</p>
<p>JSP/Servlet 的关系 </p>
<p>JSP ＆Servlet 属于java web 层的技术，作用都是用来实现动态网页。JSP 主要面向的是网页设计人员，Servlet 主要面向的是程序设计人员。无论你采用两者中哪一种单一的技术<wbr>，你都可以解决所有动态网页呈现的问题。从运行方式上讲，JSP 事实上需要转译为Servlet 才能运行，所以，有一种说法说它们是"一面两体"，这是很恰当的。Servlet 从本质上讲，就是java 程序片段。 </p>
<p>&nbsp;</p>
<p>JSP/Servlet 容器 </p>
<p>既然 Servlet是 java程序片段，那么它当然是不能直接运行的，必须把它放到某种运行环境<wbr>当中，它才能发挥它的作用。这个环境就是我们讲的"容器"<wbr>。容器也是 java 程序，它的主要功能除了为Servlet 提供运行环境，还有更重要的，就是提供网络传输协议与java 程序实体的相互转换。为什么需要这种转换呢？因为Web 应用程序是分布式的，客户端和服务器端之间需要交换数据<wbr>，就要通过网络，并在一定的通讯协议下进行。最常见和常用的协议是HTTP 。客户端向服务器发送数据，遵循的是HTTP 协议的数据格式，服务器向客户端发送数据也是遵循HTTP协议的。在客户端和服务器端，可能存在着不同的编程语言编写的程序，比如java，C++等等。各种语言都有自己用于处理HTTP协议数据的方法（类），为了使用java提供的各种HTTP处理相关的类，必须将HTTP协议下的数据做一定的转换，转换成一些java object，这样才能使用java的方法进行数据处理。同理，当这些处理完成，又需要将这些java object转换回HTTP协议下的数据，反馈给客户端（JSP/Servlet当然存在与服务器端）。JSP/Servlet容器就扮演了完成这个双向转换的角色。至于JSP/Servlet容器为java程序片段提供运行环境的细节，我们在后面再讨论这个问题。<br>我用的JSP/Servlet容器是Tomcat 5.5.12。这里给大家一个google上找到的链接，下载源比较稳定。<a href="http://leshui.clwind.com/Download/apache-tomcat-5.5.12.exe">http://leshui.clwind.com/Download/apache-tomcat-5.5.12.exe</a>。<br><span style="FONT-SIZE: 12pt">下载完成后，即可安装。<br>安装过程没有太大问题，中间有步需要输入一个管理员密码，自己随便设吧，这里我们只是针对学习，不针对商业应用，所以设个傻瓜密码也无所谓。这个密码在你配置服务器的时候会用到。</span> </p>
<p><img height=393 alt="" src="http://www.blogjava.net/images/blogjava_net/tianlinux/setpwd.JPG" width=503 border=0 longDesc=设定登录密码></p>
<p>完成了Tomcat的安装，您马上就可以启动您自己的服务器了，^_^，如果以前没有做过，有点紧张吧。<br>在启动以前，让我们先打开web浏览器，输入：<a href="http://localhost:8080/">http://localhost:8080</a>，回车，看到了什么？&#8220;该页无法显示&#8221;一类的显示吧，呵呵，不要急，马上给您一个惊喜。<br>很简单：开始-&gt;程序-&gt;Apache Tomcat 5.5-&gt;configure tomcat。会看到下面那个对话框：</p>
<p><img height=399 alt="" src="http://www.blogjava.net/images/blogjava_net/tianlinux/startserver.JPG" width=416 border=0 longDesc=启动服务器></p>
<p>为了快点体验到自己建服务器的快感，我们不做任何设置，先点了Start再说吧，等待启动完成。好了，现在您的计算机已经作为服务器启动了。刚才那个&#8220;该页无法显示&#8221;呢？刷新一下试试。如果您在左上角看到那只黄猫，您的服务器就已经启动了！</p>
<p>在这个网页的左边，Administration里面，有Tomcat Manager的链接，点击它，会弹出一个输入用户和密码的对话框，输入刚才安装的时候的帐号密码。默认帐号是admin，密码。。。不会就忘了吧:)。</p>
<p>进入了Manager的页面了吗？好了，您可以浏览一下这个网页的内容，在Applications这个列表里面，列出了在当前服务器上可以浏览的所有路径。您可以随意浏览一下，里面如果有一些jsp的例子您现在无法理解，没有关系，我们现在先抛开它。今天要做的最后一件事就是在这个服务器上建立自己的一个web文件夹，以后我们将在这个文件夹中部署我们自己的写的小web应用程序（JSP/Servlet）。目前列表中的所有路径，都是在Tomcat的安装路径下，/webapp/xxx下面。</p>
<p>好了，言归正传，我们现在来建自己的文件夹，并发布到服务器上。在您的本地硬盘上任意地新建一个文件夹，并任意命名。我这里以D:/webapp/为例子。我想把这个文件夹作为我的webapp文件夹，并且在服务器上，这个文件夹的名字叫"tianlinux"。在刚才那个manager的页面下面，Deploy栏，里面Context Path (optional): 填上"/tianlinux"（不要引号！），在WAR or Directory URL:填上"file:d:/webapp"，然后点击"Deploy"，好了，看这个网页的最上面Message栏，是否已经显示"OK - Deployed application at context path /tianlinux"？好了，现在在Applications列表里面也有/tianlinux这个子项了。点击它，会跳转到directories list的页面。当然，现在这个文件夹里面没有任何的文件和文件夹，怪可怜的，新建一个txt文档，改名为：hello.jsp，在里面添加如下一句代码<br></p>
<div><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&lt;%&nbsp;out.println("Hello,&nbsp;JSP/Servlet");&nbsp;%&gt;</div>
<p><br>保存，关闭。这时你需要reload一下这个文件夹，就在Applications的列表里就有链接~或者干脆把/tianlinux文件夹Undeploy，再重新deploy一次也可以。<br>访问：<a href="http://localhost:8080/tianlinux/hello.jsp">http://localhost:8080/tianlinux/hello.jsp</a>。如果显示出"Hello, JSP/Servlet"，今天就打完收工了。。。第一次写，好累。如果没有搞定。。。给我留言或写信吧。</p>
<p>&nbsp;</p>
<p>下期：JSP基础。</p>
<img src ="http://www.blogjava.net/tianlinux/aggbug/120767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianlinux/" target="_blank">tianlinux</a> 2007-05-29 22:58 <a href="http://www.blogjava.net/tianlinux/archive/2007/05/29/JSP-Servlet.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>