学习内容:
-
目录
1.EL 介绍
- EL表达式全称:Expression Language,即表达式语言
- EL表达式作用:代替JSP页面中表达式脚本进行数据的输出(只能获取数据,不能设置数据)
- EL表达式的格式是:${表达式} ,注:EL表达式写在jsp页面中,表达式一般是域对象的key
2.传统的JSP代码缺点
1.可读性差,
2.编鞋代码复杂,
下面的是使用JS的使用小脚本和表达式去编写,我们使用EL表达式就会很简单的写出
这样代码就不会冗余
<table>
<tr>
<th>ID</th>
<th>姓名</th>
<th>称号</th>
<th>头像</th>
</tr>
<%
Object obj = request.getAttribute("list");
List<UserInfo> list = (List<UserInfo>) obj;
for (UserInfo u : list) {
%>
<tr>
<td><%=u.getId()%></td>
<td><%=u.getName()%></td>
<td><%=u.getTitle()%></td>
<td><img src="<%=u.getImg()%>" alt=""></td>
</tr>
<% } %>
</table>
3.ELEL 的表达式搜索域数据的顺序
- EL表达式主要是输出域对象中的数据,当四个域对象都有同一个key的值时,EL表达式会按照四个域对象的范围从小到大进行搜索,(page<request<session<application)找到就输出,与四个域对象声明的先后顺序无关
4.EL表达式概述和EL基础语法
news:${news}<br>
news:${news.name} <br>
str:${str.length()}<br>
list:${list}<br>
${list[0]} <br>
${list[1]} <br>
map:${map} <br>
map:${map.username}
4.1控制层的语句(Servlet):
package com.csi.news.controller.EL;
import com.csi.news.domain.News;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ELController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
News news = new News() ;
news.setId(001);
news.setName("国际");
news.setIllustrate("国际新闻");
req.setAttribute("news",news);
req.setAttribute("str","今天是周二");
List<String> list = new ArrayList<>() ;
list.add("hello");
list.add("word");
HttpSession session = req.getSession();
session.setAttribute("list",list);
Map<String,String> map = new HashMap<>() ;
map.put("username","郑圣勇");
map.put("age","18") ;
session.setAttribute("map",map);
req.getRequestDispatcher("/el.jsp").forward(req,resp);
}
}
5.EL表达式的运算符(四个)
- 算术运算符
- 逻辑与算符
- 关系运算符
- empty运算符
算术运算符
+ - * /==div %==mod
逻辑运算符
&(and) | (or ) !(not)
关系运算符
==(eq) >(gt) >=(ge) <(lt) <=(le) !=(ne)
empyt运算符
empty: 代表判断元素是否为 null或者是是否包含元素 not empty: 代表代表判断元素是否不为 null或者是是否不包含元素
作用域的访问对象
正常情况下,在使用 EL 表达式时,需要在表达式中添加对应的作用域,例如 ${sessionScope.xxx} ,如果我没有书写作用域访 问对象,此时, EL 表达式就会从 page 向 requet 中查询,如果 request 没有对应的值就会找到 session 查询, session 如果范围内也没有,就会 最后找到 application ,如果几个作用域都不包含 要查找的值或对象,就会返回 null 状态。此时如 果我们调用某个对象的某个属性或方法,此时 EL 表达式如果没有找到对象就会直接输出空白。参数访问对象param 相当于是在页面中调用了request.getParameter("") 来获取参数中的内 容。paramValues 相当于在页面中调用了request.getParameterValues("") 来获取同名对 象的多个值,返回一个数组类型JSP隐式对象可以通过 pageContext 对象获取到该对象中的某个值,同时还可以获取到页面中衍生出的各类内 置对象,例如可以通过 pageContext.request.contextPath 获取到当前项目的上下文路径。
6.JSTL 核心标签库
6.1.添加依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
6.2.添加指令
格式化库 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/f mt" %>
核心库 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/c ore" %>
3.使用标签库
<c:set var = " 变量名 " value = " 值 " scope = "request|session|application" /><c:set var = "num" value = "100" />将一个对象中的属性进行修改target: 代表要修改的对象property: 要修改的对象中的属性value: 要修改的属性值<c:set target = "${userInfo}" property = "username" value = "zhangsan" /><%--value: 代表要输出的内容,如果直接 写了内容,就会按照普通输出的方式显示在 页面上default ;如果没有找到对应的变量, 就会采用 default 作为值输出--%>
4.输出内容:<c:out value="${num}" />
5. 删除属性 :<c:remove var="变量" />
6.条件标签:
if 表达式是没有 else 的相关操作的,如果需要多层判断,则需要多谢一些 if 的语法<c:if test = " 条件表达式 " ></c:if><c:if test = "${empty userInfo}" > / /对象为空的时候您还没有登录!</c:if><c:if test = "${not empty userInfo}" > //对象不为空的时候您好, ${userInfo.username}</c:if>
<choose><c:when test = " 条件表达式 " >// 满足条件</c:when>...<c:otherwise>// 多个条件都不满足,就会执行该段语句</c:otherwise></choose><c:choose><c:when test = "${empty userInfo}" >您还没有登录!</c:when><c:otherwise>您好,${userInfo.username}</c:otherwise></c:choose>
8.循环控制:<c:forEach var = " 循环时的变量 " items = " 集合 | 数组 " begin = " 起始值 " end = " 结束值 " step = " 迭代步长 " varStatus = " 循环属性变量 " >// 循环体</c:forEach>// 遍历集合<c:forEach var = "str" items = "${strings}" >${str}</c:forEach>// 按普通的值遍历<c:forEach var = "i" begin = "0" end = "10" step = "1" ><a href = "#" > ${i} </a></c:forEach>// 遍历 map 集合<c:forEach var = "m" items = "${map}" >${m.key} --- ${m.value}</c:forEach>// 获取 varStatus 中的变量内容<c:forEach var = "str"items = "${strings}"varStatus = "status" ><% -- $ { status . index + 1 } $ { str } - - %>${status.last}</c:forEach>
7.JSTL 介绍
- JSTL(Java Server Page Standard Tag Library),标准标签库。是为了能够提高JAVA WEB开发的效率以及维 护性。
-
它主要提供给JavaWeb开发人员一个标准通用的标签,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
需要注意的是:
- jstl中需要获取值的地方一般都要配合EL表达式去使用。
- jstl在jsp中使用的,如果项目中没有jsp就不能用。
8.在JSTL中包括两种常用标签库内容:
-
核心标签:核心标签库是整个 JSTL 中最常用的部分,主要由以下几部分组成:基本输入输出、流 程控制、迭代操作和 URL 操作。负责 Web 应用的 常见工作,如:循环、表达式赋值、基本输入输 出等
-
I18N 格式标签库:用来格式化显示数据的工作 ----如:对不同区域的日期格式化等。