JSP详解

JSP语法概述

与其他语言一样,jsp也具有严格定义的语法并包含完成各种任务的语法元素,一般来说,在jsp页面中可以包含的元素如下:

  • 声明:标签语法:<%!  Java声明 %>,声明是用来在JSP页面中声明变量和定义方法的,标签中可以包含任意数量的合法(以分号结束)的Java声明语句,声明的变量仅在页面第一次载入时由服务器初始化一次,初始化后在后面的请求中一直保持该值。
  • JSP小脚本:标签语法:<%Java代码 %>,小脚本是嵌入在jsp页面中的java代码段,通常用来在jsp页面中嵌入计算逻辑,标签中的代码必须是合法的java代码。
  • 表达式:标签语法:<%=表达式 %>,它作为java语言表达式的占位符,可以向输出流输出任何对象或任何基本数据类型的值,也可以打印任何算术表达式,布尔表达式或者方法调用的返回的值。注意:表达式不能以分好结束。
  • 指令:标签语法:<%@指令 %>,指令向容器提供关于jsp页面的总体信息。指令有三种类型:page指令、include指令和taglib指令。

page指令:<%@page attribute-list %>,通知关于JSP页面的总体特性,例如<%@pagecontentType="text/html;charset=gb2312" %>

include 指令: <%@include attribute-lists %>, include 指令实现把另一个文件的内容包含到当前页面中, 例如 <%@ include file="head.html" %>
taglib指令:<%@taglib attribute-lists %>,taglib指令用来在页面中使用标准标签或者用户的自定义标,例如:<%@ taglib uri="/WEB-INF/mytaglib.tld"prefex="demo" %>

  • 动作:标签语法:<jsp:动作名>,页面发送给服务器的命令,指示服务器在执行页面期间完成某种任务。在jsp页面中可以使用三种动作:jsp标准动作,标准标签库中的动作,用户自定义的动作。
  • EL表达式:${applicationScope.email},EL表达式语言是jsp2.0新增加的特性,它是一种可以在JSP页面中使用的简洁的数据访问语言,它以$开头,后面是一对大括号{},括号里面是合法的EL表达式。
  • 注释:<%--要注释的内容 --%>,注释不影响JSP页面的输出,但对代码的文档化很有作用。
  • 模版文本:HTML规则


JSP页面的生存周期


2.1 两个概念

在讨论jsp页面的生命周期之前,需要弄清楚以下两个概念

1.JSP页面也是Servlet

尽管JSP页面从结构上看类似于HTML,但是实际上是作为Servlet来运行的,当JSP页面被访问时,容器解析JSP文件并转换成相应的Java文件,该文件声明一个Servlet类,其他成员直接映射到JSP文件的元素上。

2.理解转换单元

当一个JSP页面中通过include指令包含多个其他文件时,容器在为当前页面产生Java代码时,它也把被包含的文件的内容插入到产生的Servlet中。这些被转换成单servlet类的页面集合称之为转化单元。注:page指令影响整个转换单元。

2.2 JSP生命周期阶段

1.创建Servlet实例:对页面解析并创建一个包含ServletJava源文件。在这个阶段,容器需要检查jsp页面所使用的标签的语法,如果发现错误,将不能转换

2.页面编译:对java源文件进行编译。在编译阶段,容器将检查在声明中、小脚本以及表达式中所写的全部java代码

3.加载类:将编译后的类加载到容器中去

4.创建实例:创建一个Servlet实例

5.调用jspinit()方法:调用其他方法之前调用该方法初始化。对每个Servlet而言,该方法只调用一次

6.调用_jspService()方法:对每个请求调用一次该方法。JSP页面中的所有HTML元素、jsp小脚本以及jsp表达式在转换阶段都成为该方法的一部分。

7.调用jspDestory()方法:当Servlet容器决定停止Servlet服务时调用该方法。

JSP进阶

