天天看点

JSP技术基础

一、JSP简介

JSP(Java Server Pages)是基于Java Servlet和整个Java体系的Web服务器端开发技术

JSP网页是在传统的HTML文件里加入JSP标记或Java程序片段构成的,以

.jsp

作为扩展名。

当一个JSP页面第一次被访问时,JSP引擎将执行以下步骤:

  1. 将JSP页面翻译成一个Servelet,这个Servelet时一个Java文件,同时也是一个完整的Java程序
  2. JSP引擎调用Java编译器对这个Servelet进行编译,得到字节码文件class
  3. JSP引擎调用Java虚拟机来解释执行class,主要调用

    _jspService

    方法

以上三个步骤仅在JSP页面第一次被访问时才会全部执行,以后访问不再创建新的Servelet,只是新开一个服务线程。

JSP 页面由两部分组成:一部分是 JSP 页面的静态部分,如 HTML,CSS 标记等,常用 来完成数据显示和样式。另一部分是 JSP 页面的动态部分,如脚本程序,JSP 标记等

JSP技术基础

二、JSP标准语法

JSP技术基础
JSP技术基础

JSP注释

JSP 程序中的的注释包括两种:

  • 一种是 HTML 注释,语法格式:

    <!--这是 HTML 注释,在客户端源代码中可查看 -->

  • 另一种是 JSP 注释,语法格式:

    <%--这是 JSP 注释,在客户端源代码中不可见--%>

JSP 注释不会发给浏览器,在客户端完全不可见,JSP 程序注释的作用是供程序员阅 读程序做注解的。

JSP 声明

JSP 声明用于声明变量和方法,相当于对应的 Servlet 类的成员变量或成员方法。这 样定义的变量或方法的作用域属于网页层,在 JSP 整个网页中都能够使用这些声明过的变 量或方法。

JSP 声明变量或方法的语法为:

<%! Java 变量或方法; %>

在 JSP 声明中声明的变量,相当于 static 变量,如果定义的 int 变量不赋初 值,则其初值默认为 0。如果同时打开多个浏览器向该 JSP 页面发请求,或在不同的机器 上打开浏览器来请求这个 JSP 页面,将发现所有客户端访问该 JSP 中的 count 值是连续的, 即所有客户端共享的是同一个 count 变量

下面是用新窗口打开的同一个jsp文件

JSP技术基础
JSP技术基础

在 JSP 声明部分

<%! %>

定义内的变量和方法是类的全局变量和方法, 也就是类的成员变量和成员方法,该变量在创建对应的 Servlet 实例时被初始化,且一直 有效,直到实例销毁。声明在 JSP 代码段

<% %>

内的变量是

_jspService()

方 法内部的变量,即局部变量。

JSP表达式

JSP 表达式就是一个符合 Java 语法的表达式,JSP 表达式是直接把 Java 表达式的值 作为字符串输出。

JSP 表达式的语法形式如下所示:

<%=Java 表达式%>

注意:不能用分号

来作为表达式的结束符。

JSP程序段

JSP 程序段实际上就是嵌入在页面中的 Java 代码,也称 JSP 代码段,JSP 程序段的具 体语法格式如下:

<% Java 代码段 %>

在 JSP 声明中定义的变量和在 JSP 程序段中所定义的变量对应着相应的 servlet 类的 全局变量和局部变量.

这种区别对于用户的具体体验是:在 JSP 声明中定义的变量只初始 化一次,且在所有运行这个 JSP 程序代码的线程中共享该全局变量;而在 JSP 程序段中定 义的变量,为 sevlet 类中的

_ jspService()

方法里的局部变量,局部变量不能使用 private 等访问控制符修饰,也不可使用 static 修饰,在每次新的请求线程产生的时候, 它都会重新创建和重新初始化。

JSP代码段里不能定义方法,由于JSP代码转换成

_ jspService()

里的可执行代码,Java 语法不允许在 方法里定义方法,所以 JSP 代码段里也不能定义方法

JSP与HTML的混合使用

HTML 代码 主要是用于页面的外观组织与显示,如显示字体的大小、颜色、定义表格、是否换行、显 示图片、插入链接等。Java 代码主要用于业务逻辑的处理,如对数据库的操作、数值的 计算等,同时,也可以通过将 HTML 嵌入到 Java 的循环和选择语句中来控制 HTML 的显示

三、JSP编译指令

JSP编译指令的作用是设置 JSP 程序和由该 JSP 程序 编译所生成的 Servlet 程序的属性,它不直接生成输出,而只是告诉引擎如何处理 JSP 页面中的某些部分。

