JSP概览

JSP是Java Server Page的缩写,是Servlet的简化。由Sun公司提出的且许多公司共同参与制定的一种动态网页标准。

表现层主要技术有:FreeMaker、Velocity、Tapestry、JSP等(不承担业务逻辑组件及持久层组件的责任)。

1. JSP工作原理

当服务器上的一个JSP页面被第一次请求执行时,服务器上的JSP引擎先将JSP页面文件转换成为一个Java文件,在转换时如果发现jsp文件有任何语法错误,转换过程将中断,并向服务端和客户端输出出错信息;如果转换成功, JSP引擎用javac把该Java源文件编译成相应的字节码class文件,然后执行字节码文件响应客户的请求。而当这个JSP页面再次被请求执行时,JSP引擎将直接执行字节码文件来响应用户。

当多个线程请求一个JSP页面时,服务器为每个用户启动一个线程,该线程负责执行常驻内存的字节码文件来响应相应客户的请求。这些线程由web服务器来管理,将CPU的使用权在各个线程之间快速切换,以保证每个线程都有机会执行字节码文件,这与传统的CGI为每个用户启动一个进程相比较,效率要高的多。

如果对JSP页面进行了修改、保存,那么web服务器会生成新的字节码文件,并覆盖原来的字节码文件。

2. 一个JSP页面可由5种元素组合构成:

普通的HTML标记、JSP标记,如指令标记和动作标记、变量和方法的声明<%! %>、Java程序片<% %>、Java表达式<%= %>

3. 字节码文件的主要工作有以下几个方面:

把JSP页面中的HTML标记符号(页面的静态部分)交给用户的浏览器负责显示
负责处理JSP标记、数据的方法的声明、Java程序片(JSP页面中的动态部分),并将有关的处理结果发送到用户的浏览器
计算Java表达式,并将结果转化为字符串,然后把执行结果交给用户的浏览器负责显示

4. 在“<%!”和“%>”标记符号之间声明变量和方法

变量的类型可以是Java语言允许的任何数据类型,声明的变量在整个JSP页面内都有效,并且与放置的位置无关,但习惯将标记符号<%! %>写在Java程序片的前面。JSP引擎将JSP页面转译成Java文件时,将<%! %>之间声明的变量作为类的成员变量,这些变量的内存空间直到服务器关闭时才被释放(方法内定义的变量只在方法内有效,方法被调用时分配内存,调用完毕即释放所占的内存)。多个用户请求一个JSP页面时,JSP引擎为每个用户启动一个线程,这些线程共享JSP页面的成员变量,任何一个用户对成员变量的修改都会影响到其他用户。

5.  在“<%”和“%>”标记符号之间插入程序片

一个JSP页面可以有许多程序片,这些程序片将被JSP引擎按顺序执行。在程序片中声明的变量称作JSP页面的局部变量,局部变量的有效范围与其声明的位置有关,即局部变量在JSP页面的后继的所有程序片及表达式部分内都有效。多个用户访问一个JSP页面时,该JSP页面中的Java程序片将被运行多次,分别运行在不同的线程中,互不干扰。当一个线程将程序片执行完毕,运行在该线程中的Java程序片中的局部变量释放所占的内存。

6. 在“<%=”和“%>”标记符号之间插入一个表达式

不可插入语句,这个表达式必须能求值。表达式的值由服务器负责计算,并将计算结果以字符串的形式发送到客户端显示。

7. JSP中的注释:

<!--注释内容-->为HTML注释,用户通过浏览器查看JSP源文件时能够看到HTML注释。
<%--注释内容--%>为JSP注释,JSP引擎在编译JSP页面时忽略JSP注释。
这说明JSP注释不会被发送到客户端。

8. JSP的3个指令标记:page、include、taglib

一般JSP指令用标签<%@…%>表示,JSP指令包括page、include和taglib。page指令是针对当前页面的指令,而include指令用来指定如何包含另外一个文件,taglib指令用来定义和访问自定义标记库。这三种指令通常都有默认值,这样开发人员就不必显式的使用每一个指令予以确认。

page指令:page指令对整个页面都有效,与其书写的位置无关,但习惯把page指令写在JSP页面的最前面。如:

<%@ page language="java" contentType=”text/html;charset=GB2312” import=”java.util.*,java.io.*,java.awt.*” session=“true” buffer="8kb" autoFlush="true" isThreadSafe="true" info="information" errorPage="/error.jsp" isErrorPage="false" isELIgnored="false"%>

language:定义JSP页面所使用的脚本语言,该属性的值目前只能取java。

contentType:设置jsp网页输出时数据时所使用的字符压缩方式,以及所使用的字符集,此属性的默认值为”text/html;charset=ISO-8859-1”。contentType属性指定的值有:

text/html、text/plain、image/gif、image/x-xbitmap、image/jpeg、image/pjpeg、application/x-shockwave-flash、application/vnd.ms-powerpoint、application/vnd.ms-excel、application/msword等。

import:指令是所有page指令中,唯一可以多次设置的指令,而且累加每个设置。它用来指定jsp网页中所需要使用到的一些类。import属性默认已有如下的值:

java.lang.*、javax.serlvet.*、javax.servlet.jsp.*、javax.servlet.http.*。

session:用于设置是否使用内置的session对象,默认为true。

buffer:用来设置指定out设置的缓冲区的大小或不使用缓冲区(值为none),默认大小为8kb。

autoFlush:指定out的缓冲区被填满时,缓冲区是否自动刷新,默认为true。当设置成false时,如果out的缓冲区被填满,就会出现缓存溢出异常。当buffer的值为none时,就不能设置成false。

isThreadSafe:用来设置JSP页面是否可以多线程访问,默认为true。当设置成false时,同一时刻只能响应一个用户的请求,其他用户需排除等待。

info:设置页面的文本信息,可以通过Servlet.getServletInfo()的方法获得该字符串。

errorPage:定义指向另一个JSP页面的URL。当页面出现一个没有被捕获的异常时,错误信息将以throw语句抛出,而被设置为错误信息网页的JSP页面,将利用exception隐含对象,取得错误信息。默认没有错误处理页面。

isErrorPage:设置此jsp网页是否为错误处理页面。默认值为”false”。当设置为”true”时,JSP页面将可存取隐含的exception对象,并通过该对象取得从发生错误之网页所传出的错误信息。取得错误信息的语法如下:<% =exception.getMessage()%>

isELIgnored:用以设定JSP网页中是否忽略Expression Language,默认是false,如果设定为true,则Expression Language将会被转译。

include指令:

使用include指令可以在JSP页面出现该指令的位置处插入一个静态文件,与原页面合并成一个新的JSP文件,然后再编译整个文件,必须保证新合成的JSP页面符合JSP语法规则。使用include指令可以实现代码的复用,有助于实现JSP页面的模块化。

<%@ include file=”header.inc”%>

taglib指令:首先要在WEB-INF/tags文件目录下建立xxx.tag文件,tag文件的结构与JSP文件一样,可以被JPS页面动态加载调用,但是用户不能通过该Tag文件所在的Web服务目录直接访问这个Tag文件,可实现代码复用。注意,在Tag中<%! %>标记符号之间声明的变量与JSP中<%! %>之间声明的变量类似,其有效范围是整个Tag文件,但每当Tag文件对应的字节码被执行完毕后,这些变量即可释放所占用的内存空间。

 <%@ taglib uri/tagdir="/WEB-INF/tags自定义标记库的位置" prefix="前缀" %>

<Tag: 文件名字/>

[ 标记体 ]   <!-- 在Tag文件中通过使用<jsp:doBody/>引用标记体传递来的信息 -->

<Tag: 文件名字/>

Tag标记中常用的指令有:tag、taglib、include、attribute、variable

<%@ tag body-content="empty" language="java" import="java.lang.*" pageEncoding="ISO-8859-1" />

body-content:确定JSP页面使用Tag标记时是否可以有标记体,如果允许有标记体,则该属性会给出标记体内的类型,值有:empty(没有标记体)、tagdependent(标记体的内容按纯文本处理)、scriptless(默认,标记体内不能有Java程序片)。

language:指定Tag文件所使用的脚本语言,该属性的值目前只能取java。

import:同JSP的page指令的import属性。

pageEncoding:指定Tag文件的字符编码,默认为ISO-8859-1。

<%@ taglib uri/tagdir="/WEB-INF/tags自定义标记库的位置" prefix="前缀" %>

