梦入琼楼寒有月,行过石树冻无烟

JSP Expression Language与Java Server Pages Standard Tag Library

介绍表达式语言(Expression Language)和JSP标准标签库(Java Sever Pages Standard Tag Libray),在Java Server Pages页面之中, 可以显示逻辑,由于一般页面之中会夹杂很多HTML与Java的代码会给开发维护人员造成困难,这时可以使用EL来访问和处理应用程序数据,减少了Java的代码块使用。

EL(Expression Language)

EL是JSP2.0规范之中的语言,基本语法和PHP代码风格相似,如:

1
${code}

EL语句中的表达式会被直接显示到浏览器中进行显示,可通过isLIgnored属性来查看是否支持EL的表达式,当返回false时即JSP可以使用EL表达式,如isELIgnored属性微true时则JSP页面不能使用EL表达式输出,但会将原有EL表达式转换为字符串字符串进行输出。

错误处理机制

Expression Language中存在一个对开发人员非常友好的错误处理机制,那就是当Java Server Pages页面中Expression Language语法是不会报错的,如果出错则在Java Server Pages中不会出现。则不会像Eclipse web内置服务器中启动时的红色状态提醒,相比只想Expression Language简直对开发人员非常友好。

EL 常量与操作符

常量

Expression Language与其他开发语言一样,常量中包含布尔、整数、浮点数、字符串以及NULL等,其在Java Server Pages页面中可以通过Expression Language语法进行定义如:

1
${"Hello,world!"}

数组

在Java Server pages中,可以使用Expression Language来去除数组中的元素,可通过:

1
${array[0]}

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page isELIgnored="false" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Expression Language</h1>
<%
String dogs[] = {"jiangxue","zhongshan","sif"};
request.setAttribute("array",dogs);
%>

${array[0]}
</body>
</html>

运算符

Expression Language与通常的开发语言一样,可通过el进行运算符进行计算:

算数运算符
ID DA FA
+ 加法 ${1+1}
- 减法 ${2-1}
× 乘法 ${1*2}
/ 除法 ${1/2}
% 求余 ${1%2}
关系运算符
ID DA FA
== 等于 eq
!= 不等于 ne
< 小于 lt
> 大于 gt
<= 小于或等于 le
>= 大于或等于 ge
逻辑运算符
ID DA FA
&& 逻辑与 and
ll 逻辑或 or
! 逻辑非 not

隐含对象

在Java Server Pages Expression Language隐含对象共有11个,而常用的隐含对象则有:```pageScope、requestScope、sessionScope、applicationScope、param和param Values。

作用范围

通常,常用的Expression Language的隐含对象分别微:pageScope、requestScope、sessionScope、applicationScope,分别可以对Java Server Pages获取内置对象pageContext、request、session、application中的数据。

param

param对象可用于获取请求参数值,本书主要分为NewFile.jsplogin.jsp,NewFile.jsp用于提交,login.jsp主要用于获取NewFile.jsp中的值。

NewFile.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page isELIgnored="false" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Expression Language NewFile</h1>
<form action="login.jsp" method="post">
<input type = "text" name = "user" id = "user">
<button type="sumbit">up</button>
</form>
</body>
</html>

login.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Expression Language login</h1>
${param.user}
</body>
</html>
pageContext

pageContext即页面上下文对象,可用于访问Java Server Pages中内置对象中的```request、response、out、session、exception、page、servletContext,获取相关的属性。

ID DA FA
pageContext.request.serverPort 当前端口 request
pageContext.response.contentType 页面编码 response
pageContext.out.bufferSize 访问out对象 out
pageContext.session.maxInactiveInterval 访问session 对象 session
pageContext.exception.message 访问exception 对象 exception
pageContext.servletContext.contextPath 当前工作目录 servletContext

JSTL (Java Server Pages Standard Tag Library)

JSTL是Sun公司进行制定的规范,由Apache Jarkarta小组进行负责并实现,JSTL由标准标签库由五个不同功能的标签库所组成。

<c:out>

<c:out>标签可以用来显示一个过大是的结果,与<%= %>作用相似。,在Java Server Pages Stajdard Tag Library<c:out>由如下属性:

ID DA FA
value 输出内容
default 默认输出值
escapeXml 是否忽略xml特殊字符

使用JSTL 输出文字

添加环境

在编写JSTL(Java Server Pages Standard Tag Library)时,可使用Tomcat或直接使用语法进行引用,本书仅使用第二种进行演示,以下语法主要插入在第二行之中:

1
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

如:

1
2
3
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
value

value在Java Server Pages Standard Tag Library中可以输出指定的内容,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
<title>c:out</title>
</head>
<body>
<h1>Java Server Pages Standard Tag Library</h1>
<c:out value="Hello">
defaultValue
</c:out>
</body>
</html>
default

