分享

JSP 的技术原理

 后飞的鸟 2010-11-08

JSP 的技术原理
JSP 的注释和声明
JSP 脚本
JSP 的三个编译指令
JSP 的七个处理指令
JSP 的九个内置对象
Servlet 介绍
到自定义标签开发
使用Filter
使用Li stener
到JSP 2.0 的新特性

JSP是 JavaServerPage 的缩写,是Servlet 的简化。它是由Sun 公司提出的,并由许多公司参与制定的一种动态网页标准。其主要特点是在HTML 页面中加入Java代码片段,或者使用各种JSP标签,包括使用用户标签,构成JSP 网页。早期使用 JSP 页面的用户非常广泛,一个Web应用可以全部由JSP 页面组成,只辅以少量的 JavaBean 即可。自 J2EE 标准出现以后,人们逐渐认识到使用JSP充当过多的角色是不合适的Q 因此, JSP 慢慢发展成学一的表现层技术,不再承担业务逻辑组件及持久层组件的责任。

虽然有各种模板技术,但JSP还是最经典、应用最广的表现层技术c

2.1 JSP 的技术原理

JSP 是 Servlet 的扩展,在没有 JSP 之前,就已经出现了 Servlet 技术。 Servlet 是利用输出流动态生成 HTML 页面,包括每一个 HTML 标签和每个在 HTML 页面中出现的内容。

由于包括大量的 HTML 标签、大量的静态文本及格式等,导致 Servlet 的开发效率极为低下。所有的表现逻辑,包括布局、色彩及图像等,都必须糯合在Java 代码中,这的确让人不胜其烦。 JSP 的出现弥补了这种不足, JSP 通过在标准的 HTML 页面中插入Java 代码,其静态的部分无须 Java 程序控制,只有那些需要从数据库读取并根据程序动态生成信息时,才使用 Java 脚本控制。

从表面上看, JSP 页面已经不再需要 Java 类,似乎完全脱离了 Java 面向对象的特征。事实上, JSP 是 Servlet 的一种特殊形式,每个 JSP 页面就是一个 Se凹let 实例一-JSP 页面由系统编译成 Servlet, Se凹let 再负责响应用户请求。 JSP 其实也是 Se凹let 的一种简化,使用 JSP 时,其实还是使用 Se凹let,因为 Web 应用中的每个 JSP 页面都会由 Se凹let 容器生成对应的 Servlet。对于 Tomcat 而言, JSP 页面生成的 Se凹let 放在 work 路径对应的Web 应用下。

看下面一个简单的 JSP 页面:


〈%for(inti = 0 ; i < 10; i++)
{
out.print1n(i) ;
%>
〈%}%〉

当启动 Tomcat之后,可以在Tomcat 的 Catalina\localhost\jsptest'飞org飞apache\jsp 目录下找到如下文件(假如Web应用名为jsptest,上面JSP页的名为test1扣p):test1.jsp.java和 testtjsp.class。这两个文件都是Tomcat 生成的, Tomcat根据 JSP 页面生成对应 Servlet的 Java文件及 class 文件。

下面是 test1.jsp.java文件的源代码,这是一个特殊的Java类,是一个 Serlet类:

//JSP 页面经过 Tomcat 编译后默认的包
package org.apache.jsp;
import javax.serv1et.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
//继承 HttpJspBase类,该类其实是个Servlet的子类
public final class testl_jsp extends org.apache.
jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent
private staticjava.utiI.Vector_jspx_dependants;
public java.util.List getDependants() {
return _jspx_dependants;
}
//用于响应用户的方法
publicvoid_jspService(HttpServletRequestrequest,
HttpServletResponse response)
throws java.io.IOException, ServletException
//获得页面输出流
JspFactory_j 日pxFactory= null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
//获得页面输出流
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx-page_context = null;
//开始生成响应
try
_jspxFactory = JspFactory.getDefaultFactory();
//设置输出的页面格式
response.setContentType("text/html; charset=gb2312");
pageContext = _jspxFactory.getPageContext(this, request,
response, null, true, 8192, true);
_jspx-page_context = pageContext;
application = pageContext.getServletContext();
config =pageContext.getServletConfig();
session= pageContext.getSession();
//页面输出流
out =pageCo口text.getOut();
_jspx_out = out;
//输出流,开始输出页面文裆
out.write("\r\nil) i
//下面输出 HTML 标签
out.write("4.0TransitionalllEN\">\r\nil) ;
out.write(" \r\丑n);
out.write(" \r\nn) ;
out.write("\r\n") ;
out.write("\r\nil) ;
out.write("\r\nil} ;
//页面中的循环,在此处循环输出
for(int i = 0 ; i < 10; i++)
out.println(i);
out.write("\r\n") ;
out.write ("
\r\n");
out.write("\r\n");
out.write("c/BODY>\r\n);
out.write("c/HTML>\r\n");
out.write ("\r\n");
}
catch (Throwable t)
{
if(!(t instanceof SkipPageExceptio口))
{
out=_jspx_out;
if (out !=null&& out.getBufferSize()!=0)out.clearBuffer() ;
if (_jspx-page_context!=null)_jspx-page_context.
handlePageException(t);
}
finally
If(_jspxFactory != null)_jspxFactory.releasePageContext(_jspx_
page_context) ;]
}
}

即使读者不了解上面提供的 Java 代码,也依然不会影响 JSP 页面的编写,因为这都是由 Web 容器负责生成的。图 2.1 显示了 testl.jsp 的执行效果。

根据图 2.1 的执行效果,再次对比 test1.jsp 和test1-.isp扣va 文件,可得到一个结论:该 JSP 页面中的每个字符都由 test1-.isp.java 文件的输出流生成。图 2.2 显示了 JSP 页面的i作原理。

 
图 2.1 testl.jsp的执行效果

根据上面的 JSP 页面i作原理图,可以得到如下四个结论:

JSP文件必须在 JSP服务器内运行。

JSP 文件必须生成 Serlet才能执行。

每个 JSP 页面的第一个访问者速度很慢,因为必须等待 JSP编译成 Serleta

 
图 2.2 JSP 页面的i作原理

JSP 页面的访问者无须安装任何客户端,甚至不需要可以运行 Java 的运行环境,因为 JSP 页面输送到客户端的是标准 HTML 页面。JSP 的出现,大大提高了 Java 动态网站的开发效率,曾一度风靡 JavaWeb 应用开发者。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多