一、EL表达式
1、特点
(1)是一个由java开发的工具包
(2)用于从特定域对象中读取并写入到响应体开发任务,不能向域对象中写入。
(3)EL工具包自动存在Tomcat的lib中(el-api.jar),开发是可以直接使用,无需其他额外的包。
(4)标准格式 : ${域对象别名.。关键字} 到指定的域中获取相应关键字的内容,并将其写入到响应体。
2、域对象
jsp | el | 描述 |
---|---|---|
application | applicationScope | 全局作用域对象 |
session | sessionScope | 会话作用域 |
request | requestScope | 请求作用域对象 |
pageContext | pageScope | 当前页作用域对象 |
注:使用时可以省略域对象别名
默认查找顺序: pageScope -> requestScope -> sessionScope -> applicationScope
最好只在pageScope中省略
注:对应案例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jsp</title>
</head>
<body>
<%
application.setAttribute("name","application");
session.setAttribute("name","session");
request.setAttribute("name","request");
pageContext.setAttribute("name","pageContext");
%>
<br>--------------------使用java语言---------------------------<br>
application中的值:<%= application.getAttribute("name") %> <br>
session中的值:<%= session.getAttribute("name") %> <br>
request中的值:<%= request.getAttribute("name") %> <br>
pageContext中的值:<%= pageContext.getAttribute("name") %> <br>
<br>--------------------使用EL表达式---------------------------<br>
application中的值:${applicationScope.name} <br>
session中的值:${sessionScope.name} <br>
request中的值:${requestScope.name} <br>
pageContext中的值:${pageScope.name} <br>
<br>----------------使用EL表达式,省略域对象---------------------<br>
application中的值:${name} <br>
</body>
</html>
3、支持的运算
(1)数学运算
(2)比较运算 > gt < lt >= ge <= le == eq != !=
(3)逻辑预算 && || !
注:对应案例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL运算</title>
</head>
<body>
<%
request.setAttribute("num1","12");
request.setAttribute("num2","14");
application.setAttribute("flag1",true);
application.setAttribute("flag2",false);
%>
<br>--------------------使用java语言---------------------------<br>
<%
String num1 = (String)request.getAttribute("num1");
String num2 = (String)request.getAttribute("num2");
int num3 = Integer.parseInt(num1) + Integer.parseInt(num2);
boolean flag1 = (Boolean) application.getAttribute("flag1");
boolean flag2 = (Boolean) application.getAttribute("flag2");
boolean flag3 = flag1 && flag2;
//输出方式一
out.write(Boolean.toString(flag3));
%>
<!-- 输出方式二 -->
<h1><%=num3%></h1>
<br>--------------------使用EL表达式--------------------------<br>
<h1>${ requestScope.num1 + requestScope.num2 }</h1>
<h1>${ requestScope.num1 > requestScope.num2 }</h1>
<h1>${ applicationScope.flag1 && applicationScope.flag2 }</h1>
</body>
</html>
4、其他的内置对象
(1)param 使用 ${param.请求参数名} 从请求参数中获取参数内容
(2)paramValues 使用 ${ paramValues.请求参数名 } 从请求参数中获取多个值,以数组的形式
(3)initParam 使用 ${ initParam.参数名 } 获取初始化参数
注:对应案例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>其他内置对象</title>
</head>
<body>
url: ...?username=zhangsan&password=admin <br>
url中的参数: 用户名:${param.username} ---- 密码:${param.password} <br>
-------------------------------------------------------------------------------------- <br>
url: ...?username=zhangsan&username=lisi <br>
url中的参数: 用户1:${paramValues.username[0]} -- 用户2:${paramValues.username[1]} <br>
---------------------------------------------------------------------------------- <br>
<!--
在web.xml中添加启动参数
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
-->
获取启动参数:${initParam.driver}
</body>
</html>
5、EL表达式的缺陷
(1)只能读取域对象中的值,不能写入
(2)不支持if判断和控制语句
二、JSTL标签工具类
1、基本介绍
(1) JSP Standrad Tag Lib jsp标准标签库
(2) 是sun公司提供
(3)组成
核心标签 对java在jsp上基本功能进行封装,如 if while等 主要学习
sql标签 JDBC在jsp上的使用
xml标签 Dom4j在jsp上的使用
format标签 jsp文件格式转换
(4)使用原因:使用简单,且在JSP编程当中要求尽量不出现java代码。
2、使用方式
(1)导入依赖的jar包 jstl.jar standard.jar
(2)在jsp中引入JSTL的core包依赖约束
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3、重要标签的使用
(1) <c:set>
在JSP文件上设置域对象中的共享数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title> c:set </title>
</head>
<body>
<!--
相当于
<%-- <% --%>
<%-- request.setAttribute("name","zhangsan");--%>
<%-- %> --%>
-->
<c:set scope="request" var="name" value="zhangsan" />
通过JSTL标签添加的作用域中的值:${requestScope.name} <br>
<c:set scope="application" var="name" value="lisi" />
通过JSTL标签添加的作用域中的值:${applicationScope.name} <br>
<c:set scope="request" var="name" value="wangwu" />
通过JSTL标签添加的作用域中的值:${requestScope.name} <br>
<c:set scope="page" var="name" value="zhaoliu" />
通过JSTL标签添加的作用域中的值:${pageScope.name} <br>
</body>
</html>
(2)<c:if >
控制哪些内容能够输出到响应体
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title> c:if </title>
</head>
<body>
<c:set scope="page" var="age" value="20"/>
<br>------------------------------使用java语言-------------------------------------<br>
<%
if( Integer.parseInt((String)pageContext.getAttribute("age")) >= 18 ){
%>
输入:欢迎光临!
<% } else { %>
输入:未满十八,不准入内!
<% } %>
<br>------------------------------使用JSTL标签-------------------------------------<br>
<c:if test="${ age ge 18 }">
输入:欢迎光临!
</c:if>
<c:if test="${ age lt 18 }">
输入:未满十八,不准入内!
</c:if>
</body>
</html>
(3)<c:choose>
在jsp中进行多分支判断,决定哪个内容写入响应体
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title> c:choose </title>
</head>
<body>
<c:set scope="page" var="age" value="6"/>
<br>------------------------------使用java语言-------------------------------------<br>
<%
if( Integer.parseInt((String)pageContext.getAttribute("age")) == 18 ){
%>
输入:您今年成年了
<% } else if( Integer.parseInt((String)pageContext.getAttribute("age")) > 18 ){ %>
输入:您已经成年了
<% } else {%>
输出:您还是个孩子
<% } %>
<br>------------------------------使用JSTL标签-------------------------------------<br>
<c:choose>
<c:when test="${age eq 18}">
输入:您今年成年了
</c:when>
<c:when test="${age gt 18}">
输入:您已经成年了
</c:when>
<c:otherwise>
输入:您还是个孩子
</c:otherwise>
</c:choose>
</body>
</html>
(3)<c:forEach>
循环遍历
使用方式
<c:forEach var="申明循环变量的名称" begin="初始化循环变量"
end="循环变量可以接受的最大值" step="循环变量的递增或递减值">
*** step属性可以不写,默认递增1
*** 循环变量默认保存在pageContext中
</c:forEach>
例子
<%@ page import="com.zn.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title> c:forEach </title>
</head>
<body>
<%
pageContext.setAttribute("students",new ArrayList(){{
add(new Student("s1","zhangsan",16));
add(new Student("s2","lisi",19));
add(new Student("s3","wangwu",15));
}});
pageContext.setAttribute("stuMap", new HashMap(){{
put("m1",new Student("s1","zhangsan",16));
put("m2",new Student("s2","lisi",18));
put("m3",new Student("s3","wangwu",15));
}});
%>
<br>------------------------使用java语言------------------------------<br>
<table>
<tr><td>学号</td><td>姓名</td><td>年龄</td></tr>
<%
List<Student> stus = (ArrayList<Student>)pageContext.getAttribute("students");
for (int i = 0; i < stus.size(); i++) {
%>
<tr><td><%=stus.get(i).getSid()%></td>
<td><%=stus.get(i).getName()%></td>
<td><%=stus.get(i).getAge()%></td>
</tr>
<% } %>
</table>
<br>----------------------使用JSTL标签读取list-----------------------<br>
<table>
<tr><td>学号</td><td>姓名</td><td>年龄</td></tr>
<c:forEach var="student" items="${students}">
<tr><td>${student.sid}</td>
<td>${student.name}</td>
<td>${student.age}</td>
</tr>
</c:forEach>
</table>
<br>---------------------使用JSTL标签读取map------------------------<br>
<table>
<tr><td>学号</td><td>姓名</td><td>年龄</td></tr>
<c:forEach var="student" items="${stuMap}">
<tr>
<td>${student.key}</td>
<td>${student.value.sid}</td>
<td>${student.value.name}</td>
<td>${student.value.age}</td>
</tr>
</c:forEach>
</table>
<br>--------------使用JSTL标签读取指定for循环-----------------------<br>
<select>
<c:forEach var="item" begin="1" end="10" step="1">
<option> ${item} </option>
</c:forEach>
</select>
</body>
</html>
其中使用的javaBean
/**
* @author zn
* @date 2020/1/24
*/
public class Student {
private String sid;
private String name;
private int age;
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String sid, String name, int age) {
this.sid = sid;
this.name = name;
this.age = age;
}
}