在Java Server Pages Standard Tag Library中的default主要用于当value中值不存在时,就会输出default中的数据,即默认输出值:

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
<title>c:out</title>
</head>
<body>
<h1>Java Server Pages Standard Tag Library</h1>
<c:out value="${param.data}" default="Value No data" />
</body>
</html>

<c:set> 与 <c:remove> 即赋值与删除赋值

<c:set>主要在Java Server Pages Standard Tag Library中主要用于设置作用域变量,也可设置JavaBean属性:

赋值

将value 赋值给变量Name,其主要通过<c:set>进行赋值,之后${}进行获取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
<title>c:out</title>
</head>
<body>
<h1>Java Server Pages Standard Tag Library</h1>
<c:set value="sif" var="Name" scope="session"/>

<!-- 获取变量 -->
${Name}
</body>
</html>

其主要相当于Java中的:

1
<% session.setAttribute("Name","sif"); %>

删除赋值 (<c:remove>)

<c:remove>主要可以进行删除某个变量,可以写为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
<title>c:out</title>
</head>
<body>
<h1>Java Server Pages Standard Tag Library</h1>
<c:set value="sif" var="Name" scope="session"/>
<!-- remove Name -->
<c:remove var="Name" scope="session"/>
${Name}
</body>
</html>

流程控制标签

<c:if> / <c:else>

在Java Server Pages Standard Tag Library中,可以使用<c:if>来实现if语句,其中条件表达式可以是EL、JSP等。如果满足则执行<c:if>中的code,如果不满足则会使用<c:esle>中的code,但这也只仅仅是给想法,<c:else> 不在JSTL中存在
如果像实现在条件成立时执行一块code,不成立时执行的code,则可以使用:<c:choose>、<c:when>以及<c:otherwise>标签,格式如下:

1
2
3
4
5
6
7
8
9
10
11
<c:choose>
<c:when test="条件1">
// code
</c:when>
<c:when test="条件2">
// code
</c:when>
<c:otherwise>
表达式不正确时,执行主体
</c:otherwise>
</c:choose>

if……if……else

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
<title>c:out</title>
</head>
<body>
<h1>Java Server Pages Standard Tag Library</h1>
<c:set value="sun" var="user" scope="page"/>
<c:choose>
// 满足li时执行
<c:when test="${user == 'li'}">
<c:out value="li"/>
</c:when>
// 满足sun时执行
<c:when test="${user == 'sun'}">
<c:out value="sun"/>
</c:when>
// 都不满足时执行
<c:otherwise>
<c:out value="other"/>
</c:otherwise>
</c:choose>
</body>
</html>

循环标签

<c:forEach>

<c:forEach>标签可以用于在Java Server Pages Standard Tag Library中实现for循环。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@ page language="java" import="java.util.*"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title>c:out</title>
</head>
<body>
<h1>Java Server Pages Standard Tag Library</h1>
<%
List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
request.setAttribute("list",list);
%>
<c:forEach items="${requestScope.list}" var="keyword" varStatus="id">
${id.index } ${keyword }<br>
</c:forEach>

</body>
</html>

其他标签

<e:forTokens>

<e:forTokens>标签主要用于分割字符串,其主要可通过":"来实现字符串的分割:

1
2
3
<c:forTokens items="one:two:three" delims=":" var="name">
${name}<br>
</c:forTokens>
URL标签

在Java Server Pages Standard Tag Library中,主要提供来三种URL操作的相关标签,分别为<c:url>、<c:redirect>、<c:import>

ID DA FA
<c:url> 标签主要构建一个url地址
<c:param> 指定url地址传递参数
<c:redirect> 主要用于重定向其他url,即直接跳转:
<c:url>
ID DA FA
value 指定构造URL
var 指定报构造的url保存到范围域中的属性名称
scope 指定构造url保存到范围域中
context 指定url地址所属到同一web下
1
2
<h1>Java Server Pages Standard Tag Library</h1>
<a href="<c:url value="http://zsdk.org.cn/"/>">Up zsdk.org.cn</a>

其中,<c:url>标签主要构建一个url地址,可通过上述或以下写法进行编写:

1
2
<c:url value="http://zsdk.org.cn/" var="gourl"/>
<a href="${gourl}">up zsdk.org.cn</a>
<c:param>

<c:param>标签向指定url地址传递参数:

1
2
3
4
5
<c:url value="http://zsdk.org.cn/" var="gourl" context="/src" scope="page">
<c:param name="user" value="chenheng"/>
<c:param name="pass" value="pass"/>
</c:url>
<a href="${gourl}">go url</a>
<c:redirect>

<c:redirect>主要在Java Server Pages Standard Tag Library 主要用于重定向其他url,即直接跳转:

1
2
<c:url value="http://zsdk.org.cn/" var="gourl"/>
<c:redirect url="${gourl }"/>
⬅️ Go back