理解页面转换过程:JSP页面生命周期的第一阶段是页面转换,容器根据下面规则将JSP页面转换成Servlet:

  • 有些指令转换为java代码,例如page指令的import属性,有些指令仅仅通知容器关于页面的总体性质,例如page值session属性等
  • 所有的JSP声明都变成Servlet类的一部分,他们被原样拷贝。正因为这个原因,所以jsp申明中变量和方法的顺序无关紧要,
  • 所有的小脚本都变为_jspService()方法的一部分,小脚本中声明的变量变为_jspService()方法的局部变量。这也是为什么不能在小脚本中声明方法的原因。这也决定了在小脚本中声明的变量具有顺序关系,否则编译阶段报错。
  • 所有的jsp表达式都成为_jspService()方法的一部分,表达式的值使用out.print()语句输出。
  • 所有的jsp动作都通过调用针对的类来替换。
  • 所有的EL表达式通过计算后使用out.write()语句输出。
  • 所有的模版文本都成为_jspService()方法的一部分,模版内容使用out.write()语句输出。
  • 所有的JSP注释都被忽略。

JSP隐式对象


jsp页面的转换阶段,容器在_jspService()方法中声明并初始化一些变量,可以在jsp小脚本或者表达式中直接使用这些变量,这些变量总共有九个,也称为九大隐式对象,如下所示:

------------------------------------------------------------------------------------------------------------------------------------------

隐式变量                            类或者接口                                                                         说明

-----------------------------------------------------------------------------------------------------------------------------------------

application                       javax.servlet.ServletContext接口                           引用Web应用程序上下文

session                            javax.servlet.http.HttpSession接口                       引用用户会话

request                            javax.servlet.http.HttpServletRequest接口        引用页面的当前请求对象

response                          javax.servlet.http.HttpServletResponse接口      引用向客户发送一个响应

out                                     javax.servlet.jsp.JspWriter                                   引用页面输出流

page                                java.lang.Object                                                    引用页面的Servlet实例

pageContext                   javax.servlet.jsp.PageContext                            引用页面上下文

config                             javax.servlet.ServletConfig接口                             引用Servlet的配置对象

exception                         java.lang.Throwable                                             用来处理错误

----------------------------------------------------------------------------------------------------------------------------------------

4.1 requestresponse变量

requestresponse分别是HttpServletRequestHttpServletResponse类型的隐式变量,当页面的Sevlet向客户提供服务时,它们作为参传递给_jspService()方法。在jsp中使用它们与在Servlet中使用完全一样,即用来分析请求和发送响应。

4.2 out变量

outjavax.servlet.jsp.JspWriter类型的隐含变量,JspWriter类扩展了java.io.Writer并继承了所有重载的write()方法,在此基础上,还增加了自己的一组print()println()方法来打印输出所有的基本数据类型,字符串以及用户定义的对象。

4.3application变量

application javax.servlet.ServletContext类型的隐式变量,它是jsp所在页面的Web应用程序的上下文引用。

4.4 Session变量

sessionjsp页面中表示会话的对象。要使用会话对象,必须要求page指令的session属性为true,由于session属性的默认值true,所以一般不设置,如果设置session属性值为false则容器不会声明该变量,对该变量的引用也将产生错误。

4.5 pageContext变量

pageContext对象是javax.servlet.jsp.PageContext类型的隐式变量,是一个页面上下文对象。pageContext类是一个抽象类,主要有以下三个作用:

  • 存储隐式对象的引用:pageContext对象是作为管理所有在JSP页面中使用的其他对象的一个地方,包括用户定义的和隐式的象,并且提供一个访问方法来检索它们。
  • 提供了在不同作用域内返回或设置属性的简便方法。
  • 提供了forword()方法和include()方法实现将请求转发到另一个资源和将一个资源的输出包含到当前页面中的功能。

4.6 page变量

page变量是java.lang.Object类型的对象,声明如下:Object page = this;它指的是生成的Servlet实例,该变量很少被使用

4.7config变量

configjavax.servlet.ServletConfig类型的隐式变量,可以通过在DD文件中为Servlet传递一组初始化参数,这些参数在JSP页面中可以使用config隐式变量来检索。

4.8exception变量