基本语法格式:

<%@ 编译指令名 属性名="属性值" %>

例如:

<%@ page contentType="text/html;charset=utf-8"%>

注意:属性名部分是大小写敏感的,在目前的 JSP 2.0 中,定义了 page、include 和 taglib 这三种指令,每种指令中又都定义了一些各自的属性。

page编译指令

page 指令用来设置整个 JSP 页面的相关属性和功能。包括:指定 JSP 脚本语言的种类、导入的包或类、指定页面编码的字符集等。

基本语法:

<%@ page 属性 1=“属性值 1” 属性 2=“属性值 2” 属性 3=“属性值 3” … %>

要在一个 JSP 页面中设置同一条指令的多个属性,可以使用多条指令语句单独设 置每个属性,也可以使用同一条指令语句设置该指令的多个属性。两种方式如下:

第一种(常用)

<%@ page contentType="text/html; charset=gb2312" import="java.util.Date"%>

第二种:

<%@ page contentType="text/html;charset=gb2312"%>

<%@ page import="java.util.Date"%>

使用 page 指令要注意以下几点:

(1)<%@page %>指令作用于整个 JSP 页面,包括静态的包含文件(用<%@include %>指令调用), 但不包括用指令指定的动态包含文件,因为动态包含时,实际上仍是两个独立运行的 Servlet 文件,而静态包含实际上是将两个 JSP 文件合并为一个 Servlet。

(2)除了 import 属性之外,其他的属性都只能用一次。

(3)无论把<%@page %>指令放在 JSP 的文件的哪个地方,它的作用范围都是整个 JSP 页面。不过, 为了 JSP 程序的可读性,最好还是把它放在 JSP 文件的顶部。

JSP技术基础
JSP技术基础

include编译指令

include 编译指令用于通知 JSP 引擎在翻译当前 JSP 页面时将其他文件中的内容与当 前 JSP 页面合并,转换成一个 Servlet 源文件。 这种在编译阶段进行整合处理的合并操 作称为静态包含。

基本语法:

<%@ include file=“relative URL” %>

file 属性是需要引用的 HTML 页面或 JSP 页面的相对路径。如果 file 属性的设置路 径以“/”开头,表示相对于当前 WEB 应用程序的根目录而不是站点根目录。

引入文件与被引入文件是在被 JSP 引擎翻译成 Servlet 的过程中进行合并,而不是先 合并源文件后再对合并的结果进行翻译,除了 import 和 pageEncoding 属性之外,page 指令的其他属性不能在这两个页面中有不同的设置值。

除了指令元素之外,被引入的文件中的其他元素都被转换成相应的 Java 源代码,然 后插入进当前 JSP 页面所翻译成的 Servlet 源文件中,插入位置与 include 指令在当前 JSP 页面中的位置保持一致。

include 指令通常用来包含网站中经常出现的重复性页面。

taglib编译指令

<%@ taglib %>

指令定义一个标记库以及自定义标记的前缀,以便在页面中使用基本 标记或自定义标记来完成指定的功能

tablib 指令的格式为:

<%@ tablib uri=“taglibURI” prefix=“tagPrefix” %>

其中属性含义如下:

  • uri:唯一地指定标记库的绝对 URI 或相对 URI,URI 用于定位这个标记库资源的 位置。
  • prefix:指标记库的识别符,用以区别用户的自定义动作。

四、JSP动作指令

JSP 动作指令主要是一组动态执行的指令,以标记的形式使用。

与编译指令不同,动作指令是运行时的脚本动作。

JSP技术基础

forward动作指令

<jsp:forward page=“relativeURL”/>

动作的作用是实现服务器端的页面跳转,即 从当前页面转发到另一个页面,可以转发到静态的 HTML 页面,也可以转发到动态的 JSP 页面,或者转发到容器中的 servlet。

语法形式一:

<jsp:forward page="{relativeURL│<%=expression%>}"/>

语法形式二:

<jsp:forward page="{relativeURL│<%=expression%>}"/> 
<jsp:param name="parameterName" value=" {parameterValue│<%=expression%>}"/> 
</jsp:forward> 
           

page 属性包含的是目标文件的相对 URL,指定了要转发的目标文件的路径。可用

<jsp:param>

设置参数。

jsp:forward 动作从当前页面转发到另一个页面时,实际完成的还是同一个请求,因此在转发过程中 request 对象在新的页面中也是有效的,这种跳转方式也称为服务器跳转。

