05_EL&JSTL
一、EL表达式
**在数据的传递中 我们都是通过域对象来传递 Request Session **
表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容。通过EL可以简化在JSP开发中对对象的引用,从而规范页面代码,增加程序的可读性及可维护性。
EL主要是为了获取共享域中的数据。
EL主要作用:
1、获取数据
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
2、执行运算
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
3、获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
4、调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
1.1.获取数据
<h3>${username}</h3>
<h3>${password}</h3>
<h4>${list[0]}</h4>
<h4>${list[1]}</h4>
<h4>${list[2]}</h4>
获取Javabean的属性
<h3>${stu.sname}</h3>
<h3>${stu.sage}</h3>
<h3>${stu.school.schoolName}</h3>
<h1>获取map对象</h1>
<h3>${map.A}</h3>
<h3>${map["A"]}</h3>
注意:尽量不要使用数字作为map的主键
获取的原理: 使用的是pageContext.findAttribute();
当发现EL表达式时 则按照域对象从小到达pageContext request session application 一次调用findAttribute()去查找目标属性 如果找到了 就返回值 如果没有找到 返回的是空 也不会报错。
演示代码:
HomeServlet.java
@WebServlet("/home.do")
public class HomeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("username","admin");
req.getSession().setAttribute("password","123456");
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
req.setAttribute("list",list);
Student stu = new Student("张三",23,new School("中北大学","山西太原"));
req.getSession().setAttribute( "stu",stu);
Map map= new HashMap();
map.put("A","AA");
map.put("B","BB");
req.getSession().setAttribute("map",map);
req.getRequestDispatcher("/WEB-INF/home.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
home.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
</head>
<body>
这是我们应用的主页
<h3><%= request.getAttribute("username")%><h3>
<h3><%= session.getAttribute("password")%><h3>
<%
List<String> list = (List<String>) request.getAttribute("list");
%>
<br>
<h1>EL表达式</h1>
<h3>${username}</h3>
<h3>${password}</h3>
<h4>${list[0]}</h4>
<h4>${list[1]}</h4>
<h4>${list[2]}</h4>
<br>
<h1>获取JavaBean属性</h1>
<h3>${stu.sname}</h3>
<h3>${stu.sage}</h3>
<h3>${stu.school.schoolName}</h3>
<br>
<h1>获取map对象</h1>
<h3>${map.A}</h3>
<h3>${map["A"]}</h3>
</body>
</html>
1.2.执行运算
算术运算
关系运算
逻辑运算
其他运算符
empty
<h3>el表达式进行四则运算:</h3>
加法运算:${365+24}<br/>
减法运算:${365-24}<br/>
乘法运算:${365*24}<br/>
除法运算:${365/24}<br/>
empty:
<%--empty 对于空串及null返回的都是true --%>
<h1>${empty para}</h1>
<%-- 判断是否位null--%>
<h1>${para == null}</h1>
<%-- 只能判断是否为""--%>
<h1>${para == ""}</h1>
1.3.获取WEB对象
pageScope
requestScope
sessionScope
applicationScope
<br>
<h3>${requestScope.stu.sname}</h3>
<h3>${requestScope.stu.sage}</h3>
<h3>${requestScope.stu.school.schoolName}</h3>
<br>
<h1>获取map对象</h1>
<h3>${sessionScope.map.A}</h3>
<h3>${sessionScope.map["A"]}</h3>
获取请求参数
req.setCharacterEncoding("UTF-8");
req.getRequestDispatcher("/WEB-INF/home.jsp?name=张三").forward(req,resp);
<%--获取请求的参数 通过路径传递过来 通过表单提交的数据 都属于param 而只有通过setAttribute设置的才是属性 --%>
<h3>${param.name}</h3>
<jsp:forward page="/WEB-INF/success.jsp">
<jsp:param name="aa" value="AAAAAAAA"/>
</jsp:forward>
初始化参数的获取
<context-param>
<param-name>conPara</param-name>
<param-value>context-param</param-value>
</context-param>
<h1>${initParam.conPara}</h1>
cookie的键值获取
<%-- 获取所有的cookie的键集 --%>
<h1>${cookie.keySet()}</h1>
<%-- 获取所有的cookie的值集 返回的是对象--%>
<h1>${cookie.values()}</h1>
<%-- 返回的是键所对应的值 --%>
<h1>${cookie.get("username").value}</h1>
二、JSTL
JSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle1模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。
JSTL(JSP StandardTag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的及其以上容器上,如tomcat 7.x。在JSP 2.0中也是作为标准支持的。可以应用于各种领域,如:基本输入输出、流程控制、循环、XML文件剖析、数据库查询及国际化和文字格式标准化的应用等
JSTL所提供的标签函数库主要分为五大类:
(1)核心标签库 (Core tag library)
(2)I18N 格式标签库 (I18N-capable formatting tag library)
(3)SQL 标签库 (SQL tag library)
(4)XML 标签库 (XML tag library)
(5)函数标签库 (Functions tag library)
2.1.JSTL的使用
引入jstl的jar
在jsp页面引入标签库
<%--引入jstl的核心标签库 prefix前缀 uri核心标签库的uri地址 --%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.2.JSTL 核心标签库
JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。
(1)表达式控制标签:out标签、set标签、remove标签、catch标签。
<c:set var="name" value="zhangsan "></c:set>
<h1><c:out value="${username}"></c:out></h1>
<h1><c:out value="${name}"></c:out> </h1>
(2)流程控制标签:if标签、choose标签、when标签、otherwise标签。
<%--多条件判断 相当于if---else if--else--%>
<c:choose>
<c:when test="${sex ==1}">
<h1>男</h1>
</c:when>
<c:when test="${sex ==2}">
<h1>女</h1>
</c:when>
<c:otherwise>
<h1>性别未知</h1>
</c:otherwise>
</c:choose>
<%--流程控制--%>
<c:if test="${name == 'admin'}">
<h1>这是系统管理员</h1>
</c:if>
(3)循环标签:forEach标签、forTokens标签。
<%--循环--%>
<c:forEach var="list" begin="0" end="2" items="${list}" step="2" >
${list}
</c:forEach>
(4)URL操作标签:import标签、url标签、redirect标签。
2.3.格式化标签库
引入格式化标签库
<%--格式化标签库0--%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
标签用于将日期格式化
<%pageContext.setAttribute("date",new Date());%>
${date }<br>
<fmt:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss"/>
数字格式化
<fmt:formatNumber value="1234" type="currency" pattern="$.00"/>
<fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/>
pattern属性 格式设置
2.4.Functions标签库
导入标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%--函数标签库--%>
<c:set var="str" value="hello world.java "></c:set>
<c:out value="${fn:length(str)}"></c:out>
<c:out value="${fn:trim(str)}"></c:out>
<c:out value="${fn:endsWith(str.trim(),'.java' )}"></c:out>
总结:
EL表达式的主要作用:就是获取域对象的属性值 以及其他的域对象 ${}
EL:不足: 不能实现流程控制 以及 循环
JSTL:核心标签 格式化标签库 函数标签库 xml sql
使用jstl的步骤:
① 需要引入所需的jar
② 需要在jsp页面 使用指令 来引入所使用的的标签库
<%@taglib prefix="" uri="">
③ 可以通过前缀来引用标签库所提供的标签
核心库:c out set
流程控制: if choose when otherwise test(require)
循环: forEach (var items begin end step)
格式化库: fm formatDate formatNumber
函数库: fn 嵌套在其他标签中 作为value 来出现的,结合el表达式使用
el表达式和jstl 是相辅相成 搭配使用