exceptionjava.lang.Throwable类型的隐式变量,他被用来作为其它页面的错误处理器。为使页面能够使用exception变量,必须在页面的page指令中将isErrorPage的属性值设置true,<%@ page isErrorPage="true"%>,该变量指向使用该页面作为错误处理器的页面抛出的未捕获的java.lang.Throwable对象。注:isErrorPage的默认值为false,要使用exception变量,必须显示的指定。

理解作用域


jsp页面中,存在四种作用域,所有的隐式对象以及用户定义的对象都处于这四种作用域之一,四种作用域如下所示,

--------------------------------------------------------------------------------------------------------------------------------

作用域                                    对应的对象                              存在性和可访问性

--------------------------------------------------------------------------------------------------------------------------------

应用作用域                             application                                在整个web应用程序有效

会话作用域                             session                                       在整个会话范围内有效

请求作用域                             request                                      在用户的请求和转发的请求内有效

页面作用域                             pageContext                             只有当前的页面(转换单元)内有效

-------------------------------------------------------------------------------------------------------------------------------

5.1 应用作用域

属于应用作用域的对象可以被Web应用程序的所有组件共享并在应用程序生命周期内都可以访问。这些对象是ServletContext接口的一个实例作为属性/值对维护的。在JSP页面中,该实例可以通过隐式对象application访问。因此,要在应用程序共享数据,可以使用ServletContext接口的setAttribute()方法和getAttribute()方法。

5.2 会话作用域

属于会话作用域的对象可以被属于一个用户会话的所有请求共享并只在会话有效时才可以被访问。这些对象是通过HttpSession类的一个实例作为属性/值对维护的。在JSP页面中,该实例可以通过隐式对象session访问。因此,要在会话级共享对象数据,可以使用HttpSession接口的setAttribute()方法和getAttribute()方法。

5.3 请求作用域

属于请求作用域的对象可以被处理同一个请求的所有组件共享并仅在该请求被服务期间可被访问。这些对象是由HttpServletRequest接口的一个实例作为属性/值对维护的。在jsp页面中,该实例是通过隐式对象request的形式被使用的。因此,可以在一个页面中向request对象中添加属性并将请求转发到另外一个页面,第二个页面可以检索这些属性产生的响应。

5.4 页面作用域

属于页面作用域的对象只能在它们定义的转换单元中被访问。他们不能存在于一个转换单元的单个请求处理之外。这些对象是PageContext抽象类的一个具体子类的一个实例通过属性/值对维护的。在jsp页面中,该实例可以通过隐式变量pageContext访问。为在页面作用域中共享对象,可以使用setAttribute()方法和getAttribute()方法。

PageContext类中还定义了几个常量和其他属性处理方法,使用他们可以方便的处理不同作用域的属性,该类定义的常量有:

public static final intAPPLICATION_SCOPE    表示application作用域
public static final intSESSION_SCOPE    表示SESSION_SCOPE作用域
public static final intREQUEST_SCOPE    表示REQUEST_SCOPE作用域

public static final int PAGE_SCOPE    表示PAGE_SCOPE作用域

该类定义的方法有:

public void setAttribute(Stringname,Object object,int scope)在指定的作用域中设置属性
public void getAttribute(String name,intscope)返回在指定作用域中名为name的属性,若没有找到,则返回null

……

jsp页面中6个隐式对象:requestoutpagepageContextconfigexception也都具有页面作用域,它们都是由pageContext器对象维护的并可以通过各自的访问方法返回的。


小结

jsp技术的主要目标是简化Web页面上的数据表示和动态数据实现。在JSP页面中可以使用指令,声明、小脚本、表达式、动作以及注释等语法元素。

JSP技术是建立在Servlet技术基础上的,所有的JSP页面最终都会编译成Servlet代码。一个JSP页面在其生命周期中要经历七个阶段,页面转换阶段、编译阶段、装载与实例化阶段,实例化后调用jspInit()_jspService()jspDestory()方法。

JSP页面中可以使用的指令有三种:page指令、include指令、taglib指令。page指令用于告诉容器关于JSP页面的总体属性,该指令适用于所有的转换单元而不仅仅是它所声明的页面。

jsp页面中还可以使用9个隐式对象applicationsessionrequestpage为四个作用域对象,在它们上面存储的数据属于不同的作用域。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值