Jsp技术
一.Jsp的运行原理
**概述:**JSP是Java服务器页面,既可以写静态页面代码,也可以写动态页面代码
**特点:**跨平台性,业务代码相分离,组件重用,预编译
运行原理:
-
客户端发生请求到Jsp文件
-
Jsp容器将Jsp文件转换为Java源文件
-
通过编译将其转换为.class文件,它就是一个Servlet
-
jspInit()初始化(整个生命周期只会执行一次)
-> jspService()处理请求(通过多线程方法处理,由于转换编译第一次请求慢,之后会成为常驻内存快
->处理完请求,响应对象由Jsp容器接收,并返回客户端
->Jsp对象销毁前调用jspDestroy()
二.Jsp的基本语法
**基本构成:**HTML + Java + Jsp tab
1.Jsp脚本元素
- Jsp scriptlets
Jsp scriptlets是Jsp中存放Java代码的片段,格式:
<% 代码(变量, 程序控制语句,Jsp内置对象) %>
//存放在jspService()中的逻辑处理
- 声明标识
声明标识用于在整个Jsp中定义全局变量和方法,格式:
<%! 定义变量和方法等 %>
解释:
1.在声明方法中定义的变量是全局变量,是因为这相当于是在.class文件转换为servlet中的全局变量和方法,是不可以进行输出。的在Jsp scriptlets代码片段中定义的变量是相当于在jspService()方法中定义的方法,因此不可以定义方法,定义的变量也是局部变量
2.通过声明标识创建的变量和方法在当前JSP页面中有效,它的生命周期是从创建开始到服务器结束;代码片段创建的变量或方法,也是在当前JSP页面有效,但它的生命周期是页面关闭后就会被销毁。
- Jsp表达式
用于向页面输出表达式,该表达式的最终结果将会转换为字符串,格式:
<%= expression =>
2.JSP注释
- 同Java注释一样
// /**/ /** */
- 隐藏注释
<%-- 注释 --%>
网页源代码只显示出了HTML注释,而没有显示JSP的注释信息。这是因为Tomcat编译JSP文件时,会将HTML注释当成普通文本发送到客户端,而JSP页面中格式为“<%-- 注释信息 --%>”的内容则会被忽略,不会发送到客户端。
- 动态注释:将HTML代码和<% Java代码 %>结合
3.Jsp指令
- page指令:用来对页面的某些特征进行描述
<%@ page 属性名1="" 属性名2="" %>
属性名称 | 取值范围 | 描述 |
---|---|---|
import | 包名,类名 | 指定在JSP页面翻译成的Servlet源文件中导入的包或类。 可以声明多次,一个import可以导多个包,用逗号隔开。 默认导包java.lang;javax.servlet.;javax.servlet.jsp.; javax.servlet.http.* |
language | java | 指定JSP页面所用的脚本语言 |
session | true/false | true:该Jsp有session内置对象 |
isErrorPage | true/false | 指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception对象的exception,默认情况为false |
errorPage | Jsp相对路径 | 指定一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。 |
contentType | 指定当前JSP页面的MIME类型和字符编码 | |
pageEncoding | 指定页面编码格式 |
- include指令:在JSP页面中包含另一个JSP页面
<%@ include file="被包含文件的地址"%>
(1)被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素和JSP指令等普通JSP页面所具有的一切内容。
(2)除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。
(3)file属性的设置值必须使用相对路径,这里的file属性指定的相对路径是相对于文件,不是相对于页面,一般不以“/”开头
(4)在应用include指令进行文件包含时建议在被包含页面中将,等标签删除。
- taglib指令:通过taglib指令标识该页面中所使用的标签库
<%@ taglib prefix="指定标签的前缀" uri="标签的uri"%>
4.Jsp动态元素
- 包含文件元素
**作用:**用于向当前页面引入其他的文件,被引入的文件可以是动态文件,也可以是静态文件
<jsp:include page="URL" flush="true/false"/>
//page:相对路径
//flush:是否将当前页面内容刷新到客户端,默认情况为falsh(同include指令一样)
include指令和jsp:include动态元素的区别
1.include指令中的file属性不可以为表达式,<jsp:include>可以
2.include指令是将被包含的文件原封不动的插入包含页,编译为一个java文件,使用<jsp:include>动作元素包含文件时,当该元素被执行时,程序会将请求转发到被包含的页面,并将执行结果输出到浏览器中,然后返回包含页,继续执行后面的代码。
3.include指令存在变量冲突的问题
- 请求转发元素
**作用:**可以将当前请求转发到其他Web资源
<jsp:forward page="相对路径"/>
//注意:标签要闭合
5.Jsp隐式对象
名称 | 类型 | 描述 |
---|---|---|
out | javax.servlet.jsp.JspWriter | 用于页面输出 |
request | javax.servlet.http.HttpServletRequest | 得到用户请求信息 |
response | javax.servlet.http.HttpServletResponse | 服务器向客户端的回应信息 |
config | javax.servlet.ServletConfig | 服务器配置,可以取得初始化参数 |
session | javax.servlet.http.HttpSession | 用来保存用户的信息 |
application | javax.servlet.ServletContext | 所有用户的共享信息 |
page | java.lang.Object | 指当前页面转换后的Servlet类的实例 |
pageContext | javax.servlet.jsp.PageContext | JSP的页面容器 |
exception | java.lang.Throwable | 表示JSP页面所发生的异常,在错误页中才起作用 |
- out对象
在JSP页面中,通过out隐式对象写入数据相当于将数据插入到JspWriter对象的缓冲区中,只有调用了ServletResponse.getWriter()方法,缓冲区中的数据才能真正写入到Servlet引擎所提供的缓冲区中。如果想要通过out对象直接写入到Servlet可以使用page指令实现
<%@ page buffer="0kb" %>
- pageContext对象
1.获得Jsp隐式对象
方法名 | 功能描述 |
---|---|
JspWriter getOut() | 用于获取out隐式对象 |
Object getPage() | 用于获取page隐式对象 |
ServletRequest getRequest() | 用于获取request隐式对象 |
ServletResponse getResponse() | 用于获取response隐式对象 |
HttpSession getSession() | 用于获取session隐式对象 |
Exception getException() | 用于获取exception隐式对象 |
ServletConfig getServletConfig() | 用于获取config隐式对象 |
ServletContext getServletContext() | 用于获取application隐式对象 |
2.域对象相关方法
方法名 | 功能描述 | |
---|---|---|
void setAttribute(String name,Object value,int scope) | 用于设置pageContext对象的属性 | |
Object getAttribute(String name,int scope) | 用于获取pageContext对象的属性 | |
Object getAttribute(String name) | 用于获取scope范围为PAGE_SCOPE的属性 | |
void removeAttribute(String name,int scope) | 用于删除指定范围内名称为name的属性 | |
void removeAttribute(String name) | 用于删除所有范围内名称为name的属性 | |
Object findAttribute(String name) | 用于从4个域对象中查找名称为name的属性(依次从page,request,session,application范围找,否则人返回null) | |
Enumeration getAttribute(int scope) | 获取某个范围的属性名 |
scope的作用范围:
pageContext.PAGE_SCOPE:表示页面范围。
pageContext.REQUEST_SCOPE:表示请求范围。
pageContext.SESSION_SCOPE:表示会话范围。
pageContext.APPLICATION_SCOPE:表示Web应用程序范围
- exception对象
在JSP页面中,经常需要处理一些异常信息,处理异常信息可以通过exception对象实现。exception对象是java.lang.Exception类的实例对象,它用于封装JSP中抛出的异常信息。需要注意的是,exception对象只有在错误处理页面才可以使用,即page指令中指定了属性<%@ page isErrorPage=“true”%>的页面。
三.EL表达式
1.EL表达式基本概念
- EL表达式语法格式
${表达式}
作用:EL表达式用来获取域对象的值,如果域对象的值不存在的时候会返回空字符串,不会出现空指针异常
- EL表达式的特点
(1)EL可以与JavaScript语句结合使用。
(2)EL可以自动进行类型转换。如果想通过EL获取两个字符串数值(如number1和number2)的和,可以直接通过“+”符号进行连接(如$ {number1+number2}),如果字符串不是数字的话,是不可以连接的会报错
(3)EL不仅可以访问一般变量,还可以访问JavaBean中的属性、嵌套属性和集合对象。
(4)在EL中,可以执行算术运算、逻辑运算、关系运算和条件运算等。
(5)在EL中,可以获取pageContext对象,进而获取其他内置对象。
(6)在使用EL进行除法运算时,如果除数为0,则返回表示无穷大的Infinity,而不返回错误。
(7)在EL中,可以访问JSP的作用域(request、 session、 application 以及page)。
- EL表达式中的变量就是域属性的名字
- 点运算符:用来获取与属性的值
${user.name}
- 方框运算符也可以获取域属性的值
${user["name"]}
注意下面情况只可以用方框运算符
1.如果属性名出现"-","?"等非字母和数字的符号
${user["My-name"]}
2.如果要访问数组或集合中的元素
${user[index]}
- empty运算符用于判断对象是否为null或为空
${empty empression}
- 条件运算符
${A?B:C}
- 在使用EL表达式时,没有数组下标越界,没有空指针异常,没有字符串拼接
2.EL隐式对象
- pageContext对象
作用:获取JSP页面的隐式对象,可以使用EL中的pageContext隐式对象
隐式对象名称 | 描 述 | 返回值类型 |
---|---|---|
pageContext | 对应于JSP页面中的pageContext对象 | pageContext |
${pageContext.request.characterEncoding}
//相当于
pageContext.getRequest().getCharacterEncoding()
- cookie对象
作用:获得客户端cookie信息
隐式对象名称 | 描 述 | 返回值类型 |
---|---|---|
cookie | 用于获取使用者的cookie值,cookie的类型是Map | Map<String, Cookie> |
${cookie.cookie名字}<br/>
${cookie.cookie名字cookie名字.name}<br/>
${cookie.cookie名字.value}<br/>
- initParam对象
作用:获得初始化参数的值
隐式对象名称 | 描 述 | 返回值类型 |
---|---|---|
initParam | 表示一个保存了所有Web应用初始化参数的Map对象 | Map<String, String> |
- 四个域范围对象
作用:用来获取域属性和值
隐式对象名称 | 描 述 | 返回值类型 |
---|---|---|
pageScope | 代表page域中用于保存属性的Map对象 | Map<String, Object> |
requestScope | 代表request域中用于保存属性的Map对象 | Map<String, Object> |
sessionScope | 代表session域中用于保存属性的Map对象 | Map<String, Object> |
applicationScope | 代表application域中用于保存属性的Map对象 | Map<String, Object> |
${pageScope.username}
${requestScope.username}
- 获取参数对象
隐式对象名称 | 描 述 | 返回值类型 |
---|---|---|
param | 表示一个保存了所有请求参数的Map对象 | Map<String, String> |
paramValues | 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个String类型数组 | Map<String, String[]> |
name:${param.name}<br/>
hobby1:${paramValues.hobby[0]}<br/>
hobby2:${paramValues.hobby[1]}<br/>
- 获取请求头字段对象
隐式对象名称 | 描 述 | 返回值类型 |
---|---|---|
header | 表示一个保存了所有http请求头字段的Map对象 | Map<String, String> |
headerValues | 表示一个保存了所有http请求头字段的Map对象,返回String类型数组 | Map<String, String[]> |