1.JSP
1.1 JSP概述
jsp全称java serverpages(java服务器页面),本质是一个servlet,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。
1.2 JSP原理
1.3 JSP脚本
JSP有三个基本的脚本元素,作用是使JAVA代码可以直接插入到HTML代码中
(1)声明标签
格式:<%! inta = 1; %>
作用:声明的变量在类的成员位置上
(2)脚本片断
格式:<% inta = 1; out.println(a); %>
作用:内容会生成在_jspService()方法中
(3)脚本表达式
格式:<%="hello " + a %>
作用:它就相当于是out.println()将内容直接输出到页面中,注意表达式不能以分号结尾
1.4 JSP注释
在jsp页面中可以使用三种注释
(1)可以使用html中注释
<!-- html的注释 -->
(2)可以对jsp脚本内容使用java注释
//单行注释 /* 多行注释 */ /**文档注释*/
(3)可以使用jsp注释(会被编译系统忽略)
<%-- jsp注释 --%>
2. JSP指令
2.1 JSP指令概述
JSP的编译指令是通知JSP引擎的消息,它不直接生成输出,用于指示JSP执行某些步骤和指示JSP表现特定行为。
2.2 JSP指令格式
语法:<%@ 指令的名称 属性名=”属性值” 属性名=”属性值”%>
2.3 JSP指令分类
JSP中有三大指令,分别是以下三个:
Page:设置JSP的属性
Include:包含页面(页面布局
Taglib:引入标签库文件
2.4. page指令
language :JSP的语言的属性.现在只能是java.
contentType :设置浏览器默认的打开的时候的编码.
pageEncoding :设置JSP文件保存到硬盘,以及翻译成Servlet保存到硬盘的编码格式.
import :设置JSP中引入其他的类.import属性可以出现多次的.
extends :设置JSP被翻译成Servlet后继承的类:默认值:org.apache.jasper.runtime.HttpJspBase.修改这个值得话一定要使这个类是一个Servlet才可以.
autoFlush :设置自动刷出缓存
buffer :JSP的缓冲区的大小。默认8kb
session :默认值是true.设置JSP的页面中是否可以直接使用session对象.
isELIgnored :设置JSP是否忽略EL表达式.默认值false 不忽略.可以在JSP中写EL表达式.
isErrorPage :设置JSP页面中出现错误信息应该如何处理的.
errorPage :设置JSP页面中出现错误信息应该如何处理的.
设置全局错误页面:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
2.5. include指令
include指令表示静态包含!即目的是把多个JSP合并成一个JSP文件!
include指令只有一个属性:file,指定要包含的页面,例如:<%@includefile=”b.jsp”%>。
静态包含:当a.jsp页面包含了b.jsp页面后,在编译ajsp页面时,需要把a.jsp和b.jsp页面合并成一个文件,然后再编译成Servlet(Java文件)。
2.6 taglib指令
在JSP页面中使用第三方的标签库时,需要使用taglib指令来“导包”。例如:<%@ taglibprefix="c" uri="http://java.sun.com/jsp/jstl/core" %>,其中uri是由第三方标签库定义的,prefix表示标签的前缀,这个名称可以随便起。
3. JSP内置对象
request HttpServletRequest getParameter(),setAttribute(),getAttribute();
response HttpServletResponse setStatus(),sendRedirect(),getOutputStream();
session HttpSession setAttribute(),getAttribute(),removeAttribute();
application ServletContext setAttribute(),getAttribute(),removeAttribute();
page Object toString(),wait(),
pageContext PageContext setAttribute(),getAttribute(),removeAttribute();
out JspWriter write(),print(),
config ServletConfig getInitParamter(),getInitParameterNames(),
exception Throwable getMessage(),getCause()
* out对象:先将自身缓存区中的内容输出到response的缓冲区中,由response向页面作出响应.
out :JspWriter
response.getWriter() :PrintWriter
* pageContext:
一类:用pageContext对象获得其他的8个内置对象. 用来编写一个通用性高的或者框架的时候.
二类:用来存取数据.向四个域中存取数据.
3.1九个内置对象及其相应类型
内置对象 | 类型 |
request | HttpServletRequest |
response | HttpServletResponse |
session | HttpSession |
application | ServletContext |
config | ServletConfig |
page | this(Servlet) |
pageContext | PageContext |
exception | Throwable |
out | JspWriter |
3.2获取其他内置对象
通过pageContext对象可以获取jsp中其他的内置对象.PageContext类中定义了如下八个方法:getPage()、getRequest()、getResponse()、getServletConfig()、getServletContext()、getException()、getSession()等方法,其中getOut()放是在其父类中定义的,有了这些方法,pageContext对象自然能够获取其他八个内置对象了。
3.3 JSP中的域对象
pageContext pageScope 页面范围
request requestScope 请求范围
session sessionScope 会话范围
application applicationScope 应用范围
pageContext是一个域对象,常用方法:
void setAttribute(Stringname,Object value)
Object getAttribute(Stringname);
Void removeAttribute(Stringname);
操作其他域中的对象的方法:
Object getAttribute(Stringname, int scope):
该方法的第一个参数是域属性的名称,第二个参数指定是从那个域中取出域属性;
在PageContext中已经定义了如下几个静态常量作为scope的可选值:
int APPLICATION_SCOPE:表示从application域中获取数据;
int PAGE_SCOPE:表示从pageContext域中获取数据;
int REQUEST_SCOPE:表示从request域中获取数据;
int SESSION_SCOPE:表示从session域中获取数据。
void setAttribute(String name,Objectvalue,int scope):
该方法的第一个参数指的是域属性的名称,第二参数指的是域属性的值,第三个参数指定域属性保存的域,scope的取值同上;
void removeAttribute(Stringname,int scope):
该方法的第一个参数指的是域属性的名称,第二个参数指的是将指定域属性从哪个域中移出,scope的取值同上;
4. jsp动作标签
4.1 jsp动作标签概述
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
4.2 常用的jsp标签
jsp:forward
<jsp:forward>标签是用来做请求转发,它与RequestDispatcher接口的forward()方法一样,唯一不同的是它是在jsp页面中使用。
jsp:include
<jsp:include>标签的作用使用来包含其他jsp页面,之前学习的include指令属于静态包含,而include动作标签是动态包含,它和RequestDispatcher接口的include()方法一样,是运行级别的包含
jsp:param
<jsp:param>标签作为<jsp:forward>标签和<jsp:include>标签的子标签,用来给转发或包含的页面传递数据。
静态包含与动态包含的区别
include标签与inclue指令区别:
(1)include指令是静态包含,包含文件中包含了被包含文件的内容.
include标签是动态包含,它包含的是被包含文件执行后的结果.
(2)include指令不能带参数
include标签是可以带参数的
5. EL表达式
5.1 EL表达式概述
EL是Expression Language的缩写,它是jsp内置的表达式语言,从jsp2.0开始,就不让再使用java脚本,而是使用el表达式或动态标签来代替java脚本。
EL表达式的格式:${表达式}
EL表达式代替的是java脚本中的<%= …%>,也就是说EL表达式也是向浏览器端输出数据。例如${1+2}会向浏览器端输出3。
5.2 EL表达式的作用
为了使JSP写起来更加简单,更加安全,可以通过EL表达式来替换jsp页面上的脚本
EL主要作用:
(1)获取数据:
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索java对象、获取数据。(某个web域中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
(2)执行运算:
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
(3)获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
(4)调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
5.3 EL表达式之域查找
1.pageContext--------------------${pageScope.xxx}
2.request--------------------------${requestScope.xxx}
3.session--------------------------${sessionScope.xxx}
4.application---------------------${applicationScope.xxx}
通过el获取时,如果没有查找到,会返回"".除了上面的获取方式外还有一种,例如
${requestScope[“xxx”]}
关于.与[]区别
[]与.在使用方式上是一样的.但是如果名称中包含了"."等特殊字符,就必须使用[]来获取. 例如
request.setAttribute("login.message","登录失败");
${requestScope.login.message}<br>错误的
${requestScope["login.message"]}正确的
如果没有写范围,会默认从page,request,session.application依次查找
5.4 EL表达式获取复杂数据
获取数组中数据
例如:${数组名称[索引] }
获取List中数据
例如:${集合名称[索引]}
获取Map中数据
例如:${集合名称.key名称}
5.5 EL表达式运算
运算符 | 说明 | 范例 | 结果 |
+ | 加 | ${17+5} | 22 |
- | 减 | ${17-5} | 12 |
* | 乘 | ${17*5} | 85 |
/或div | 除 | ${17/5}或${17 div 5} | 3 |
%或mod | 取余 | ${17%5}或${17 mod 5} | 2 |
==或eq | 等于 | ${5==5}或${5 eq 5} | true |
!=或ne | 不等于 | ${5!=5}或${5 ne 5} | false |
<或lt | 小于 | ${3<5}或${3 lt 5} | true |
>或gt | 大于 | ${3>5}或${3 gt 5} | false |
<=或le | 小于等于 | ${3<=5}或${3 le 5} | true |
>=或ge | 大于等于 | ${3>=5}或${3 ge 5} | false |
&&或and | 并且 | ${true&&false}或${true and false} | false |
!或not | 非 | ${!true}或${not true} | false |
||或or | 或者 | ${true||false}或${true or false} | true |
empty | 是否为空 | ${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”} | true |
6. EL表达式内置对象
EL隐式对象引用名称 | 类型 | JSP内置对象名称 | 说明 |
pageContext | javax.servlet.jsp.PageContext | pageContext | 一样的 |
pageScope | java.util.Map<String,Object> | 没有对应的 | pageContext范围中存放的数据,页面范围 |
requestScope | java.util.Map<String,Object> | 没有对应的 | 请求范围数据 |
sessionScope | java.util.Map<String,Object> | 没有对应的 | 会话范围数据 |
applicationScope | java.util.Map<String,Object> | 没有对应的 | 应用范围数据 |
param | java.util.Map<String,String> | 没有对应的 | 一个请求参数 |
paramValues | java.util.Map<String,String[]> | 没有对应的 | 重名请求参数 |
header | java.util.Map<String,String> | 没有对应的 | 一个请求消息头 |
headerValues | java.util.Map<String,String[]> | 没有对应的 | 重名请求消息头 |
initParam | java.util.Map<String,String> | 没有对应的 | web.xml中全局参数 |
cookie | java.util.Map<String,Cookie> | 没有对应的 | key:cookie对象的name值 |
6.1pageContext内置对象
EL表达式的11个内置对象中,有10个内置对象的类型是Map类型,只有pageContext的类型是PageContext。它的使用类似于jsp的内置对象pageContext,. 通过pageContext对象可以获取其他内置对象的任意的属性值。
常用操作:${pageContext.request.contextPath}
6.2请求参数相关内置对象
请求参数相关的内置对象是:
param:该内置对象的类型是Map<String,String>,可以用来获取值为单值的请求参数,其中key指的是请求参数的名称,value指的是请求参数的值,使用param获取请求参数与request.getParameter()方法一样。
paramValues:该内置对象的类型是Map<String,String[]>,可以用来获取值为多值的请求参数,其中key是参数名,value是多个参数值组成的字符串数组。
注意,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。这一点与使用request.getParameter()方法是不同的。
6.3请求头相关内置对象
与请求头相关的内置对象是:
header:该内置对象的类型是Map<String,String>,用来获取值为单值的请求头信息,其中key代表的是请求头名称,value代表的是请求头的值;
headerValues:该内置对象的类型是Map<String,String[]>,用来获取值为多值的请求头信息,key代表的是请求头名称,value代表的是请求头的多个值。
6.4全局初始化参数的内置对象
EL表达式中内置了一个与初始化参数相关的对象:
initParam:该内置对象的类型是Map<String,String>,用来获取web.xml文件中<context-param>标签的参数值,其中key代表的是参数名,value代表的是参数值。
6.5 cookie相关内置对象
EL表达式也内置一个名为cookie的对象,该内置对象与cookie相关,如下:
cookie:该内置对象的类型为Map<String,Cookie>,其中key是Cookie的名字,value是Cookie对象本身。