547 El表达式原理讲解
01 EL表达式介绍
E L(Expression Language)目的:为了JSP写起来更简单。灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法。
使用JSTL/EL的前提条件是:xxx.setAttribute();
${requestScope.msg} 相当于
<%
Object msg = request.getAttribute(“msg”);
if(msg!=null){
out.print(msg);
}
%>
02 EL表达式原理
直接写{msg} 底层实现!
EL的四个范围和JSP的四个范围对应,分别为pageContextScope、requestScope、sessionScope,applicationScope
Object value = null;
value = pageContext.getAttribute(key);
if(value==null){
value = request.getAttribute(key);
if(value==null){
value = session.getAttribute(key);
if(value == null){
value = application.getAttribute(key);
if(value==null){
value= "";
} } }}return value;
加上作用域比较好!
03 EL获取对象属性的原理
${requestScope.emp.pwd} 底层如何实现?
<%
Employee emp = request.getAttribute(“emp”);
//获取对象对应的类
Class clazz = emp.getClass();
//通过属性获取属性对应的操作方法
Method method = clazz.getMethod(“get”+“P”+“wd”);
//开始执行
Object returnValue = method.invoke(emp);
%>
反射封装!
548 JSTL原理
01 JSTL表达式介绍
JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开源的JSP标签库,是由apache的jakarta(雅加达)小组来维护的。
5个类别:
核心标签
格式化标签
SQL 标签
XML 标签
JSTL 函数
使用JSTL/EL的前提条件是:xxx.setAttribute();
如何下载最新版本的jstl这两个包?
maven仓库:https://mvnrepository.com/
549 JSTL练习A
1 引入jstl素材
<%@page import="com.bjsxt.entity.Employee"%>
<%@page import="java.sql.Date"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'jstlel.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
//1.准备数据
int n=70;//基本类型
double avgScore = 57.45678;//基本类型
//Student stu = null;
Employee emp=new Employee();//引用类型
emp.setEid(1);
emp.setEname("张晓红");
emp.setBirth(Date.valueOf("1999-12-12"));
String [] strs = {"Java","Oracle","JSP","HTML"};//数组
String courses="Java,Oracle,JSP,HTML,Servlet";//特殊的字符串
String courses2="Java#Oracle#JSP#HTML#Servlet";//特殊的字符串
String str = null;
String str3 = "";
List list = new ArrayList();//分配空间,没有元素
list.add(90);
list.add(80);
List list2 =null;//没有分配空间
List list3 =new ArrayList();//分配空间,没有元素 size()==0
Map<String,String> map = new HashMap<String,String>();//Map
map.put("cn", "China");
map.put("fr", "France");
//setAttribute
request.setAttribute("r1",n);
request.setAttribute("avgScore",avgScore);
request.setAttribute("stu",emp);
request.setAttribute("strs",strs);
request.setAttribute("courses",courses);
request.setAttribute("courses2",courses2);
request.setAttribute("now",new java.util.Date());
request.setAttribute("list", list);
request.setAttribute("list2", list2);
request.setAttribute("list3", list3);
request.setAttribute("map", map);
request.setAttribute("str", str);
request.setAttribute("str3", str3);
//2.使用JSTL和EL输出
%>
</body>
</html>
2 使用JSTL和EL输出
分数:${r1}
分数:${requestScope.r1}
分数:70 分数:70
分数: ${requestScope.avgScore}
分数: 57.45678
如何保留两位小数?
分数:<fmt:formatNumber value="${requestScope.avgScore}"
maxFractionDigits="2"
></fmt:formatNumber>
分数: 57.45678 分数:57.46
姓名:${requestScope.stu.ename}
姓名:张晓红
出生年月:${requestScope.stu.birth}
出生年月:1999-12-12
不想输出1999-12-12 想输出1999年12月12日怎么做?
出生年月:<fmt:formatDate value="${requestScope.stu.birth}"
pattern="yyyy年MM月dd日"></fmt:formatDate>
出生年月:1999年12月12日
550 JSTL练习B
数组
String [] strs = {“Java”,“Oracle”,“JSP”,“HTML”};
<c:forEach items="${strs}" var="s">
${s}------------>
</c:forEach>
Java------------> Oracle------------> JSP------------> HTML------------>
特殊的字符串
String courses=“Java,Oracle,JSP,HTML,Servlet”;
<c:forEach items="${courses}" var="cou">
${cou}------------------------->
</c:forEach>
Java-------------------------> Oracle-------------------------> JSP-------------------------> HTML-------------------------> Servlet------------------------->
怎么实现的?
String courses2="Java#Oracle#JSP#HTML#Servlet";//特殊的字符串
<c:forEach items="${courses2}" var="cou">
${cou}--------->
</c:forEach>
Java#Oracle#JSP#HTML#Servlet--------->
发现#分割是不行的!这是为什么呢?
不是每一种牛奶都叫特伦舒!
如果字符串是逗号(,)分割是可以遍历取值,其他情况是不可以遍历的!
如何分割#?delims(分割)
<c:forTokens items="${courses2}" delims="#" var="cou">
${cou}--------->
</c:forTokens>
Java---------> Oracle---------> JSP---------> HTML---------> Servlet--------->
551 JSTL练习C
List
List list = new ArrayList();//分配空间,没有元素
list.add(90);
list.add(80);
<c:forEach items="${list}" var="cou">
${cou}----->
</c:forEach>
90-----> 80----->
map
Map<String,String> map = new HashMap<String,String>();//Map
map.put(“cn”, “China”);
map.put(“fr”, “France”);
<c:forEach items="${map}" var="cou">
${cou}----->
</c:forEach>
cn=China-----> fr=France----->
如何取键值对?
<c:forEach items="${map}" var="cou">
${cou.key}----->${cou.value}
</c:forEach>
cn----->China fr----->France
下拉框
每页显示
5 10 15 20条记录数
每页显示
<select>
<c:forEach begin="10" step="10" end="40" var="size">
<option>${size}</option>
</c:forEach>
</select>
条记录数
每页显示
<select>
<c:forEach begin="10" step="5" end="40" var="size" varStatus="vs">
<option>${vs.count}--${vs.index}</option>
</c:forEach>
</select>
条记录数
<c:forEach items="${list}" var="cou" varStatus="vs">
${cou}----->${vs.count}++++++${vs.index}
</c:forEach>
90----->1++++++0 80----->2++++++1
vs.index-->代表下标!
${not empty str}
false
${not empty str3}
false
${not empty list2}
false
${not empty list3}
false