I. EL
- EL(Expression Language,表达式语言):主要用来代替 JSP 中脚本的功能,简化对 Java 代码的操作。
- 语法:
${表达式}
1. EL 获取域中的值
a. 语法
i. 标准语法
${pageScope.键名}
:
从 page 域中获取指定键名对应的值。
${requestScope.键名}
:
从 request 域中获取指定键名对应的值。
${sessionScope.键名}
:
从 session 域中获取指定键名对应的值。
${applicationScope.键名}
:
从 servletContext 域中获取指定键名对应的值。
ii. 简化语法
${键名}
:
默认从最小域开始找,找到后直接显示,不在继续寻找。
要求四个域键名唯一。
iii. 代码示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<h3>el表达式基本语法</h3>
<%
request.setAttribute("username", "Regino");
request.setAttribute("age", 21);
session.setAttribute("sex", "男");
application.setAttribute("address", "HK");
%>
<h5>标准语法</h5>
${pageScope.username}<br> <%--不会出现空指针异常问题--%>
${requestScope.age}<br>
${sessionScope.sex}<br>
${applicationScope.address}<br>
<h5>简化语法</h5>
${username}<br>
${age}<br>
${sex}<br>
${address}<br>
</body>
</html>
b. 获取 JSP 动态资源
- 获取字符串:
${键名}
之前的内容已经介绍过了。
- 获取对象(User):
${键名.属性名}
属性名必须和实体类中的 get 方法返回的变量名称一致。
el 不会出现 null 和索引角标越界问题。
遍历要用到 JSTL 标签库,详情可见 。
- 获取 List(Array)集合:
${键名[索引]}
- 获取 Map 集合:
${键名.key}
${键名["key"]}
i. 获取对象
package com.company.up.domain;
public class User {
private String name;
private String sex;
private Integer age;
public User() {
}
public User(String name, Integer age, String sex) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<h3>获取user对象</h3>
<%
User user = new User("Regino", 21, "男");
request.setAttribute("user", user);
%>
${user}<br><%--执行该对象的toString方法--%>
${user.name} | ${user.age} | ${user.sex}<br>
</body>
</html>
ii. 获取 List 集合
<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<h3>获取list集合</h3>
<%
List<Object> list = new ArrayList<>();
list.add("胖虎");
list.add("小夫");
list.add("静香");
User user = new User("Regino", 21, "男");
list.add(user);
request.setAttribute("list", list);
%>
${list}<br><%--执行该对象的toString方法--%>
${list[0]} | ${list[1]} | ${list[2]} | ${list[3].name} | ${list[10]}<br> <%--el表达式不会出现 集合(数组)角标越界异常--%>
</body>
</html>
iii. 获取 Map 集合
<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<h3>获取map集合</h3>
<%
Map<String, Object> map = new HashMap<>();
map.put("key1", "胖虎");
map.put("key2", "小夫");
map.put("key3", "静香");
User user = new User("Regino", 21, "男");
map.put("key.4", user);
request.setAttribute("map", map);
%>
${map}<br><%--执行该对象的toString方法--%>
${map.key1} | ${map.key2} | ${map.key3} | ${map["key.4"].name}<br>
</body>
</html>
2. EL 执行运算
a. 语法
- 算数运算符:
语法: +
-
*
/
(div
) %
(mod
)
可以用单词也可以用符号
- 比较运算符:
语法:>
<
>=
<=
==
(eq
) !=
(ne
)
- 逻辑运算符:
语法:&&
(and
) ||
(or
) !
(not
)
- 三元运算符:
语法:${条件表达式?为真:为假}
- 空运算符:
语法:${not empty 对象}
功能:
可以判断字符串和对象是否为空
可以判断一个集合的长度是否为 0
b. 代码示例
<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<%
int a = 4;
int b = 3;
request.setAttribute("a", a);
request.setAttribute("b", b);
%>
<h5>算数运算符</h5>
${a / b} | ${a div b}<br>
${a % b} | ${a mod b}<br>
<h5>比较运算符</h5>
${a == b} | ${a eq b}<br>
${a !=b } | ${a ne b}<br>
<h5>三元运算符</h5>
${a == b ? "a相等于b" : "a不等于b"}<br>
<h5>非空判断</h5>
<%
User user = new User();
request.setAttribute("user", user);
List list = new ArrayList();
list.add("aa");
request.setAttribute("list", list);
%>
user对象:${not empty user}<br> <%-- if(user !=null ){} --%>
list集合:${not empty list}<br> <%-- if(list !=null && list.size>0 ){}--%>
<h5>空值判断</h5>
user对象:${empty user}<br> <%-- if(user ==null ){} --%>
list集合:${empty list}<br> <%-- if(list ==null || list.size==0 ){}--%>
</body>
</html>
3. EL 隐式对象
a. 常用隐式对象
- EL 表达式中有 11 个隐式对象。比较常用的有:
- pageContext
就是 JSP 9 个内置对象之一,可以获得其他 8 个内置对象。
- cookie
可以获取浏览器指定 Cookie 名称的值。
b. 代码示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<h3>el 隐式对象</h3>
${pageContext.request.contextPath} 动态获取:项目名称(虚拟路径)<br>
${cookie.JSESSIONID.value} 获取指定cookie名称的值...<br>
</body>
</html>
4. EL 版本支持
- JSP 默认支持 EL 表达式。
- Servlet 2.3 规范中,默认不支持 EL 表达式。
5. 忽略 EL 表达式
a. 语法
- 忽略当前 JSP 页面中所有的 EL 表达式:
设置 JSP 中 page 指令中 isELIgnored="true"
属性
- 忽略单个 EL 表达式:
\${表达式}
b. 代码示例
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<h3>el 隐式对象</h3>
${pageContext.request.contextPath} 动态获取:项目名称(虚拟路径)<br>
\${cookie.JSESSIONID.value} 获取指定cookie名称的值...<br>
</body>
</html>
II. JSTL
- Jsp(Jsp Standard Tag Library,标准标签库):是由 Apache 组织提供的开源的 JSP 标签库,用于替换和简化 JSP 页面中 Java 代码的编写。
1. JSTL 标签库
- JSTL 标准标签库有 5 个子库,但随着发展,目前常使用的是它的核心库(Core)。
标签库 |
标签库的 URI |
前缀 |
Core |
http://java.sun.com/jsp/jstl/core |
c |
国际化(几乎不用) |
http://java.sun.com/jsp/jstl/fmt |
fmt |
SQL(过时) |
http://java.sun.com/jsp/jstl/sql |
sql |
XML(过时) |
http://java.sun.com/jsp/jstl/xml |
x |
Functions(几乎不用) |
http://java.sun.com/jsp/jstl/functions |
fn |
2. Core 标签使用步骤
a. 当前 web 项目引入 Jar 包
b. 当前 JSP 页面 tablib 指令引入
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3. 常用 Core 标签
a. c:if 标签
c:if
标签相当于 Java 中的 if(){}
。
i. 语法
<c:if test="boolean值"></c:if>
。
- true:显示标签体内容;
- false:隐藏标签体内容。
- 通常与 EL 表达式一起使用
- 注意:此标签没有 else 功能,如果想实现 else 效果,要让条件取反。
ii. 代码示例
<%@ page import="com.company.up.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<%
User user = new User();
%>
<c:if test="${empty user}">
你好,请登录...
</c:if>
<c:if test="${not empty user}">
你好,${user.name}
</c:if>
</body>
</html>
b. c:forEach 标签
c:forEach
标签相当于 Java 中的 for 循环
。
i. 普通 for 循环
for(int i=1; i<=5; i++){
i
}
<c:forEach begin="1" end="5" step="1" var="i">
${i}
</c:forEach>
begin="1"
:起始值(包含);
end="5"
:结束值(包含);
step="1"
:步长为 1;
var="i"
:当前输出临时变量。
ii. 增强 for 循环
for(User user : list){
user
}
<c:forEach items="${list}" var="user" varStatus="vs">
${user}
</c:forEach>
items="list"
:集合;
var="user"
:当前输出的临时变量;
varStatus="vs"
:变量状态,vs 表示 1 个对象,用于在增强 for 中取出索引,有 2 个属性:
index
:当前索引,从 0 开始;
count
:计数器,从 1 开始。
iii. 代码示例
<%@ page import="com.company.up.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<h3>普通for循环</h3>
<c:forEach begin="1" end="5" step="1" var="i"> <%--for循环将临时变量存储到了 pageContext域空间--%>
${i}<br>
</c:forEach>
<h3>增强for循环</h3>
<%
List<User> list = new ArrayList<>();
list.add(new User("Regino", 21, "男"));
list.add(new User("Reggie", 23, "女"));
list.add(new User("Reginald", 20, "中"));
request.setAttribute("list", list);
%>
<c:forEach items="${list}" var="user" varStatus="vs">
索引:${vs.index} | 计数器: ${vs.count} | ${user.name}<br>
</c:forEach>
</body>
</html>
c. c:choose 标签
i. 语法
c:choose
标签相当于 Java 中的 switch 语句
<c:choose>
:等价于 switch;
<c:when>
:等价于 case + break;
<c:otherwise>
:等价于 default。
ii. 代码示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>demo.jsp</title>
</head>
<body>
<h3>choose标签</h3>
<%
Integer face = 10;
request.setAttribute("face", face);
%>
<c:choose>
<c:when test="${face <= 7}">
普通
</c:when>
<c:when test="${face == 8 || face == 9}">
明星
</c:when>
<c:when test="${face == 10}">
倾城
</c:when>
<c:otherwise>
外星人
</c:otherwise>
</c:choose>
</body>
</html>
原文链接:https://qwert.blog.csdn.net/article/details/105698202