文章目录
EL & JSTL
1、EL
1.1、介绍
-
EL与JSTL作用:简化JSP文件上java代码开发步骤
-
JSP主要开发任务:将域对象中数据读取并写入到响应体
-
在JSP文件上使用java命令,将域对象中数据读取并写入到响应体开发步骤:
- 代码演示
<% String value =(String)request.getAttribute("key"); //out.write(value) %> <%=value%>
- 从域对象读取数据
- 对得到数据进行类型转换
- 将最终结果写入到响应体
1.2、EL工具包及其格式
- 是一个由java开发工具包
- 专门用于从域对象读取数据斌写入到响应体开发任务
- 语法格式:路径格式. 类似于jquery中选择器和过滤器
- EL工具包自动存在Tomcat中lib(el-api.jar)
- 开发时,可以直接使用不需要额外导包
EL的标准格式:
${域对象别名.关键字}
:到指定域对象读取对应关键字的内容,并将自动将内容写入响应体
1.3、域对象及其别名
jsp文件中的域对象
- application:全局作用域对象
- session:会话作用域对象
- request:请求作用域对象
- pageContext:当前页作用域对象
图示:
个人理解:
一般application存不用变动的值;(用户共存)
session存用户的登录信息,一般打开浏览器就会出现,只要你不关闭浏览器,他还是他,这也就是说,比如你在bilibili上登录了账号,你关闭了bilibili,这时候你在打开,不用再登录了。(所以,你在写退出功能的servlet时,要把它删掉)
request到了页面之后,如果没有被转发,它就消亡了。我们可以将一些信息存到request里,然后转发出去
EL表达式域对象别名
JSP | EL |
---|---|
application | applicationScope |
session | sessionScope |
request | requestScope |
pageContext | pageScope |
用法演示
<%
pageContext.setAttribute("id",1);
request.setAttribute("name","李太白");
session.setAttribute("age",18);
application.setAttribute("home","神州天河");
%>
<pre>
编号:${pageScope.id}
名字:${requestScope.name}
年龄:${sessionScope.age}
籍贯:${applicationScope.home}
</pre>
2、EL表达式的使用
2.1、输出数据类型
将基本数据类型写入响应体
<%
pageContext.setAttribute("id",1);
request.setAttribute("name","李太白");
session.setAttribute("age",18);
application.setAttribute("home","神州天河");
%>
<pre>
编号:${pageScope.id}
名字:${requestScope.name}
年龄:${sessionScope.age}
籍贯:${applicationScope.home}
</pre>
写入高级对象属性写入到响应体
${域对象别名.关键字.属性名}
- EL表达式使用反射机制,通过调用当前属性对应的get方法读取属性内容
<%@ page import="been.Student" %><%--
Created by IntelliJ IDEA.
User: 铭先生
Date: 2022/3/22
Time: 22:51
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
Student stu =new Student("1","jack");
session.setAttribute("stus",stu);
%>
<pre>
编号:${sessionScope.stus.id}
名字:${sessionScope.stus.name}
</pre>
2.2、EL表达式简化版
${关键字}:可以省略域对象别名
简化版工作原理
- 首先到[pageContext]定位关键字,如果有就读取输出并结束执行
- 如果[pageContext]没有找到关键字,到[request]定位关键字如果有就读取输出并结束
- 如果[requestt]没有找到关键字,到[session]定位关键字如果有就读取输出并结束
- 如果[session]没有找到关键字,到[application]定位关键字如果有就读取输出并结束
- 如果[application]没有找到关键字,返回null
弊端
-
增加运行时间
- 比如数据存放在application。使用
${key}
- 执行轨迹
- pageContext–request–session–application
- 比如数据存放在application。使用
-
定位错误
使用场景
专门为pageContext读取数据并写入响应体做准备
2.3、EL表达式的运算
- 数学运算
- 关系运算 > >= < <= == !=
- 运算符的别名: gt(>) ge(>=) lt(<) le(<=) eq(==) !=(!=)
- 逻辑运算 && || !
数学运算
<%--
Created by IntelliJ IDEA.
User: 铭先生
Date: 2022/3/23
Time: 9:35
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
pageContext.setAttribute("key1","100");
pageContext.setAttribute("key2","200");
%>
<%
String num1 =(String) pageContext.getAttribute("key1");
String num2 =(String) pageContext.getAttribute("key2");
int sum =Integer.valueOf(num1)+Integer.valueOf(num2);
%>
<pre>
java代码书写:<%=sum%>
EL表达式书写:${key1+key2}
<%--EL表达式判断有加号,会对其做一个自动类型装换--%>
</pre>
关系运算
EL表达式内没有控制语句,使用用三目运算符
<%--
Created by IntelliJ IDEA.
User: 铭先生
Date: 2022/3/23
Time: 9:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
pageContext.setAttribute("age",23);
%>
<%
Integer age =(Integer) pageContext.getAttribute("age");
if(age>18){
out.write("欢迎光临");
}else{
out.write("未成年人不能进入!");
}
%>
${age ge 18?"欢迎光临":"未成年人不能进入!"}
2.4、EL表达式其他内置对象
param
-
[使用]:
${param.请求参数名}
-
[作用]: 读取请求协议包中参数内容
-
[代替]:
String value =request.getParameter("请求参数名"); out.write(value);
-
使用演示:
<%--index_6.jsp?id=1&name=admin--%>
<pre>
id:${param.id}
name:${param.name}
</pre>
paramValues
-
[作用]:读取请求协议包中关联对各值的请求参数,将参数内存保存到数组
-
[使用]:
${paramValues.请求参数名}
-
[代替]:
String array[] =request.getParamValues("ck");
- 使用演示:
<pre>
<%--index_6.jsp?empNo=1&empNo=2--%>
0:${paramValues.empNo[0]}
1:${paramValues.empNo[1]}
</pre>
initParam
- [代替]:
String value =application.getInitParameter("driver");
out.write(value)
- [使用]:
${initparam.共享数据名}
拓展:路径
相对路径与绝对路径的区别
- 相对路径:以当前文件位置为起点,定位其他的资源文件
- 绝对路径:以网站根目录为起点,定位其他的资源文件
3、EL表达式缺陷
- 只能读取域对象数据,不能向域对象中写入数据更改数据
- 不支持控制语句 if判断 while循环
- 如果单独使用EL表达式,无法确保JSP文件的java命令被替换
4、JSTL标签工具类
4.1、介绍
- JSTL:jsp standrad Tag Lib;JSP中标准的标签工具类
- 是SUN公司提供
- 组成:
- 核心标签:java在jsp上基本功能的封装 if while
- sql标签:JDBC在JSP上使用功能
- xml标签:DOM4J在JSP使用功能
- Format标签:JSP文件格式转换
4.2、配置:
配置
- 导入以来jar:
jstl.jar
、standrad.jar
- 在JSP文件引入JSTL中core包依赖约束
<%@ taglib url="http://java.sun.com/jsp/jstl/core" prefix="c"%>
4.3、标签的使用
-
<c:set>
:-
[作用]:在JSP文件上设置域对象中共存数据
-
[使用]:
<c:set scope="session" var="key" value="10"/>
(可以自闭合标签也可以双标签) -
[代替]:
<% session.setAttribute("key","10"); %>
-
[属性]:
-
scope
:指定操作的域对象别名scope="application/session/request/page"
-
var
:声明域对象中关键字 -
value
:存入的共享数据
-
-
代码演示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <c:set scope="application" var="id" value="18"></c:set> <c:set scope="session" var="name" value="李太白"></c:set> <c:set scope="request" var="phone" value="135243121"></c:set> <c:set scope="page" var="address" value="神州天河"></c:set> <pre> 学号:${applicationScope.id} 名字:${sessionScope.name} 手机:${requestScope.phone} 地址:${pageScope.address} </pre>
- 练习
-
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="C"%>
<c:set scope="request" var="age" value="23"></c:set>
<%--两年后--%>
<c:set scope="request" var="age" value="${requestScope.age+2}"></c:set>
两年后:${age}
<c:if>
:- [作用]:在JSP文件上控制哪些内容可以写入响应体
- [使用]:
<c:if test="通过EL表达式进行判断">
内容
</c:if>
练习
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set scope="session" var="age" value="23"></c:set>
<c:if test="${sessionScope.age ge 18}">
<font color="red">您超过了${sessionScope.age-18}年,欢迎光临</font>
</c:if>
<c:if test="${sessionScope.age le 18}">
<font color="blue">过几年再来</font>
</c:if>
<c:choose>
:- [作用]:在JSP文件上实现多分支选择判断,决定哪一个内容能写入到响应体
- [使用]
<c:choose>
<c:when test="EL表达式进行判断">内容1</c:when>
<c:when test="EL表达式进行判断">内容2</c:when>
</c:choose>
练习
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:set scope="session" var="salary" value="15000"></c:set>
<c:choose>
<c:when test="${sessionScope.salary ge 12000}">高工资</c:when>
<c:when test="${sessionScope.salary ge 10000}">正常工资</c:when>
<c:when test="${sessionScope.salary ge 8000}">低工资</c:when>
<c:otherwise>不正常工资</c:otherwise>
</c:choose>
-
<c:forEach>
:-
[作用]:循环遍历
-
[第一种方式使用]:
-
<c:forEach var="声明循环变量名称" begin="初始化循环变量" end="循环变量可以接收的最大值" step="循环变量递增" > <%--属性可以不写,默认每次递增1--%> <%-- 循环变量被保存在[pageContext]--%> <%--“begin=x”相当于“i=x”--%> <%--“end=x”相当于 “i<=x”--%> </c:forEach>
-
[第二种使用方式]:
-
<c:forEach items="通过EL表达式获得域对象集合" var="声明循环变量" > ${循环变量.对象属性名} </c:forEach>
-
- 练习(第一种方式):
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<select>
<%
for (int i = 1; i <= 5; i++) {
%>
<option>第<%=i%>页</option>
<%}%>
</select>
<hr/>
<select>
<c:forEach var="i" begin="1" end="5" step="1" >
<option>第${pageScope.i}</option>
</c:forEach>
</select>
- 练习(第二种方式):
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="mingDo.Student" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: 铭先生
Date: 2022/3/24
Time: 23:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="2">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
</tr>
<%
List<Student> stus = (List<Student>) request.getAttribute("key");
for (Student stu:stus) {
%>
<tr>
<td><%=stu.getId()%></td>
<td><%=stu.getName()%></td>
</tr>
<%}%>
</table>
<hr/>
<table border="2">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
</tr>
<c:forEach items="${key}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
这个不是直接访问这个jsp文件的,是通过servlet来存入数据,任何转发过来!
servlet
package mingDo;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* @author: Mr.ming
* @describe: NULL
* @create: 2022/3/24-22:31
*/
public class sixServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Student stu =new Student("1","李太白");
Student stu1 =new Student("2","杜甫");
var list = new ArrayList<Student>();
list.add(stu);
list.add(stu1);
req.setAttribute("key",list);
req.getRequestDispatcher("/index_6.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
student类
package mingDo;
/**
* @author: Mr.ming
* @describe: NULL
* @create: 2022/3/24-22:33
*/
public class Student {
private String id;
private String name;
public Student(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
map遍历
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="mingDo.Student" %>
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: 铭先生
Date: 2022/3/24
Time: 23:06
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="2">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
</tr>
<%
List<Student> stus = (List<Student>) request.getAttribute("key");
for (Student stu:stus) {
%>
<tr>
<td><%=stu.getId()%></td>
<td><%=stu.getName()%></td>
</tr>
<%}%>
</table>
<hr/>
<table border="2">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
</tr>
<c:forEach items="${key}" var="stu">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
</tr>
</c:forEach>
</table>
<hr/>
<h1>map遍历</h1>
<table border="2">
<tr>
<td>学生班级</td>
<td>学生编号</td>
<td>学生姓名</td>
</tr>
<c:forEach items="${mapKey}" var="key_value">
<tr>
<td>${key_value.key}</td>
<td>${key_value.value.id}</td>
<td>${key_value.value.name}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
遍历map集合时,每次从map集合得到一个【键值对】,【键值对】交给循环变量
- 循环变量.key 获得【键值对】中关键字名字 班级名称
- 循环变量.value 获得【键值对】中内容stu对象