JSP基础
JSP生命周期
JSP最终都变成一个servlet来处理用户请求。
- 容器开始运行时,读取应用的DD,但此时不对jsp文件做任何处理
- 当jsp接收到第一个用户请求时,容器尝试将jsp转换为一个servlet类的源代码(myjsp_jsp.java)
- 容器将.Java文件编译为.class文件
- 容器加载新生成的servlet类
- 容器实例化这个servlet,并运行jspInit()方法,此时jsp作为一个servlet准备接收客户请求
- 容器创建一个新线程处理这个客户的请求,此过程中会调用_jspService函数。
- 在以后的客户请求中,只需要重复第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里面封装了其他的隐式对象。