一、JSP内置对象
1.1概念
- JSP内置对象即JSP的隐式对象
- JSP隐式对象也被称为预定义变量
- JSP隐式对象是JSP容器为每个页面提供的Java对象
在JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagaContext、cofig、page、excepition
1.2特点
-
由JSP规范提供,不用编写者实例化;
-
通过Web容器实现和管理;
-
所有JSP页面均可使用;
-
内置对象不能在JSP的<%!..%>中使用,因为out等内置对象是方法的局部变量,因此不能在类中直接使用out等内置对象
Java程序中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量
-
只有在脚本元素的表达式或代码段中才可使用(
<%=使用内置对象%>
或<%使用内置对象%>
)
1.3分类
- 输入输出对象
- request、resonse、out
- 通信控制对象
- pageContext、session、application
- Servlet对象
- page、config
- 错误处理对象
- exception
1.4JSP与servlet对象的对应关系
JSP的本质就是Servlet,Servlet是JSP的前身和基础,也就是说JSP也实现了Servlet这个接口。
JSP的很多内置对象都是通过Servlet的HttpServletRequest对象、HttpServletResponse对象和HttpServlet得到的
对 象 | 类型 | 说 明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | 获取用户请求信息 |
response | javax.servlet.http.HttpServletResponse | 响应客户端请求,并将处理信息返回到客户端 |
out | javax.servlet.jsp.JspWriter | 输出内容到 HTML 中 |
session | javax.servlet.http.HttpSession | 用来保存用户信息 |
application | javax.servlet.ServletContext | 所有用户共享信息 |
config | javax.servlet.ServletConfig | 这是一个 Servlet 配置对象,用于 Servlet 和页面的初始化参数 |
pageContext | javax.servlet.jsp.PageContext | JSP 的页面容器,用于访问 page、request、application 和 session 的属性 |
page | javax.servlet.jsp.HttpJspPage | 类似于 Java 类的 this 关键字,表示当前 JSP 页面 |
exception | java.lang.Throwable | 该对象用于处理 JSP 文件执行时发生的错误和异常;只有在 JSP 页面的 page 指令中指定 isErrorPage 的取值 true 时,才可以在本页面使用 exception 对象。 |
二、JSP域对象
2.1概念
作用域:JSP创建的对象有一定的生命周期,也有可能被其他对象访问。对象的生命周期和可访问性就是作用域,即信息共享的范围。
域对象:有作用域的对象
2.2四大域对象
- pageContext(page 域对象)
- request(request 域对象)
- session(session 域对象)
- application(application 域对象)
作用范围
作用域 | 描述 | 作用范围 |
---|---|---|
page | 如果把属性保存到 pageContext 中,则它的作用域是 page。 | 该作用域中的属性只在当前 JSP 页面有效,跳转页面后失效。 |
request | 如果把属性保存到 request 中,则它的作用域是 request。 | 该作用域中的属性只在当前请求范围内有效。服务器跳转页面后有效,例如jsp:forward;客户端跳转页面后无效,例如超链接。 |
session | 如果把属性保存到 session 中,则它的作用域是 session。 | 该作用域中的属性只在当前会话范围内有效,网页关闭后失效。 |
application | 如果把属性保存到 application 中,则它的作用域是 application。 | 该作用域中的属性在整个应用范围内有效,服务器重启后失效。 |
2.3通用方法
getAttribute(String name) //获取对应的数据
getAttributeNames()//获取所有的key
removeAttribute(String name) //移除对应的数据
SetAttribute(String name, Object object) //设置数据
三、EL表达式
3.1EL表达式是什么?
概念
EL(Expression Language )表达式语言,用于简化 JSP 页面内的 Java 代码。
语法
以“${”为起始、“}”为结尾,中间为表达式
${EL expression}
${obj.sname}
【注意:${obj.sname}实质是调用obj的getName()方法——Java反射机制】
【注意:sname必须是stu实体类中的属性名!!!】
eg:${stu.sname}实质就是调用了stu.getSname()方法
eg:${aa}实质就是拿域对象中键为aa的值
EL中的隐含对象(作用域)
pageScope、requestScope、sessionScope、applicationScope //在键出现冲突(重复)的时候使用,用来区分调值
eg:
${sessionScope.user.name}就是取出session范围内的namme值
3.2为什么要用EL表达式?
核心:代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出
之前的JSP页面中,我们经常使用JSP表达式来输出变量或者页面之间传递的参数,大大降低了页面的可读性。
而EL 提供了更为简洁、方便的形式来访问变量和参数,不仅可以简化 JSP 页面代码,还会使开发者的逻辑变得更加清晰 。
3.3怎么使用?
eg:${stu.sname}实质就是调用了stu.getSname()方法
eg:${aa}实质就是拿域对象中键为aa的值
(1)EL访问JavaBean的属性
${key.属性}
${key["属性"]}
(2)EL访问数组中的数据
${数组名[下标]}
${数组名[下标].属性}
(3)EL获取list中数据
${集合名[下标]}
(4)EL访问Map
${集合名.key}
EL运算符
类别 | 运算符 |
---|---|
算术运算符 | +、-、*、/ 或 div、%或 mod |
关系运算符 | = = 或 eq、!= 或 ne 、< 或 It、>或 gt、<=或le、>= 或 ge |
逻辑运算符 | &&或and、 |
其他运算符 | Empty运算符、条件运算符、()运算符 |
//算术、关系、逻辑运算符同java一致
eg:${2>1&&5!=6}
//empty/not empty运算符 判断是否为空/不为空
eg:${empty ls}
四、JSTL标签
4.1JSTL是什么?
概念
JSTL(JSP Standard Tag Library)是JSP标准标签,由apache实现。是sun公司制定的,类似于HTML标签的jsp标签技术。俗称C标签。
核心标签库
4.2为什么要用JSTL?
使用了EL表达式可以简化JSP页面代码,但是如果需要进行逻辑判断、循环遍历怎么办?
JSTL就来了。
4.3怎么用?
1.导入依赖jar:jstl.jar、standrad.jar,将两个JSTL的jar包放到WebContent->WEB-INF->lib下
2.在所需的JSP页面添加taglib指令,引入JSTL中core包依赖约束
taglib指令:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
4.4通用标签:set remove out
4.4.1 out标签
-
<c:out>
标签:用于将结果输出。类似于JSP中的<%= %>表达式,或者是EL表达式${} expression }。<%--取值--%> <c:out value="${userName}"></c:out>
-
内部属性介绍:
-
value:设置要输出到页面的数据,要使用EL表达式
-
default:设置一个默认值,当value所设置的EL表达式的值为null时,则将default所对应的值输出到页面
-
escapeXml:设置输出到页面中的内容是否转义,默认值为true,表示转义,即原样输出;若设置为false,表示不转义,输出到页面中的内容会被浏览器解析
-
4.5.2 set标签
<c:set>
标签:用于把某一个对象存在指定的域范围内,或者将某一个对象存储到Map或者JavaBean对象中。
<%--设值--%>
<c:set var="userName" value="tanghaorong" scope="session"></c:set>
-
内部属性介绍:
-
var:设置共享数据的属性名
-
value:设置共享数据的属性值
-
scope:设置共享数据的域对象的范围,若不指定域对象的范围,则默认在pageContext域对象中共享数据,scope=“page(默认)|request|session|application”
-
4.5.3 remove标签
<c:remove>
标签:相较于<c:set>
,作用是移除范围域中的变量。
<%--删除userName变量--%>
<c:remove var="userName"></c:remove>
-
内部属性介绍:
-
var:要删除的域对象中共享数据的属性名
-
scope:要删除共享数据的域对象的范围,
-
scope=“page|request|session|application”,若不指定scope,则删除所有域对象中以var的值作为属性名的数据
-
4.5条件标签if
4.5.1 if标签
<c:if>
标签:和程序中的if语句作用相同,用来实现条件控制,但是没else功能。
<c:if test="testCondition" [var="varName"] [scope="{page|request|session|application}"]>
标签体内容
</c:if>
- 其中参数说明:
- test属性用于存放判断的条件,一般使用EL表达式来编写。
- var属性用来存放判断的结果,类型为true或false。
- scopes属性用来指定var属性存放的范围。
4.5.2 <c:choose>、<c:when>和<c:otherwise>标签
- <c:choose>、<c:when>和<c:otherwise>标签:这三个标签通常一起使用,<c:choose>标签作为<c:when>和<c:otherwise>标签的父标签来使用。类似于程序中if-else,其中<c:when>表示if,<c:otherwise>表else。
<%
//在session中设置值
session.setAttribute("score",50);
%>
<c:choose>
<c:when test="${score>60}">
<span>恭喜!及格了</span>
</c:when>
<c:otherwise>
<span>不好意思!不及格</span>
</c:otherwise>
</c:choose>
4.6迭代标签:forEach forTokens
4.6.1 forEach标签
-
<c:forEach>
:相当于 for 循环。java中有增强for循环和普通for循环,JSTL 中的<c:forEach>
也有两种用法 -
作用:根据循环条件遍历集合中的元素
-
属性:
- var设定变量名用于存储从集合中取出的元素(必须无默认值)
- items指定要遍历的集合
- begin、and用于指定遍历的起始位置和终止位置(有默认值)
- step指定循环的步长(有默认值)
- varStatus通过index、count、first、last几个状态值,描述begin和end子集中的元素的状态。
- index 下标
- count 技术
- first 是否是第一个
- last 是否是最后一个
<!--1、完整语法-->
<c:forEach items="要遍历的集合对象" var="变量" varStatus="状态" begin="开始" end="结束" step="增量">
循环体代码…
</forEach>
<!--第一种用法:forEach增强-->
<c:forEach items="要遍历的集合对象" var="变量" >
循环体代码…
</forEach>
<!--
第二种用法:类似于 Java 中的普通for循环
从0循环到10,变量名是 `i` ,每次自增1
-->
<c:forEach begin="0" end="10" step="1" var="i">
${i}
</c:forEach>
4.6.2 forTokens标签
<c:forTokens>
标签:该标签用于浏览字符串,并根据指定的字符将字符串截取。- 语法
<c:forTokens items=”strigOfTokens” delims=”delimiters” [var=”name”] [begin=”begin”] [end=”end”] [step=”len”] [varStatus=”statusName”] >
主体内容
</c:forTokens>
其中参数说明:
- items指定被迭代的字符串。
- delims指定使用的分隔符。
- var指定用来存放遍历到的成员。
- begin指定遍历的开始位置(int型从取值0开始)。
- end指定遍历结束的位置(int型,默认集合中最后一个元素)。
- step遍历的步长(大于0的整型)。
- varStatus存放遍历到的成员的状态信息。
<c:out value="根据一个分隔符截取:"/><hr>
<c:forTokens items="123-4567-8910" delims="-" var="tel">
<c:out value="${tel}"></c:out><br/>
</c:forTokens>
<br/><br/><br/>
<c:out value="根据多个分隔符截取:"/><hr>
<c:forTokens var="str" items="太阳、星星、月亮;地球|火星" delims="、;|">
<c:out value="${str}"></c:out><br/>
</c:forTokens>
<br/><br/><br/>
<c:out value="输出其它属性信息:"/><br><hr>
<c:forTokens items="1*2*3*4*5*6*7"
delims="*"
begin="1"
end="3"
var="n"
varStatus="s">
数字 <c:out value="${n}"/> 的四种属性:<br>
所在位置,即索引:<c:out value="${s.index}"/><br>
总共已迭代的次数:<c:out value="${s.count}"/><br>
是否为第一个位置:<c:out value="${s.first}"/><br>
是否为最后一个位置:<c:out value="${s.last}"/><br>
<hr>
</c:forTokens>