jsp:forward

动作常被用在用户登录验证中。

include动作指令

动作指令标记用于把另外一个资源的输出内容插入进当前 JSP 页面的 输出内容之中,实际上是把指定页面的 servlet 所生成的应答内容插入到本页面相应位 置。

这种在 JSP 页面执行时的引入方式称之为动态引入。动作指令涉及到 的 2 个 JSP 页面会被翻译成 2 个 servlet,这 2 个 servlet 的内容在执行时进行合并。

指令格式一:

<jsp:include page="{relativeURL│<%=expression%>}" flush="true"/>

指令格式二:

<jsp:include page="{relativeURL│<%=expression%>}" flush="true"> 
 <jsp:param name="parameterName" value="patameterValue"/> 
 </jsp:include>``
           

其中

  • page:指定需要包含的文件的相对路径或绝对路径。
  • flush 属性指定在插入其他资源的输出内容时,是否先将当前 JSP 页面的已输出 的内容刷新到客户端。必须设置 flush=“true”。
服务器端页面缓冲的意思是,在将生成的 HTML 代码送到客户端前,先在服务器端内 存中保留,因为解释 JSP 或 Servlet 变成 HTML 是一步步进行的,可以在服务器端生成完 HTML 或生成一部分 HTML(所占用字节数已达到指定的缓冲字节数)后再送到客户。如果 不缓冲,就会解释生成一句 HTML 就向客户端送一句。在 jsp:include 语句中,必须设置 flush=“true”,表示如果包含进来的页面有变化,本页面也随之刷新。如果其值被设置 为“false”,可能会导致意外错误。

<%include%>

<jsp:include>

的区别:

include 编译指令是在 JSP 程序被 翻译为 Servlet 程序的时期就先将 file 属性所指定的程序内容“合并”到当前的 JSP 程 序中,使嵌入的文件与主文件成为一个整体,然后进行编译。而动作指令 中 page 所指定的文件只有在客户端请求时期才会被单独进行编译和载入,动态地与主文 件合并起来输出。如果被嵌入的文件经常改变的话,建议使用动作指令。 动作

<jsp:include>

也可与动作

<jsp:param>

一起使用,用来向被包含的页面传递参 数。

plugin 动作指令

<jsp:plugin>

动作指令动态的下载服务器端的 JavaBean 或者 Java Applet 程序到客 户端的浏览器上执行。当 JSP 页面被编译并响应至浏览器执行时,会根据浏 览器的版本替换成或标记。

plugin 的基本语法如下:

<jsp:plugin 属性 1=“值 1” 属性 2=“值 2” 属性 3=“值 3”…>
           
JSP技术基础

param动作指令

<jsp:param>

经常和

<jsp:include>

<jsp:forward>

以及

<jsp:plugin>

一起使用,用于页面间的参数信息传递。

基本语法:

<jsp:param name=“parameterName” value=“parameterValue”>
           

其中 name 属性就是参数的名称,value 属性就是参数值。这个参数值存放在页面间 进行传递的数据。

相对基准地址

如果链接操作语句中提供的是相对 URL,则最终目标 URL 的生成方法是:

最终目标 URL = JSP 页面相对基准 URL 地址 + 语句中的相对 URL
           

页面相对基准 URL 地址的设定分如下两种情况:

(1)通过标记设定的,即通过标记, 将本 JSP 页面中的相对基准 URL 地址设为“basePathURL”。这样固定后,本 JSP 页面中的 所有链接均以此相对基准 URL 地址为基准点,再与链接语句中的相对 URL“合成”,得到 最终的目标 URL 地址。一般的 JSP 页面通过如下语句将工程项目路径设为页面相对基准路径。

<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+ 
request.getServerPort()+path+"/"; 
%> 
<base href="<%=basePath%>" target="_blank" rel="external nofollow" >
           

(2)在 JSP 程序中没有使用标记设定页面相对基准 URL 地址,这种情况 下,页面中链接操作的相对基准地址就不固定了,而是以当前的 JSP 页面的 URL 地址作为 本页面中链接语句的相对基准地址。