<%@ include file=”header.inc”%>

<%@ attribute name="xxxx" required="true | false" type="对象的类型" %>

在Tag文件中通过使用attribute指令,可以动态地向该Tag文件传递需要的数据,对象的类型必须带有包名,默认为java.lang.String;name为<Tag 文件名字 对象名字="对象的引用"/>中的对象名字。

<@% variable name-given="对象名字" variable-class="对象的类型" scope="有效范围" %>

jspContext.setAttribute("对象名字", "value");

通过使用variable指令Tag文件可以将数据的处理结果存放在某些对象中,并将这些对象返回给当前JSP页面,由JSP页面负责显示这些对象,可以更好地实现数据处理和数据显示分离。对象的类型必须带有包名,默认为java.lang.String;scope的值可以取:AT_BEGIN、NESTED、AT_END,说明JSP页面可以在Tag标记的标记体中及结束后、标记体中、结束后使用该variable指令给出的对象。注意,JSP页面中不可以再定义与Tag文件返回的对象具有相同名字的变量。

Tag标记的嵌套:当使用Tag标记时可以带有标记体,而且标记体还可以是一个Tag标记。Tag标记中标记体由Tag文件是<jsp:doBody/>标记负责处理,而在Tag文件中,<jsp:doBody/>标记被替换成处理"标记体"后所得到的结果。

9. JSP的7种动作标记:forward, param, include, plugin,userBean, setProperty, getProperty

include动作标记:动态加载一个文件,与静态插件文件的inclue指令不同,当JSP引擎把JSP页面转译成Java文件时,不把JSP页面中的动作指令所指定的文件与原JSP页面合并为一个新的JSP页面,而是告诉Java解释器,这个文件在JSP运行时才被处理。

<jsp:include page="文件的URL"flush="true"

[ <param name="属性" value="值"/> ]

</jsp:include>

静态导入与动态导入区别

①静态导入是将被导入页面的代码完全融入,合成一个Servlet,而动态导入是在Servlet中使用include方法来引入被导入页面的内容

②静态导入时被导入页面的编译指令会起作用,而动态导入时被导入页面的编译指令则失去作用,只是插入被导入页面的body内容

③动态导入还可增加额外的请求参数

param动作标记: 与include、、forward、plugin标记一起使用,用来传参数,通过内置对象request调用getParameter("xxx')方法获取参数。

<param name="属性" value="值"/> 

forward动作标记:从该指令处停止当前页面的继续执行,而转向执行page属性指定的JSP页面,地址栏用户请求的URL不变。

<jsp:forward page="要转向的页面" >

[ <param name="属性" value="值"/> ]

</jsp:forward >

plugin动作标记:指示JSP页面加载Java Plugin插件,并使用该插件来运行Java Applet小应用程序。

<jsp:plugin type="bean | applet" 

code="小应用程序的字节码文件" 

codebase="被执行文件所在的目录"

name=”instanceName”      给该程序起一个名字用来标识该程序

archive=”URLToArchive”    指向一些要预先载入的将要使用到的类的路径

align=”bottom|top|middle|left|right” 

width="小程序的宽度" 

height="小程序的高度"

hspace=”leftRightPixels”      显示左右的留白

vspace=”topBottomPixels”     显示上下的留白

jreversion="java虚拟机的版本号" 

nspluginurl=”URLToPlugin”      浏览器下载运行所需JRE的地址

iepluginurl=”URLToPlugin”      浏览器下载运行所需JRE的地址> 

<jsp:param name="xxx" value="xxx"> </jsp:params>

<jsp:fallback>提示信息:用来提示用户的浏览器是否支持插件下载</jsp:fallback> 

</jsp:plugin>

useBean、setProperty、getProperty动作标记:在JSP页面中使用bean,scope有取值有page、request、session、application,分别代表当前页面、每个请求期间、用户的会话期间(浏览器未关闭)、web目录下的所有JSP页面共享一个bean。

<jsp:useBean id="bean的id" class="创建bean的类" scope="bean的有效范围"/>

<jsp:setProperty name=”BeanName” property=”PName”value=”value”/>

<jsp:getProperty name=” BeanName” property=” PName”/>
10. JSP的9个内置对象:application, config,exception,out, page, pageContext, request, response, session

















 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章