JSP基础

Published: 22 Jul 2012 Category: 编程

JSP生命周期

JSP最终都变成一个servlet来处理用户请求。

  1. 容器开始运行时,读取应用的DD,但此时不对jsp文件做任何处理
  2. 当jsp接收到第一个用户请求时,容器尝试将jsp转换为一个servlet类的源代码(myjsp_jsp.java)
  3. 容器将.Java文件编译为.class文件
  4. 容器加载新生成的servlet类
  5. 容器实例化这个servlet,并运行jspInit()方法,此时jsp作为一个servlet准备接收客户请求
  6. 容器创建一个新线程处理这个客户的请求,此过程中会调用_jspService函数。
  7. 在以后的客户请求中,只需要重复第7步。

JSP元素

1 脚本

使用<% %>,可在里面直接插入java代码

2 指令

使用<%@ %>,存在三种指令:

Page指令(常用)

定义页面特定的属性,如字符编码、页面响应的内容类型等。

存在多种属性,常用的有import:定义java import语句,增加到生成的servlet类中

Taglib指令

定义JSP可以使用的标记库。

Include指令(常用)

定义在转换时增加到当前页面的文本和代码,可更好的重用代码.

3 表达式

<%=?? %>,直接输出变量,和out.println()功能一样。

4声明

<%! %>, 声明中的内容作为对应的servlet的成员函数和成员变量。因为servlet很少使用或不应该使用成员变量,此声明大部分用于覆盖对应servlet的成员函数。

5EL表达式

6动作

JSP与servlet的对应关系

由上可知,jsp最后都会转换为servlet来处理用户请求,那jsp中的元素分别对应servlet里面的何种结构呢。

JSP生成的servlet实现了HttpJspPage接口。此接口存在三个关键函数,jspInit()函数在servlet的init()方法中调用,可以覆盖。jspDestroy()在servlet的destroy()函数中调用,可被覆盖。_jspService在servlet的service()函数中调用,不可以被覆盖。Jsp中的大部分代码会背放置在这个函数中。

Jsp中所有的html、java脚本以及表达式等都直接放置在servlet中的服务方法_jspService()函数中。Html和表达式通过out.write(“html代码或表达式”)输出。

<%@ page import=”” %>作为import…直接在servlet最顶端。

<%! %>声明中的内容直接放置在类中,在服务方法之外,作为servlet的成员变量和成员函数。此外,通过声明可覆盖HttpJspPage接口中的jspInit()函数和jspDestroy()函数。声明中的内容无论放在什么位置都作为servlet服务函数之外的内容,也就是说在jsp中可以使用代码放在声明代码之前,如:

<%=++count %>

<%!int count=0; %>

JSP和servlet一样,可以使用初始化参数和进行初始化。设置初始化参数使用<jsp-file>标签,表示这个servlet的配置对应这个JSP生成的servlet。初始化就可以通过覆盖jspInit()函数来实现。

除此之外,服务方法最前面有一堆隐式对象的声明和赋值,这些隐式对象可被直接使用。

API

隐式对象

JspWriter

Out

HttpServletRequest

Request

HttpServletResponse

Response

HttpSession

Session

ServletContext

Application

ServletConfig

Config

JspException

Exception

PageContext

pageContext

Object

page

注:pageContext里面封装了其他的隐式对象。