超链接中表示的相对路径与 DOS 系统的相对路径概念一致,它们的含义总结如下:

  • “ / ” 表 示 Web 服 务 的 根 路 径 , 这 里 的 Web 服 务 根 路 径 为 “ http://localhost:8080/ ”, 本 例 中 , 如 果 链 接 写 成

    “ <a href="\ch04\index.html" target="_blank" rel="external nofollow" >”

    , 则 合 成 后 的 目 标 URL 将 为 “http://localhost:8080/ch04/index.html”,运行时将会出现找不到目标文件 的 HTTP404 类型错误;
  • “./”表示当前 JSP 页面使用的相对基准 URL 路径,要特别注意 JSP 页面中是否通过设定过相对基准 URL,对于当前 JSP 页面的相对基准 URL 路径一般会有较大不同,使用不当,往往会找不到目标资源。
  • “…/”表示当前 JSP 页面使用的相对基准 URL 路径的上一级路径。

五、JSP的隐含对象

JSP的内置对象是指在JSP页面系统中已经默认内置的Java对线,这些对象不需要开发人员显示声明即可使用。

JSP的九个内置对象

JSP技术基础
JSP技术基础

JSP内置对象作用域

内置对象的作用域指:指每个内置对象在多长的时间和多大的范围内有效,也即 在什么样的范围内可以有效地访问同一个对象实例。这些作用域正好对应 JSP 的四个内置 对象 page、request、session 和 application 的生命周期。

request里面存放的数据的生命周期 仅是一次请求的时间;session里面存放的数据的生命周期较长;application里面存放的数据生命周期最长,从服务器启动到服务器关闭为 止。Page仅在一个 JSP 页面中有效,它的作 用范围最小或生命周期最短。

JSP 内置对象生命周期原理图 :

JSP技术基础
有一个容易产生的错误理解,就是认为关闭浏览器就关闭了 session。正是由于 关闭浏览器并不等于关闭了 session,才会出现设置 session 有效时间的解决方法。
  • out对象

    out 对象是 javax.servlet.jsp.JspWriter 类的实例,主要作用是用来向客户端输出 内容,同时管理应用服务器输出缓冲区。

  • page 对象

page 对象代表 JSP 页面本身,或者说它代表了被转换后的 Servlet。因此它可以调用 任何被 Servlet 类所定义的方法。在 JSP 页面的 JSP 程序段以及 JSP 表达式中可以使用 page 对象。

在 JSP 页面中,this 关键字表示当前 JSP 页面这个对象,可以调用的常见方法如下

