一.九大内置对象
几乎每个JSP页面在处理数据时都要用到request,response,context等对象,所以,JSP2.0规范中定义9个内置对象(隐式对象),将在JSP中常用的对象封装成了内置对象。在JSP页面中,内置对象是由JSP默认创建的,可以直接在JSP页面中直接使用,不需要创建
9个内置对象的类型及功能:
名称 | 类型 | 功能 |
---|---|---|
out | javax.servlet.JspWriter | 用于在页面中输出内容 |
request | javax.servlet.http.HttpServletRequest | 获取用户的请求信息 |
reponse | 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页面容器,可以用来或取该JSP页面中的属性和对象的值 |
exception | java.lang.Throwable | JSP页面的异常信息 |
pageContext对象:
pageContext对象的功能:
1)可以用来获取其他内置对象
在JSP页面中,使用pageContext对象的getXXX方法可以获取JSP页面中的其他8个内置对象,如想要获取当前页面的request对象,可以调用pageContext的getPageContext( )方法。pageContext对象是javax.servlet.jsp.PageContext类的实例对象,它代表当前JSP页面的运行环境
2) 可以用来存储数据,pageContext对象存储数据是通过操作属性来实现的
方法 | 功能 |
---|---|
void setAttribute(String name,Object value,int scope) | 用于设置pageContext对象的属性 |
Object getAttribute(String name ,int scope) | 用于获取pageContext对象的属性 |
Object findAttribute(String name) | 从4个域对象中查找名称为name的属相 |
参数name指定属性名称,参数scope指定属性作用范围,作用范围参数可以是下面4个值(对应4大域,下面会细讲)
属性值 | 作用范围 |
---|---|
PageContext.PAGE_SCOPE | 整个页面 |
PageContext.PEQUEST_SCOPE | 一次请求 |
PageContext.SESSION_SCOPE | 一次会话 |
PageContext.APPLICATION | 整个web应用 |
使用findAttribute( )方法查找域中的属性时,会按照page,request,session和application的顺序(范围越小,优先级越高)进行查找
二.四大域
“域”的本质是一块存储数据的区域,底层是一个map集合,集合的键是属性名,值是属性值。由于这个map集合是属于JSP中的对象的,而不同对象的生命周期和作用范围又不同,所以“域”的作用范围也不同,只能在固定的范围内存取值。
JSP页面中有4个对象常被用来存取,传递数据,它们被称为4大域
4大域的名称,类型及作用范围:
属性值 | 作用范围 | 域名称 | 域对象类型 |
---|---|---|---|
PageScope | 当前页面 | pageContext | PageContext |
RequestScope | 即从浏览器发出请求到服务器收到请求开始处理,通常只涉及一个页面,如果有请求的转发,则涉及多个页面 | request | HttpServletRequest |
SessionScope | 浏览器和服务器的一次会话,可以在多个请求间共享数据 | session | HttpSession |
Application | 整个项目范围,可以在多次会话间共享数据 | application | ServletContext |
三.EL表达式
EL全名为Expression Language,是一种简单易用的数据访问语言,EL表达式简化了获取Servlet域对象中数据的方式,使JSP页面中的代码更加简洁
3.1 EL的语法
EL表达式的形式:${ 表达式 }
3.2 EL表达式与内置对象
3.2.1 EL表达式可以获取4大域中的属性的值(直接调用域对象)
例如:获取页面中的name属性的值 { pageScope.name }
范例:使用EL表达式获取内置对象中的数据
<%=pageContext.getAttribute("name")%>
<%=request.getAttribute("name")%>
<%=session.getAttribute("name")%>
<%=application.getAttribute("name")%>
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
EL表达式获取其他内置对象中属性的值:
分类 | 使用的方法 | 获取的值 |
---|---|---|
请求参数 | param | 获得一个请求参数 |
请求参数 | paramValues | 获得一组请求参数 |
请求头 | header | 获得一个请求头 |
请求头 | headerValues | 获得一组请求头 |
JSP上下文对象 | pageContext | |
全局初始化参数 | initParam | |
cookie | cookie |
3.2.2 获取请求参数:
请求路径:
/e3mall/userServlet?method=login&username=xxx&password=123&password=111
获取参数:
功能 | EL表达式 |
---|---|
获取一个参数 | ${param.username} |
获取一组参数 | ${paramValues.password} |
获取一组参数中的一个 | ${paramValues.password[0]} |
3.2.3 获取请求头
功能 | EL表达式 |
---|---|
获取请求头中的host参数 | ${header.accept} |
获取请求头中的编码参数(参数只有一个) | ${header[‘accept-Encoding’] |
获取请求头中的编码参数(参数为一个数组) | ${headerValues[‘accept-Encoding’][0]} |
3.2.4 获取pageContext中的属性的值
获取项目路径:
使用JSP标签 | 使用EL表达式 |
---|---|
<%=((HttpServletRequest)pageContext.getRequest()).getContextPath()%> | ${ pageContext.request.contextPath } |
3.2.5 获取项目的初始化参数(web.xml文件中的配置信息)
web.xml文件的配置
<context-param>
<param-name>namespace</param-name>
<param-value>/e3mall</param-value>
</context-param>
获取namespace参数的值:
intitParam.person5.获取cookie中的值
{ cookie.loginUser }
EL获取cookie不是直接调用底层的方法,而是对底层方法进行了部分封装和加强。cookie没有根据属性名操作属性值的API,EL的底层使用request.getCookies( )获得所有cookie,然后遍历并存放到Map中(Map < name,obj >)
四.JSTL技术:
JSTL全名为JSP Standard Tag Library ,即JSP标准标签库。使用JSP标签可以降低JSP页面的复杂度,增强代码的重用性,所以经常使用JSP的人就制作了很多自定义的JSP标签,但是制作这些标签的人并不属于同一个团队,所以有很多标签功能相同,导致学习和使用很不方便,为了方便开发者的使用,sun公司制作了一套标准标签库,即JSTL
JSTL是由5个不同功能的标签库组成的:
标签库 | 对应的URL | 标签前缀 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
I18N | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
常用的JSTL标签:
4.1 if标签
用于执行判断
语法:
例一:
<c:if test="Boolean">
${param}
</c:if>
Boolean的值为true则执行标签体中的内容,查找4大域中param属性的内容并显示
例二:
<c:if test="Boolean" var="param" scope="Scope" [scope="{page|request}"]>
${param}
</c:if>
将Boolean的值(true或false)赋给param属性,并存放到指定的作用域,若Boolean的值为true执行标签体中内容
属性名 | 功能 |
---|---|
test属性 | 用于设置逻辑表达式,逻辑表达式的计算结果为true则执行标签体中内容,为false则不执行 |
var属性 | 用于指定逻辑表达式的结果的名称 |
scope属性 | 用于指定var属性声明的变量的作用范围,默认值为page |
4.2 forEach标签
用于迭代集合中的元素
1)基本语法:
例一:
<c:forEach var="item" varStatus="status" items="${pageBean}">
<td align="center" width="18%">${status.count}</td>
<td align="center" width="17%">${item.pname}</td>
</c:forEach>
迭代pageBean集合,并输出元素的序号(从1开始),及元素的pname属性的值
属性名 | 功能 |
---|---|
var属性 | 指定当前迭代到的元素保存到page域中的名称 |
items属性 | 指定被迭代的集合对象 |
varStatus属性 | 指定存有当前迭代到的元素的信息的对象保存到page域中的名称 |
begin属性 | 指定从集合的第几个元素开始迭代,默认从0开始 |
step属性 | 指定迭代因子的增量 |
2)varStatus属性:
用于设置一个javax.servelt.jsp.jstl.core.LoopTagStatus类型的变量,这个变量包含了从集合中取出的元素的状态信息
属性名 | 返回值类型 | 功能 |
---|---|---|
count | int | 元素在集合中的序号,从1开始计数 |
index | int | 元素在集合中的索引,从0开始计数 |
first | boolean | 是否是集合的第一个元素 |
last | boolean | 是否是集合的最后一个元素 |
3)迭代Map集合:
例二:
<c:forEach var="item" items="${pageBean}">
<td align="center" width="18%">${item.key}</td>
<td align="center" width="17%">${item.value}</td>
</c:forEach>
迭代pageBean(Map集合)中的元素,将每个元素的key和value的值输出
迭代List和Set集合时,var声明的对象就是集合中的元素。而在迭代Map集合时,var声明的则是键和值的关系对象