EL和JSTL标签库
EL表达式
servlet和jsp数据流获取方式,获取作用域数据对象
servlet请求数据初始化和请求转发
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
System.out.println(uname + ":" + pwd);
//存储普通字符
req.setAttribute("str","今天天气很好!");
//存储对象
User u = new User(1,"张三","123","man",18,"2000-01-01");
req.setAttribute("user",u);
//List存储普通字符
List<String> list = new ArrayList<>();
list.add("刘德华");
list.add("周星驰");
list.add("梁朝伟");
req.setAttribute("list",list);
//List存储对象
List<User> list2 = new ArrayList<>();
User u2= new User(2,"李四","456","woman",20,"1998-01-01");
list2.add(u2);
req.setAttribute("list2",list2);
//Map存储普通字符
Map<String,String> map = new HashMap<>();
map.put("a","北京");
map.put("b","上海");
map.put("c","广州");
req.setAttribute("map",map);
//Map存储对象
Map<String,Object> map2 = new HashMap<>();
map2.put("a",new User(3,"王五","789","woman",20,"1998-01-01"));
req.setAttribute("map2",map2);
//请求转发
req.getRequestDispatcher("/el.jsp").forward(req,resp);
return;
}
传统方法
<h3>传统方法获取作用域数据</h3>
<b>普通字符:<%=request.getParameter("uname")%></b><br>
<b>普通字符:<%=request.getAttribute("str")%></b><br>
<b>存储对象:<%=((User)request.getAttribute("user")).getUname()%></b><br>
<b>List存储普通字符:<%=((ArrayList)request.getAttribute("list")).get(2)%></b><br>
<b>List存储对象:<%=((ArrayList<User>)request.getAttribute("list2")).get(0).getUname()%></b><br>
<b>Map存储普通字符:<%=((Map)request.getAttribute("map")).get("a")%></b><br>
<b>Map存储对象:<%=((User)((Map)request.getAttribute("map2")).get("a")).getUname()%></b><br>
缺点:
- 需要导包
- 需要强制转换数据类型
- 获取数据代码繁琐
EL表达式获取
和传统方法获取数据内容一样
<b>普通字符:${param.uname}</b><br>
<b>普通字符:${str}</b><br>
<b>存储对象:${user.uname}</b><br>
<b>List存储普通字符:${list[2]}</b><br>
<b>List存储对象:${list2[0].uname}</b><br>
<b>Map存储普通字符:${map.a}</b><br>
<b>Map存储对象:${map2.a.uname}</b><br>
EL表达式作用域查找顺序
1、默认查找顺序
会按照如下顺序获取作用域数据(从小到大)
pageContext(min) > request > session > application(max)
session需要重启客户端(浏览器)后才会清空,因此注释掉session.setAttribute以后仍然能获取到作用域数据
application需要重启服务器后才会清空,因此注释掉application.setAttribute并重启浏览器以后以后仍然能获取到作用域数据
2、自定义查找顺序
${pageScope.健名}
${requestScope.健名}
${sessionScope.健名}
${applicationScope.健名}
<h3>作用域的查找顺序</h3>
<%
pageContext.setAttribute("hello","Hello PageContext");
request.setAttribute("hello","Hello Request");
session.setAttribute("hello","Hello Session");
application.setAttribute("hello","Hello Application");
%>
<b>${hello}</b><br>
<b>${pageScope.hello}</b><br>
<b>${requestScope.hello}</b><br>
<b>${sessionScope.hello}</b><br>
<b>${applicationScope.hello}</b><br>
EL表达式运算符
${逻辑运算}
${算数运算}
注意项:+表示算数运算,不表示字符连接,用EL表示字符连接会报错,如果字符为数字,会默认转换为数字进行计算(${1+'2'}结果为3,${1+'a'}直接报错)
<h3>EL的逻辑表达式</h3>
<b>1+2=${1+2}</b><br>
<b>1-2=${1-2}</b><br>
<b>1*2=${1*2}</b><br>
<b>4/3=${4/3}</b><br>
<b>5%3=${5%3}</b><br>
<b>4==2=${4==2}</b><br>
<b>1>2=${1>2}</b><br>
<b>1==1?"男":"女"=${1==1?"男":"女"}</b><br>
<b>4+'3'=${4+'3'}</b><br>
EL表达式空值判断
${empty 键名}
判断对象是否存有数据
User对象为false,因为User对象默认有值,其他类型判断为空
req.setAttribute("s1","");
req.setAttribute("s2",new User());
req.setAttribute("s3",new ArrayList<>());
req.setAttribute("s4",new HashMap<>());
<h3>EL表达式的空值判断</h3>
<b>${empty s1}---${empty s2}---${empty s3}---${empty s4}</b>
EL表达式获取请求头和Cookie数据
${header}------返回所有的请求头数据
${header["键名"]}------返回指定的键名的请求头数据
${headerValues["键名"]}------返回指定的键名(同键不同值)的值的数组
${cookie}------返回存储了所有的cookie对象的map集合
${cookie.键名}------返回指定的cookie对象
${cookie.键名.name}------返回指定的cookie对象存储的数据的键名
${cookie.键名.value}------返回指定的cookie对象存储的数据的值
<h3>EL获取请求头数据和Cookie数据</h3>
<b>header:${header}</b><br>
<b>header:${header["accept-encoding"]}</b><br>
<b>headerValues:${headerValues}</b><br>
<b>accept-language:${headerValues["accept-language"][0]}</b><br>
<b>cookie:${cookie}</b><br>
<b>cookie:${cookie.JSESSIONID}</b><br>
<b>cookieName:${cookie.JSESSIONID.name}</b><br>
<b>cookieValue:${cookie.JSESSIONID.value}</b><br>
JSTL标签库
JSTL作用
提高在jsp中的逻辑代码的编写效率,使用标签
JSTL使用
- 导入jar包
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
pom文件引入;或者直接下载后jar包导入
- 声明jstl标签库的引入
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
uri有多种,引入后可以使用
JSTL核心标签库
引入成功后可以使用核心标签
常用标签:<c:out>、<c:set>、<c:remove>、<c:if>、<c:choose>
标签 | 描述 |
---|---|
<c:out> | 用于在JSP中显示数据,就像<%= ... > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<c:forTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setAttribute("str","学习JSTL!");
%>
<h3>核心标签学习</h3>
<h4>基本标签</h4>
<c:out value="JSTL测试"></c:out><br>
<c:out value="${str}" default="默认值"></c:out><br>
<%--scop可以指定作用域,不指定的话默认为page--%>
<c:set var="hello" value="hello PageContext" scope="page"></c:set>
<c:set var="hello" value="hello Request" scope="request"></c:set>
<c:set var="hello" value="hello Session" scope="session"></c:set>
<c:set var="hello" value="hello Application" scope="application"></c:set>
<c:out value="${hello}"></c:out><br>
<c:out value="${sessionScope.hello}"></c:out><br>
<%--如果不指定作用域,默认删除所有作用域符合var值的数据--%>
<c:remove var="hello" scope="page"></c:remove>
<c:out value="${hello}"></c:out><br>
<h4>逻辑标签</h4>
<%--传统方式if判断--%>
<%
int a = 4;
if (a > 3){
%>
<i>今天天气很热</i>
<%}%><br>
<%--JSTL方式单分支if判断
逻辑判断标签依赖于EL逻辑运算,因此表达式中的涉及到的数据必须从作用域中获取
--%>
<c:set var="a" value="4"></c:set>
<c:if test="${a > 3}">
<i>今天天气很热</i>
</c:if><br>
<%--JSTL多分支语句判断--%>
<c:set var="score" value="55"></c:set>
<c:choose>
<c:when test="${score >= 90}">
<i>成绩优秀</i>
</c:when>
<c:when test="${score >= 80}">
<i>成绩中等</i>
</c:when>
<c:when test="${score >= 70}">
<i>成绩一般</i>
</c:when>
<c:when test="${score >= 60}">
<i>成绩及格</i>
</c:when>
<c:otherwise>
<i>成绩不及格</i>
</c:otherwise>
</c:choose><br>
<%--JSTL循环
begin:声明循环开始位置
end:声明循环结束位置
step:设置步长
varStatus:声明变量记录每次循环的数据(数据存储在作用域中)
${vs.index}:角标
${vs.count}:次数
${vs.first}:是否第一次循环
${vs.last}:是否最后一次循环
items:声明要遍历的对象。结合EL表达式获取对象
var:声明变量记录每次循环的结果
--%>
<%
ArrayList<String> list = new ArrayList<String>();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
request.setAttribute("list",list);
HashMap<String,String> map = new HashMap<String,String>();
map.put("a1","aaaa");
map.put("b1","bbbb");
request.setAttribute("map",map);
%>
<table border="1px">
<tr>
<td>uid</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
</tr>
<%--常量循环--%>
<c:forEach begin="0" end="4" step="1" varStatus="vs">
<tr>
<td>${vs.index}---${vs.count}---${vs.first}---${vs.last}</td>
<td>张三</td>
<td>男</td>
<td>20</td>
</tr>
</c:forEach>
<%--List动态循环--%>
<c:forEach items="${list}" var="str">
<tr>
<td>${str}</td>
<td>${str}</td>
<td>${str}</td>
<td>${str}</td>
</tr>
</c:forEach>
<%--Map动态循环
${m.key} :获取map的键
${m.value}:获取map的值
--%>
<c:forEach items="${map}" var="m">
<tr>
<td>${m.key}</td>
<td>${m.key}</td>
<td>${m.value}</td>
<td>${m.value}</td>
</tr>
</c:forEach>
</table>
JSTL格式化标签库
常用标签:<fmt:formatNumber>、<fmt:formatDate>、<fmt:parseDate>、<fmt:requestEncoding>
标签 | 描述 |
---|---|
<fmt:formatNumber> | 使用指定的格式或精度格式化数字 |
<fmt:parseNumber> | 解析一个代表着数字,货币或百分比的字符串 |
<fmt:formatDate> | 使用指定的风格或模式格式化日期和时间 |
<fmt:parseDate> | 解析一个代表着日期或时间的字符串 |
<fmt:bundle> | 绑定资源 |
<fmt:setLocale> | 指定地区 |
<fmt:setBundle> | 绑定资源 |
<fmt:timeZone> | 指定时区 |
<fmt:setTimeZone> | 指定时区 |
<fmt:message> | 显示资源配置文件信息 |
<fmt:requestEncoding> | 设置request的字符编码 |
JSTLSQL标签库
标签 | 描述 |
---|---|
<sql:setDataSource> | 指定数据源 |
<sql:query> | 运行SQL查询语句 |
<sql:update> | 运行SQL更新语句 |
<sql:param> | 将SQL语句中的参数设为指定值 |
<sql:dateParam> | 将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
<sql:transaction> | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
JSTL函数标签库
函数 | 描述 |
---|---|
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首位的空白符 |
JSTLXML标签库
标签 | 描述 |
---|---|
<x:out> | 与<%= ... >,类似,不过只用于XPath表达式 |
<x:parse> | 解析 XML 数据 |
<x:set> | 设置XPath表达式 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
<x:forEach> | 迭代XML文档中的节点 |
<x:choose> | <x:when>和<x:otherwise>的父标签 |
<x:when> | <x:choose>的子标签,用来进行条件判断 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行 |
<x:transform> | 将XSL转换应用在XML文档中 |
<x:param> | 与<x:transform>共同使用,用于设置XSL样式表 |