posts - 4,comments - 15,trackbacks - 0

原本的打算是在第二篇介绍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         nulltrue8192true);
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 阅读(1149) 评论(4)  编辑  收藏 所属分类: JSP/Servlet

FeedBack:
# re: JSP-Servlet学习笔记(二)——JSP到Servlet
2007-05-31 22:05 | java夜未眠
写的听好,挺喜欢,加油  回复  更多评论
  
# re: JSP-Servlet学习笔记(二)——JSP到Servlet
2007-06-11 19:12 | 凌宇清辉♂毐
比较细节,提到一些其他讲座或者教程没有提到的东西,这些对实践来说还是很重要的,赞一个。  回复  更多评论
  
# re: JSP-Servlet学习笔记(二)——JSP到Servlet
2009-02-19 23:57 | 饭粒
很好啊,又懂了一点,我是一个没有学过JAVA的人。
谢谢  回复  更多评论
  
# re: JSP-Servlet学习笔记(二)——JSP到Servlet
2009-02-20 00:00 | 饭粒
怎么没有了呢,我还想再看看呢,真是吊人胃口...
你写的很好,我希望还能看你的大作。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: