目录
一、EL表达式
1、概念
Expression Language 表达式语言
2、作用
替换和简化jsp页面中java代码的编写
3、语法
${表达式}
4、注意
jsp默认支持el表达式的。如果要忽略el表达式
设置jsp中page指令中:isELIgnored="true",忽略当前jsp页面中所有的el表达式
\${表达式}:忽略当前这个el表达式
5、使用
(1)运算
运算符:
- 算数运算符:+ - * /(div) %(mod)
- 比较运算符:> < >= <= == !=
- 逻辑运算符:&&(and) ||(or) !(not)
- 空运算符: empty
- 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
- ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
- ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
(2)获取值
- el表达式只能从域对象中获取值
- 语法:
-
${域名称.键名}
:从指定域中获取指定键的值-
域名称:
1. pageScope --> pageContext 2. requestScope --> request 3. sessionScope --> session 4. applicationScope --> application(ServletContext)
-
举例:在request域中存储了
name=张三
-
获取:
${requestScope.name}
-
-
${键名}
:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
-
(3)获取对象、List集合、Map集合的值
-
对象:
${域名称.键名.属性名}
- 本质上会去调用对象的getter方法
-
List集合:
${域名称.键名[索引]}
-
Map集合:
${域名称.键名.key名称}
${域名称.键名["key名称"]}
6、隐式对象
- el表达式中有11个隐式对象
pageContext
:- 获取jsp其他八个内置对象
${pageContext.request.contextPath}
:动态获取虚拟目录
- 获取jsp其他八个内置对象
7、c:set、c:out和c:remove
1.<c:set>
<c:set>标签用于设置变量值和对象属性。它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。
属性
- value:要存储的值
- var:存储信息的变量
- target:要修改的属性所属的对象
- property:要修改的属性
- scope:var属性的作用域
2.<c:out>
<c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是<c:out>标签可以直接通过"."操作符来访问属性。
举例来说,如果想要访问customer.address.street,只需要这样写:<c:out value=“customer.address.street”>。
<c:out>标签会自动忽略XML标记字符,所以它们不会被当做标签来处理。
属性
- value:要输出的内容
- default:输出的默认值
- escapeXml:是否忽略XML特殊字符(默认值为true表示会自动进行转义处理,手动设置为false后可以显示标签)
3.<c:remove>
<c:remove>标签用于移除指定作用域内的指定变量。
<c:remove var="<string>" scope="String">
- var:待移除的变量名称
- scope: 待移除变量所在的作用域(默认为page)
二、JSTL
1、概念
- JavaServer Pages Tag Library JSP标准标签库
- 是由Apache组织提供的开源的免费的jsp标签
<标签>
2、作用
- 用于简化和替换jsp页面上的java代码
3、使用步骤
- 导入jstl相关jar包
- 引入标签库:taglib指令: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- 使用标签
4、常用的JSTL标签
-
(1)if:相当于java代码的if语句
- 属性:
- test必须属性,接受boolean表达式
- 如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
- 注意:
c:if
标签没有else情况,想要else情况,则可以在定义一个c:if
标签
-
(2)choose:相当于java代码的switch语句
- 使用
choose
标签声明 相当于switch声明 - 使用
when
标签做判断 相当于case - 使用
otherwise
标签做其他情况的声明 相当于default -
(3)foreach:相当于java代码的for语句
- 语法
<c:forEach items="collationName" var="varName" varStatus="varStatusName" begin="beginIndex" end="endIndex" step="step"> 主体内容 </c:forEach>
- items属性指被迭代的集合对象,可以通过EL表达式获取。
- var属性是对当前成员的引用,即如果当前循环到第一个成员,var就引用第一个成员, 如果当前循环到第二个成员,var就引用第二个成员,以此类推。
- varStatus属性用于存放var属性引用的成员的相关信息,如索引等。
- begin属性表示开始位置,默认为0,该属性可以省略。
- end属性表示结束位置,该属性可以省略。
- step表示循环的步长,默认为1,该属性可以省略。
5、练习
- 需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中
- 代码如下:
-
<%@ page import="java.util.List" %> <%@ page import="java.util.ArrayList" %> <%@ page import="com.allen.domain.User" %> <%@ page import="java.util.Date" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>test</title> </head> <body> <% List list = new ArrayList(); list.add(new User("张三",23,new Date())); list.add(new User("李四",24,new Date())); list.add(new User("王五",25,new Date())); request.setAttribute("list",list); %> <table border="1" width="500" align="center"> <tr> <th>编号</th> <th>姓名</th> <th>年龄</th> <th>生日</th> </tr> <%--数据行--%> <c:forEach items="${list}" var="user" varStatus="s"> <c:if test="${s.count%2 == 0}"> <tr bgcolor="green"> <td>${s.count}</td> <td>${user.name}</td> <td>${user.age}</td> <td>${user.birStr}</td> </tr> </c:if> <c:if test="${s.count%2 != 0}"> <tr bgcolor="red"> <td>${s.count}</td> <td>${user.name}</td> <td>${user.age}</td> <td>${user.birStr}</td> </tr> </c:if> </c:forEach> </table> </body> </html>
-
package Servlet; import entity.Dog; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; 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; @WebServlet("/TextServlet") //用注解给这个文件取个路径 public class TextServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setAttribute("a",10); req.getSession().setAttribute("b",20); Dog d1=new Dog("小白",2,"白色"); Dog d2=new Dog("小黑",3,"黑色"); List<Dog>list=new ArrayList<>(); list.add(d1); list.add(d2); req.getSession().setAttribute("list",list); req.getSession().setAttribute("Flag",1); req.getSession().setAttribute("html","<a>点我啊</a>"); req.getRequestDispatcher("index.jsp").forward(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req,resp); } }
-
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <%--用于从作用域中取值--%> <%--page<requset<session<application--%> <%--可以不用写作用域,它会从小到大去寻找--%> ${requestScope.a} ${sessionScope.b} <table border="2"> <c:forEach var="ob" items="${list}"> <tr> <td>${ob.name}</td> <td>${ob.age}</td> <td>${ob.color}</td> </tr> </c:forEach> </table> <c:if test="${Flag>0}"> <h1>欢迎你,啊啊啊!</h1> </c:if> <c:if test="${Flag<=0}"> <h1>请登录!</h1> </c:if> <%-- var:键 value:值 scope:作用域--%> <c:set var="cd" value="123" scope="session"> </c:set> <c:out value="${html}" escapeXml="true"></c:out> <c:out value="${html}" escapeXml="false"></c:out> <c:out value="${cd}"></c:out> </body> </html>
三丶本章总结
- EL表达式的语法有$和{}两个要数,两者缺一不可。
- EL表达式提供了pageScope丶requestScope丶sessionScope丶applicationScope丶param丶paramValues丶pageContext丶cookie丶initParam等隐式对象。
- EL表达式具有类型无关性,可以使用点操作符或[]操作符取得某个属性的值。
- JSTL核心标签库中常用的标签有如下三类。
- 通用标签:<c:set>丶<c:out>丶<c:remove>。
- 条件标签:<c:if>丶<c:choose>丶<c:when>丶<c:otherwise>。
- 迭代标签:<c:forEach>。
- EL表达式与JSTL标签结合使用,可以在很大程度上减少在JSP中嵌入的Java代码,有利于程序的维护和扩展。