JSP技术基础
  • request 对象

    客户端的 请求信息被封装在 request 对象中,通过它才能了解到客户的需求,然后做出响应。

    request对象常见方法

    JSP技术基础
    JSP技术基础

    在 request 对象的方法中,比较常用的有 getParameter()和 getParameterValues() 二个方法。

    getParameter()方法可以获取客户端提交页面中的某一个控件的值,这个函数的返回 值是一个 String 对象,如:文本框、单选按钮、下拉列表框等。

    getParameterValues()方法可以获取客户端提交页面中的一组控件的值,返回值是一 个 String 数组。

  • response 对象

    response 对象是 javax.servlet.http.httpServletResponse 接口的实例,是服务器 对 request 对象请求的回应,负责向客户端发送数据。

    通过调用 resposne 对象的方法还 可以获得服务器端的相关信息,如状态行、head 和信息体等。其中状态行包括使用的协 议和状态码,head 包含关于服务器和返回的文档的消息,如服务名称和文档类型等。

    使用 response 对象的 sendRedirect()方法,可向服务器发送一个重新定向的请求。 当用它转到另外一个面页时,相当于从客户端重新发出了另一个请求,重定向后在浏览器 地址栏上会出现重定向后页面的 URL,这种跳转属于客户端跳转,服务器会为此重新生成 另一个 request 对象,所以原来的 request 参数转到新页面之后就失效了。需要注意的是, 此语句之后的其他语句仍然会继续执行。因此,为了避免错误,往往会在此方法后使用 “return”中止其他语句的执行。

    JSP技术基础
  • session对象

    HTTP 协议本 身是无状态,无状态是指协议对于事务处理没有记忆能力,HTTP 无状态的特性严重阻 碍了 WEB 应用程序的实现,毕竟交互是需要承前启后的。

    session 对象的管理细节如下:

    (1)新客户端向服务器第一次发送请求的时候,request 中并无 sessionidID 。

    (2)此时,服务器端会创建一个 session 对象,并分配一个 sessionID,serssion 对象会保存在服务器端。此时 session 对象的状态处于 new state 状态,如果调用 session.isNew()方法,则返回 true。

    (3)服务器端处理完毕后,将此 sessionID 随同 response 一起传回到客户端,并将 其存入到客户端的 cookie 对象中。

    (4)当客户端再次发送请求时,会将 sessionID 同 request 一起传送给服务器。

    (5)服务器根据传递过来的 sessionID,将与该请求与保存在服务器端的 session 对象进行关联,此时,服务器上的 session 对象已再不处于 new state 状态,如果调用 session.isNew(),则返回 false。

    session 对象生成后,只要用户继续访问,服务器就会更新 session 对象中的该客户 的最后访问时间信息,并维护该 session 对象。也就是,用户每访问服务器一次,无论是 否读写 session 对象,服务器都认为该用户的 session 对象“活跃(active)”了一次。

    由于浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器不会有机 会知道浏览器是否已经关闭。因此,服务器为 session 设置了一个失效时间,当距离客户 上一次“活跃时间”超过了这个失效时间时,服务器就可以认为客户端已经停止了活动, 就会把 session 删除以节省存储空间。JSP 程序一般都是在用户做 logoff 的时候,使用 session.invalidate()方法去删除 session 对象。

    JSP技术基础
    JSP技术基础
    void invalidate() 使该 Session 立即失效,原来会话中存储的所有对象都不能再被访 问。 Tomcat 中 Session 的默认超时时间为 30 分钟。可以通过修改 tomcat→conf→ conf/web.xm 中的,修改默认超时时间,单位为分钟,例如修改默认超 时时间为 60 分钟:
    <session-config> 
    <session-timeout>60</session-timeout> <!-- 单位:分钟 --> 
    </session-config> 
               
  • application对象

    application 对象是在 Web 服务器启动时由服务器自动创建的,它的生命周期是 JSP 所有隐含对象中最长的,一旦创建了 application 对象,那么这个 application 对象将会 永远保持下去,直到服务器关闭为止。正是由于 application 对象的这个特性,我们可以 将要在多个用户中共享的数据放在 application 对象中,如当前的在线人数的统计,实现 聊天室的功能等。

    JSP技术基础
    JSP技术基础
  • config 对象

    config 对象中存储着一些 servlet 初始的数据结构,它跟 page 对象一样,很少被用 到。config 对象实现了 javax.servlet.ServletConfig 接口,如果在 web.xml 文件中, 针对某个 Servlet 文件或 JSP 文件设置了初始化参数,则可以通过 config 对象来获取这 些 初 始 化 参 数 。 config 对 象 提 供 了 两 个 方 法 来 获 取 Servlet 初 始 参 数 值 : config.getInitParamenterNames()、config.getInitParamenter (String name)。

    JSP技术基础
  • exception 对象

    当 JSP 页面发生错误时,会产生异常。exception 对象就是用来针对异常作出相应处 理的对象。

    JSP技术基础
  • pageContext 对象

    pageContext 能够存取其他内置对象,当内置对象包括属性时,pageContext 也支持 对这些属性的读取和写入。

    JSP技术基础
    JSP技术基础

    pageContext 对 象 在 使 用 Object getAttribute(String name, int scope) 、 Enumeration getAttributeNamesInScope(int scope)、void removeAttribute(String name, int scope)、void setAttribute(String name, Object value, int scope)这些 方法时,需要指定作用范围。

    范围的指定就使用 JSP 内置对象的 4 个作用域范围参数:PAGE_SCOPE 代表 Page 范围, REQUEST_SCOPE 代 表 Request 范 围 , SESSION_SCOPE 代 表 Session 范 围 , APPLICATION_SCOPE 代表 Application 范围。

  • Cookie 对象

    Cookie 对象虽然不是 JSP 的内置对象,使用时需要显 式创建该对象,但 JSP 设计时也经常使用 Cookie 技术来实现一些特殊功能。

    Cookie 是 WEB 服务器通过浏览器在客户机的硬盘上存储的一小段文本,用来记录用 户登录的用户名、密码、登录时间等信息。当用户下次再次登录此网站时,浏览器根据用 户输入的网址,在本地寻找是否存在与该网址匹配的 Cookie,如果有,则将该 Cookie 和 请求参数一起发送给服务器做处理,实现各种各样的个性化服务。

    JSP 可通过 Cookie向已注册用户提供某些专门的服务,比如通过 Cookie 技术手段, 让网站“记住”那些曾经登录过的用户,实现自动登录。利用 Cookie 实现用户自动登录 的思路是:当用户第一次登录网站的时候,网站向客户端发送一个包含有用户名的 Cookie,当用户在之后的某个时候再次访问,浏览器就会向网站服务器回送这个 Cookie, 于是,JSP 可以从这个 Cookie 中读取到用户名,从而实现自动为用户登录。