JSP入门——第4章JSP技术入门
来源:互联网 发布:web数据挖掘 微盘 编辑:程序博客网 时间:2024/05/06 02:50
第4章JSP技术入门
王开锋 wangkf05AT163.com
本将将通过一个简单的实例使读者对JSP技术有一个初步的认识,并对JSP的执行机制有所了解。具体而言,本章包含如下内容:
l JSP技术概述
l 一个简单的JSP程序
l JSP的执行机制
4.1 JSP技术概述
JSP(JavaServer Pages)是SUN公司在推出Java程序设计语言与Servlet技术之后,另外推出的一种动态网页制作技术。JSP是基于java语言的一种脚本技术,它提供了一种简单快速的方法来创建、显示带有动态内容的Web 页面。
简单的说一个JSP页面包含了两部分内容:一是以任何基于文本格式表述的静态数据,如HTML、XML等;二是包含动态内容的JSP元素。JSP源文件的扩展名一般为.jsp。JSP技术具有Java程序设计语言的许多优点,与其它动态网页技术相比,JSP具有如下优点:
l 平台无关性
由于JSP技术所依靠的是Java语言,而Java语言的一个显著特点就是“平台无关性”,这也就决定了JSP技术也具有良好的平台无关性,这也是JSP的一大优越性。
l 内容与显示的分离
开发人员可以使用HTML或者XML等语言来设计显示页面,而页面上的动态内容(根据请求而变化的内容)通过使用JSP标识或者脚本来生成。生成动态内容的部分被封装在Servlet和JavaBean组件中,并且结合在脚本中,所有的脚本在服务器端运行。
l 组件的重用
JSP技术强调了组件的重用。JSP页面充分利用了可重用的组件(JavaBean、EJB)来处理较为复杂的过程。组件重用加速了Web程序的开发。
l 可扩充性
通过使用JavaBean,可以使JSP程序具有更强大的功能。
4.2 第一个JSP页面
本节将给出第一个JSP页面,它的主要功能是显示出当前的日期、月份和年份,并且根据当前的时间,动态选择显示“Good morning”或者“Good afternoon”。虽然这个JSP页面非常简单,但是能够很好的反映出一个最基本的JSP页面是如何工作的。
这个JSP页面的源程序如例程4-1所示:
例程4-1 first.jsp
<!--
这是我们的第一个JSP程序,它的主要功能是现实当前的日期.
-->
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>我的第一个JSP页面</title>
</head>
<body>
<h2>我的第一个JSP页面</h2><hr>
<b>Today is: </b><p/>
<%!
int getDate(){
return Calendar.getInstance().get(Calendar.DATE);
}
int getMonth(){
return Calendar.getInstance().get(Calendar.MONTH)+1;
}
int getYear(){
return Calendar.getInstance().get(Calendar.YEAR);
}
%>
Date: <%=getDate() %><br>
Month: <%=getMonth() %><br>
Year: <%=getYear() %><p/>
<%if(Calendar.getInstance().get(Calendar.AM_PM)==Calendar.AM){ %>
Good morning
<%} else {%>
Good afternoon
<%} %>
<body>
</html>
该页面在经过JSP引擎编译执行后,在浏览器中实现的效果如下所示:
图4-1第一个JSP页面
这个JSP程序由以下结构组成:
注释:
本程序的前面几行由“<!-- -->”包裹的部分是程序的注释,在源程序中添加恰当的注释是良好的编程习惯。当然注释不是越多越好,当程序非常简单,不加注释也不影响可读性。但是对于比较复杂的程序,由必要在恰当的地方添加正确、简明的注释。
JSP指令:
JSP指令可以将信息传送到JSP引擎。本例中的第一行和第二行,就是使用JSP的page指令,定义了contextType属性和import属性。
函数声明:
“<%!”和“ %>”之间的部分是JSP的声明部分。在本例中,声明了3个函数,分别获取当前的日期、月份和年份。
表达式:
JSP引擎用来输出在“<%=”和“ %>”之间的代码运行结果。本例中,通过使用表达式,来显示函数运行的结果。
scriptlet:
在“<%”和“ %>”之间的代码,它是一个或多个Java语句的集合,它是JSP页面中最常见的元素。
本例比较简单,主要是通过对JSP组件的简单运用,使读者对于 JSP有一个直观的概念,更多的内容将在后面的章节中详细介绍。
4.4 JSP的执行机制
JSP文件不能由浏览器直接运行,而需由web服务器解释执行。当一个JSP文件第一次被请求时,JSP引擎首先把JSP文件转换为一个java源文件,转换成功后,JSP引擎调用将java源文件编译成class文件,这个class文件就是一个Servlet程序,最后执行这个Servlet,响应用户的请求。这种转换只在JSP页面第一次被执行或JSP页面的内容发生改变时进行,因此JSP页面第一次执行时速度往往比较慢。所有这些操作都在服务器端执行,网络上传送给客户端的仅是得到的结果。JSP的工作模式可以用下面的图来描述:
图3-2 JSP的工作模式
参照第一个JSP页面,可以看出一个JSP页面通常由静态模版数据(一般为HTML)何JSP元素组成,后者可以分为一下三种:
l 伪指令(如page、include等)
l 脚本元素(包括声明、表达式、scriptlet)
l 动作(<jsp:useBean>等)
当HTTP客户端向某一个JSP页面发送请求时,JSP引擎将检查.jsp文件和编译声称的.class文件,如果.java文件不存在或比.jsp文件已经发生修改,JSP引擎将重新将其转换为servlet并编译他。转换的原则如下:
l 伪指令转化的时候并不声称代码,而是向JSP引擎提供转换时的信息。
l 声明(包括变量声明、函数声明)被原封不动的复制到_jspService( )方法之外,作为servlet类的成员变量或成员函数。例如,在第一个JSP页面中声明了getDate( )、getMonth( )、getYear( )三个函数,这三个函数被原封不动的转化为servlet的成员函数。
l 静态模版数据依照其出现的顺序被逐行的转化到out.print( )语句中作为参数,如<html>被转化为“out.write("<html>\r\n");”。
l JSP表达式依照其出现的顺序被逐行的转化到out.print( )语句中作为参数,如<%=getDate() %>表达式被转化为“out.print(getDate() );”。
l Scriptlet被原封不动的转化到_jspService( )方法中。
l JSP动作被转换成执行其功能的运行时逻辑。
JSP页面最终都要编译成servlet文件,但是servlet文件的位置及名字等信息依赖于特定的服务器。以Tomcat5.0为例,对于第一个JSP文件,它经过编译后生成的.java文件及.class可以在<install_dir>\work\Catalina\localhost下找到。源程序如例程4-2所示:
例程4-2 first_jsp.java
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
public final class first_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
int getDate(){
return Calendar.getInstance().get(Calendar.DATE);
}
int getMonth(){
return Calendar.getInstance().get(Calendar.MONTH);
}
int getYear(){
return Calendar.getInstance().get(Calendar.YEAR);
}
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants() {
return _jspx_dependants;
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = 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 = pageContext.getOut();
_jspx_out = out;
out.write("<!-- \r\n");
out.write(" 这是我们的第一个JSP程序,它的主要功能是现实当前的日期.\r\n");
out.write(" -->\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write(" <title>我的第一个JSP页面</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write(" <h2>我的第一个JSP页面</h2><hr>\r\n");
out.write(" <b>Today is: </b><p/> \r\n");
out.write(" ");
out.write("\r\n");
out.write(" Date: ");
out.print(getDate() );
out.write("<br>\r\n");
out.write(" Month: ");
out.print(getMonth() );
out.write("<br>\r\n");
out.write(" Year: ");
out.print(getYear() );
out.write("<p/>\r\n");
out.write(" ");
if(Calendar.getInstance().get(Calendar.AM_PM)==Calendar.AM){
out.write("\r\n");
out.write(" Good morning\r\n");
out.write(" ");
} else {
out.write("\r\n");
out.write(" Good afternoon\r\n");
out.write(" ");
}
out.write(" \r\n");
out.write("<body>\r\n");
out.write("</html>\r\n");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
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);
}
}
}
4.5 小结
本章通过实例,首先让读者对JSP有一个直观的感受,而后以这个实例为基础讲解了JSP的工作模式,使得读者对JSP的认识逐渐深入。本章只是对JSP技术简要的介绍,本书的后续章节,将配合大量的实例对JSP进行深入的讲解。
- JSP入门——第4章JSP技术入门
- JSP技术入门——第5章 JSP运行及开发环境
- JSP入门——第1章 Web应用入门
- JavaWeb入门实战—JSP技术
- JSP入门——第2章 HTML语言
- JSP入门——第3章 JavaScript
- J2ee技术:JSP入门
- JSP技术入门
- JSP技术入门
- Jsp入门第一章——什么是Jsp
- Jsp入门第三章——Jsp的隐藏对象
- jsp入门
- JSP入门
- JSP入门
- jsp入门
- JSP入门
- JSP入门
- JSP入门
- sql教程一
- 給Mac OSX 终端窗口添加色彩(Colorful terminal)
- poj 1177 Picture
- 在Windows下,如何遍历某目录里所有文件?
- 在Windows环境下安装BMC Remedy Action Request Server
- JSP入门——第4章JSP技术入门
- tomcat 热发布
- 如何让png格式图片在ie6下正常显示
- sql教程二
- 快速排序
- Objective C2.0学习(一)
- BMC Remedy AR在Web页面中弹出窗口的大小的控制
- Objective C2.0学习(二 类,对象和方法)
- JavaScript与Remedy表单