一、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标签
标签:用于将结果输出。类似于JSP中的<%= %>表达式,或者是EL表达式${} expression }。
<%--取值--%> <c:out value="${userName}"></c:out>
- 内部属性介绍:
- value:设置要输出到页面的数据,要使用EL表达式
- default:设置一个默认值,当value所设置的EL表达式的值为null时,则将default所对应的值输出到页面
- escapeXml:设置输出到页面中的内容是否转义,默认值为true,表示转义,即原样输出;若设置为false,表示不转义,输出到页面中的内容会被浏览器解析
4.5.2 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标签
标签:相较于
,作用是移除范围域中的变量。
<%--删除userName变量--%> <c:remove var="userName"></c:remove>
- 内部属性介绍:
- var:要删除的域对象中共享数据的属性名
- scope:要删除共享数据的域对象的范围,
- scope=“page|request|session|application”,若不指定scope,则删除所有域对象中以var的值作为属性名的数据
4.5条件标签if
4.5.1 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 、和标签
- 、和标签:这三个标签通常一起使用,标签作为和标签的父标签来使用。类似于程序中if-else,其中表示if,表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标签
:相当于 for 循环。java中有增强for循环和普通for循环,JSTL 中的
也有两种用法
- 作用:根据循环条件遍历集合中的元素
- 属性:
- 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 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>