EL和JSTL

EL概述

EL的作用

JSP2.0要把html和css分离、要把html和javascript分离、要把Java脚本替换成标签。标签的好处是非Java人员都可以使用。

JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>

EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。包含:取值和输出

EL的格式

格式:${…}

例如:${1 + 2}

关闭EL

如果希望整个JSP忽略EL表达式,需要在page指令中指定isELIgnored=”true”。

如果希望忽略某个EL表达式,可以在EL表达式之前添加“\”,例如:${1 + 2}。

EL运算符:算术 关系 逻辑

运算符说明范例结果
+${17+5}22
-${17-5}12
*${17*5}85
/或div 17 / 5 或 {17/5}或 17/5{17 div 5}3
%或mod取余KaTeX parse error: Expected '}', got 'EOF' at end of input: {17%5}或{17 mod 5}2
==或eq等于 5 = = 5 或 {5==5}或 5==5{5 eq 5}true
!=或ne不等于 5 ! = 5 或 {5!=5}或 5!=5{5 ne 5}false
<或lt小于 3 < 5 或 {3<5}或 3<5{3 lt 5}true
>或gt大于 3 > 5 或 {3>5}或 3>5{3 gt 5}false
<=或le小于等于 3 < = 5 或 {3<=5}或 3<=5{3 le 5}true
>=或ge大于等于 3 > = 5 或 {3>=5}或 3>=5{3 ge 5}false
&&或and并且KaTeX parse error: Expected '}', got '&' at position 6: {true&̲&false}或{true and false}false
!或not ! t r u e 或 {!true}或 !true{not true}false
||或or或者${true
empty是否为空 e m p t y “ ” , 可 以 判 断 字 符 串 、 数 组 、 集 合 的 长 度 是 否 为 0 , 为 0 返 回 t r u e 。 e m p t y 还 可 以 与 n o t 或 ! 一 起 使 用 。 {empty “”},可以判断字符串、数组、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。 empty00trueemptynot!使{not empty “ ”}true

EL不显示null

当EL表达式的值为null时,会在页面上显示空白,即什么都不显示

EL表达式格式

操作List和数组:${list[0]}、${arr[0]}

操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法

操作Map的值:${map.key}、${map[‘key’]},对应map.get(key)。

EL内置对象

EL一共11个内置对象,无需创建即可以使用。这11个内置对象中有10个是Map类型的,最后一个是pageContext对象,这哥们一个顶九个

pageScope

requestScope

sessionScope

applicationScope

param;

paramValues;

initParam;

header;

headerValues;

cookie;

pageContext

域相关内置对象(重点)

域内置对象一共有四个

pageScope:${pageScope.name}等同与pageContext.getAttribute(“name”);

requestScope:${requestScope.name}等同与request.getAttribute(“name”);

sessionScoep: ${sessionScope.name}等同与session.getAttribute(“name”);

applicationScope:${applicationScope.name}等同与application.getAttribute(“name”);

如果在域中保存的是JavaBean对象,那么可以使用EL来访问JavaBean属性。因为EL只做读取操作,所以JavaBean一定要提供get方法,而set方法没有要求。

全域查找:${person}表示依次在pageScope、requesScopet、sessionScope、appliationScope四个域中查找名字为person的属性。

请求头相关内置对象

header和headerValues是与请求头相关的内置对象:

header: Map<String,String>类型,用来获取请求头

headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象,这里就不在赘述。

应用初始化参数相关内置对象

initParam:initParam是Map<String,String>类型。它对应web.xml文件中的参数

Cookie相关内置对象

cookie:cookie是Map<String,Cookie>类型,其中key是Cookie的名字,而值是Cookie对象本身。

pageContext对象

pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest(),可以${pageContext.request}。也就是读取JavaBean属性!!!

*EL表达式**说明*
${pageContext.request.queryString}pageContext.getRequest().getQueryString();
${pageContext.request.requestURL}pageContext.getRequest().getRequestURL();
${pageContext.request.contextPath}pageContext.getRequest().getContextPath();
${pageContext.request.method}pageContext.getRequest().getMethod();
${pageContext.request.protocol}pageContext.getRequest().getProtocol();
${pageContext.request.remoteAddr}pageContext.getRequest().getRemoteAddr();
${pageContext.session.id}pageContext.getSession().getId();
${pageContext.servletContext.serverInfo}pageContext.getServletContext().getServerInfo();

导入函数库

因为是第三方的东西,所以需要导入。导入需要使用taglib指令!

<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>

需要导入jstl的jar包

EL函数库介绍

String toUpperCase(String input):

String toLowerCase(String input):

int indexOf(String input, String substring):

boolean contains(String input, String substring):

boolean containsIgnoreCase(String input, String substring):

boolean startsWith(String input, String substring):

boolean endsWith(String input, String substring):

String substring(String input, int beginIndex, int endIndex):

String substringAfter(String input, String substring):

substringBefore(String input, String substring):

String escapeXml(String input):

String trim(String input):

String replace(String input, String substringBefore, String substringAfter):

String[] split(String input, String delimiters):

int length(Object obj):

String join(String array[], String separator):

JSTL概述

什么是JSTL

JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!

既然是第三方的东西,那么就需要导包

JSTL标签库

JSTL一共包含四大标签库

core:核心标签库,我们学习的重点

fmt:格式化标签库,只需要学习两个标签即可;

sql:数据库标签库,不需要学习了,它过时了

xml:xml标签库,不需要学习了,它过时了

导入标签库

导入标签库需要使用taglib指令!

<%@ taglib prefix=“c” uri=“http://java.sun.com/jstl/core” %>

这东西不用去背,可以把光标放到uri属性位置上,使用Alt+/来查看uri列表,找到其中包含jstl,并且包含core的就是了。

JSTL核心库

out和set(重点)

<c:out value=”aaa”/>输出aaa字符串常量
<c:out value=”${aaa}”/>与${aaa}相同
<c:out value=”${aaa}” default=”xxx”/>当${aaa}不存在时,输出xxx字符串
<%request.setAttribute(“a”,“”);%><c:out value="${a }" default=“xxx” escapeXml=“false” />当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。

set:set标签的var、value、scope是一组,而target、property、value是一组

<c:set var=”a” value=”hello”/>在pageContext中添加name为a,value为hello的数据。
<c:set var=”a” value=”hello” scope=”session”/>在session中添加name为a,value为hello的数据。
<jsp:useBean id=“user” class=“cn.kgc.domain.User”/><c:set target=" u s e r " p r o p e r t y = " u s e r n a m e " v a l u e = " q d m m y 6 " / > < c : s e t t a r g e t = " {user }" property="username" value="qdmmy6"/><c:set target=" user"property="username"value="qdmmy6"/><c:settarget="{user }" property=“password” value=“123456”/><c:out value="${user }" />给user的username属性赋值qdmmy6,给user的password属性赋值123456。

remove

<% pageContext.setAttribute(“a”, “pageContext”); request.setAttribute(“a”, “session”); session.setAttribute(“a”, “session”); application.setAttribute(“a”, “application”); %> <c:remove var=“a”/> <c:out value="${a }" default=“none”/>删除所有域中name为a的数据!
<c:remove var=“a” scope=”page”/>删除pageContext中name为a的数据!

url

url标签会在需要URL重写时添加sessionId,带有输出功能

<c:url value="/"/>输出上下文路径:/day08_01/
<c:url value="/" var=“a” scope=“request”/>把本该输出的结果赋给变量a。范围为request

if和choose(重点)

if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。

<c:set var="a" value="hello"/>
<c:if test="${not empty a }">
	<c:out value="${a }"/>
</c:if>

choose标签对应Java中的if/else if/else结构

when标签的test为true时,会执行这个when的内容。

当所有when标签的test都为false时,才会执行otherwise标签的内容

<c:set var="score" value="${param.score }"/>
<c:choose>
	<c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>
	<c:when test="${score >= 90 }">A级</c:when>
	<c:when test="${score >= 80 }">B级</c:when>
	<c:when test="${score >= 70 }">C级</c:when>
	<c:when test="${score >= 60 }">D级</c:when>
	<c:otherwise>E级</c:otherwise>
</c:choose>

forEach(重点)

forEach当前就是循环标签了,下面例子中设置域变量i,初始值为1,结束值为100。即i的值从1遍历到100,包含100。

<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10">
	<c:set var="sum" value="${sum + i}" />
</c:forEach>
<c:out value="sum = ${sum }"/>
<c:set var="sum" value="0" />
<c:forEach var="i" begin="1" end="10" step="2">
	<c:set var="sum" value="${sum + i}" />
</c:forEach>
<c:out value="sum = ${sum }"/>

还可以使用forEach来遍历数据或集合,遍历数组:

<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
	<c:out value="name: ${item }"/><br/>
</c:forEach>

遍历List

<%
	List<String> names = new ArrayList<String>();
	names.add("zhangSan");
	names.add("liSi");
	names.add("wangWu");
	names.add("zhaoLiu");
	pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
	<c:out value="name: ${item }"/><br/>
</c:forEach>

遍历Map

<%
	Map<String,String> stu = new LinkedHashMap<String,String>();
	stu.put("number", "N_1001");
	stu.put("name", "zhangSan");
	stu.put("age", "23");
	stu.put("sex", "male");
	pageContext.setAttribute("stu", stu);
%>
<c:forEach var="item" items="${stu }">
	<c:out value="${item.key }: ${item.value }"/><br/>
</c:forEach>

forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了。

count:int类型,当前以遍历元素的个数

index:int类型,当前元素的下标;

first:boolean类型,是否为第一个元素;

last:boolean类型,是否为最后一个元素

current:Object类型,表示当前项目

<c:forEach var="item" items="${ns }" varStatus="vs">
	<c:if test="${vs.first }">第一行:</c:if>
	<c:if test="${vs.last }">最后一行:</c:if>
	<c:out value="第${vs.count }行: "/>
	<c:out value="[${vs.index }]: "/>
	<c:out value="name: ${vs.current }"/><br/>
</c:forEach>

fmt标签库常用标签

fmt标签库是用来格式化输出的,通常需要格式化的有时间和数字。

格式化时间:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
......
<%
	Date date = new Date();
	pageContext.setAttribute("d", date);
%>
<fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss"/>

格式化数字:

<%
	double d1 = 3.5;
	double d2 = 4.4; 
	pageContext.setAttribute("d1", d1);
	pageContext.setAttribute("d2", d2);
%>
<fmt:formatNumber value="${d1 }" pattern="0.00"/><br/>
<fmt:formatNumber value="${d2 }" pattern="#.##"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值