原本的打算是在第二篇介绍JSP的基本语法,逛了一些坛子,这类的文章实在是太多了。就在blogjava里面,都有博友正在推出系列的讲座。我一一翻阅过,所以觉得这里应该讲一些他们没有讲到的地方。如果您还不了解JSP的语法,并且对这个部分比较关注,您可以去alecwen的博客 看看,那里有alecwen博友有关JSP基本语法&用法的文章,比较简洁实用。
选择什么样的题材来写第二篇呢?我在第一篇里面有提到“JSP需要经过转译成servlet”,那干脆就在这里讲讲这个转译过程。对于网页设计人员来说,这个部分的知识比较多余,也不适合没有程序设计基础的人看,对于程序设计人员来说,应该可以加深您对JSP&Servlet的理解,最最重要的,我认为有了这个部分的知识,可以方便你进行JSP的相关调试。从我现在的经验来讲,在不借助于大型的IDE的情况下(只为学习目的的话,我是不喜欢用大型IDE的,比如Netbean,Eclipse等等,一是太占资源,偶的本本跑起比较慢:(;二是对于新手往往会在太多的菜单选项里面迷失方向,甚至花很大精力在建立工程、添加\删除工程文件等等事情上,难以专注于要学习的东西),JSP的调试是比较难的。虽然运行方式非常的简单,您只需要在浏览器地址栏输入您发布的jsp文件路径,回车即可测试,但如果JSP包含有错误(包括编译式错误&运行时异常),都会输出一堆看不太懂的调用堆栈。堆栈里面往往会提及xxx.java文件的xxx行,但对于JSP开发来说,看不到这些文件,甚至不知道有这些文件的存在。所以,大多数情况下,JSP里面是不提倡写太过复杂的java代码的。
好了,正式开始研究JSP到Servlet的转换过程。接着上篇讲的例子。在/webapp/hello.jsp(http://localhost:8080/tianlinux/hello.jsp)里边有如下的代码:
1<% out.println("Hello, JSP/Servlet") %>
简单的,只有一句代码。我们在初学java的时候,写一个hello world应该都远远不止这点代码,里面一定有文章。并且,您发现了吗:第一次访问hello.jsp,浏览器停顿了一下下,才显示出了"Hello, JSP/Servlet"这句话,后面再次访问,就不会再停顿了。是的,这正是因为第一次访问jsp的时候,JSP有个转译的过程。这个过程包括以下几个步骤:
1、根据jsp文件生成java文件;
2、调用编译器对java文件进行编译;
3、如果编译通过,载入JVM运行;
4、将执行结果返回。
我们先看第一个步骤。由jsp转化而成的java文件在什么位置呢?我们在Tomcat的安装目录下搜索一下,比如刚才的hello.jap,%tomcat%表示tomcat的安装目录,则在如下的路径%tomcat%\work\Catalina\localhost\tianlinux\org\apache\jsp\找到了hello_jsp.java文件。打开看看。这里我们偏偏题,看看大家一般用什么文本编辑器?不要告诉我说您写一个简单的java文件都要用IDE哦,也不要告诉我您还在使用寒碜的notepad哦^_^,我推荐使用notepad++。功能跟UltraEdit基本类似,但UE是付费的(虽然在伟大的祖国,基本上没有需要真正付费的,但谁知道这种天堂般的日子什么时候会到头呢?),notepad++是完全免费的,并且加入了sourceforge,遵从GPL,作者是台湾人侯今吾,侯工可是学法国文学出生的哦~。在台湾企业工作了2年多,跟很多台湾籍工程师有所接触,别的不说,感觉在敬业精神&技术能力上,大陆工程师还是普遍落后于海峡那边的同胞的,这跟受到的教育&经济水平是有直接联系的。扯远了,反正为了一句话,为了民族xxx产业,为了实现自我xxx,也为了大把的银子,大家一起努力了~。好了,打开那个hello_jsp.java了吗?我们看到如下的代码:
1package org.apache.jsp;
2
3import javax.servlet.*;
4import javax.servlet.http.*;
5import javax.servlet.jsp.*;
6
7public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
8 implements org.apache.jasper.runtime.JspSourceDependent {
9
10 private static java.util.List _jspx_dependants;
11
12 public Object getDependants() {
13 return _jspx_dependants;
14 }
15
16 public void _jspService(HttpServletRequest request, HttpServletResponse response)
17 throws java.io.IOException, ServletException {
18
19 JspFactory _jspxFactory = null;
20 PageContext pageContext = null;
21 HttpSession session = null;
22 ServletContext application = null;
23 ServletConfig config = null;
24 JspWriter out = null;
25 Object page = this;
26 JspWriter _jspx_out = null;
27 PageContext _jspx_page_context = null;
28
29
30 try {
31 _jspxFactory = JspFactory.getDefaultFactory();
32 response.setContentType("text/html");
33 pageContext = _jspxFactory.getPageContext(this, request, response,
34 null, true, 8192, true);
35 _jspx_page_context = pageContext;
36 application = pageContext.getServletContext();
37 config = pageContext.getServletConfig();
38 session = pageContext.getSession();
39 out = pageContext.getOut();
40 _jspx_out = out;
41
42 out.println("Hello, JSP/Servlet");
43 } catch (Throwable t) {
44 if (!(t instanceof SkipPageException)){
45 out = _jspx_out;
46 if (out != null && out.getBufferSize() != 0)
47 out.clearBuffer();
48 if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
49 }
50 } finally {
51 if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
52 }
53 }
54}
55
56
以目前的情况,我们并没有必要把代码一句一句的都去搞懂。因为大部分的代码所有jsp文件转换出来都是相同,是JSP容器已经设定好的。所以我们只关注其中的部分。
首先是import语句组。这里import了javax.servlet,注意这个包并不是JDK里面默认包含的包,所以现在如果在cmd里面输入javac hello_jsp.java(当然要在这个文件的路径下输入!)可能会出现下面的画面
出现了找不到javax.servlet这个包的情况,我的机机上就是这种情况。怎么办呢?赶紧google一下解决办法。
1、在环境变量设置里面找到classpath,然后把%tomcat%/common/lib添加进去。注意Tomcat的版本更新十分频繁,如果版本不是5.5.12,可能文件名或者路径稍有不同,请注意变通。还有需要提醒的是,完成环境变量的设置以后,需要重新开启cmd哦。
2、运气好的GGMM现在已经可以正确编译了吧^_^,但偶不是。目前没有搞清楚是什么原因,我将/common/lib加入到classpath后仍然找不到servlet等包,所以我采用了笨办法,将/common/lib下的这三个文件:servlet-api.jar,jsp-api.jar,jasper-runtime.jar都手动加到了classpath里面,就OK了~各位有没有更好的方法或者知道1不能成功的原因的,还望不吝赐教哦。
不知道您发现没有,我在写这篇博客的时候正在听林忆莲的《我坐在这里》,一首很好听的,快节奏的歌,翻唱自Lene Martin的《Sitting down here》。我喜欢在工作的时候听歌,这里推荐给大家这两首:)。
接着我们会关注的是_jspService这个函数,这个函数源自javax.servlet.Servlet的HttpJSPPage,对于JSP/Servlet创建者,不用重新定义,只需要重载,如果是JSP创建的,那么重载的过程由JSP容器来完成了。这个函数大家可以把它看作是一个callback,由用户编写,但由系统来调用。
最后我们来看看那句在JSP里面的"out.println"在java代码里面再次出现了。out对实质是JSPWriter的实例,这个对象负责将字符串等等发送到客户端显示。
步骤3&4不属于本文的范畴,不过我想在将来对这个部分做进一步的解释,因为我对JVM还蛮有兴趣的哦。
以上就是今天的分享,包括jsp到java文件的转换&javax包的import方法。希望大家觉得有用。
PS:有朋友留言在第一篇,要求介绍一些其他的JSP容器,由于这个部分我目前只用过Tomcat,所以将在未来对其他的JSP容器有了使用经验再向大家介绍。
posted on 2007-05-31 21:28
tianlinux 阅读(1155)
评论(4) 编辑 收藏 所属分类:
JSP/Servlet