一、EL表达式介绍
1.介绍
(1)一组特殊的工具类
(2)EL表达式专门用在JSP文件
(3)简化从域对象读取数据并输出的流程
(4)EL表达式依赖的工具包存在于Tomcat的lib目录下,开发时不需要额外导包。
2.作用
(1)从域对象中获取值
(2)执行运算
(3)提供了一些常用的web对象
(4)可以调用Java方法
二、EL表达式
1.语法: ${ 域对象别名.关键字 }
2.EL表达式[ 域对象别名 ]
(1)applicationScope 获取application域中值
(2)sessionScope 获取session域中值
(3)requestScope 获取request域中值
(4)pageScope 获取page域中值
(5)param 获取表单提交过来的参数 (相当于 request.getParameter())
(6)paramValues 获取表单提交过来的参数
(相当于Map<String,String[]> map = request.getParameterMap())
(7)header 获取请求头信息
(8)headerValues 获取请求头信息
(9)initParam 获取全局初始化的参数
(10)cookie 获取cookie对象的引用,可以使用cookie对象的引用获取cookie的名称和值
前提是在Servlet中创建了一个Cookie对象。
eg:
Cookie cookie = new Cookie("day","2019-02-09");
${ cookie.day } 获取cookie的名称为day的对象
${ cookie.day.name } 获取cookie对象的名称就是day
${ cookie.day.value } 获取cookie对象的值 2019-02-09
(11)pageContext 获取项目的虚拟路径
${ pageContext.request.contextPath } //获取项目名称
${ pageContext.requestremoteAddr. } //获取ip地址等
三、EL表达式获取域对象中的属性值
1.如果域对象中的名称有相同的,适应EL表达式默认从最小的域中取值。
2.list 和 数组使用下标取值。
3.如果是map集合集合或对象 ${ map.aaa }
如果Map集合的key是特殊字符的话,使用 ${ map["bbb.ccc"] }
四、EL表达式支持运算
五、JSTL 标签
1.JSP的内置标签
2.JSP的标签在服务器中,和HTML标签分开
3.JSP的标签出现就是为了简化编程。目的是去除 <%= %>的方式。
4.引入jstl的标签库,使用 taglib指令
(1)<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
* prefix 前缀
* uri 地址
(2)直接在JSP页面使用jstl的标签
* 使用必须先前缀 <c:标签名 属性> 输出内容(直接在HTML里面的标签)
5.jstl提供的核心标签
(1)核心标签库 ---c
(2)fn.tld ---EL函数库
6.注意:
EL表达式和jstl标签库,记住一点,操作都是域对象中的属性和属性的值 。
六、jstl标签详解
1.<c:out ></c:out> 输出域对象的值
value 输出的内容
default 默认值(如果输出没找到值,输出默认值)
escapeXml 设置是否转义,默认是true,设置成false就不转义
2.<c:set ></c:set> 向域中存入值
var 属性名称
value 属性值
scope 域的范围(page,request,session,application)
target 目标(用于指定要设置属性的对象,这个对象必须是JavaBean 对象或者是java.util.Map对象)
property 属性(JavaBean属性 或Map 属性)
使用target和 property 修改JavaBean或者Map集合属性的值
3.<c:remove></c:remove> 删除域对象中的属性
var 要删除的属性的名称
scope 域的范围
4.<c:catch></c:catch> 捕获异常
var 如果发生异常,则会把异常的信息保存到 var中
5.<c:if></c:if> 判断,没有else标签。
test 判断条件,返回true,false
var test的返回结果会保存到var中
scope 域的范围
6.<c:choose>
<c:when>
如果满足。输出
</c:when>
<c:when>
如果满足。输出
</c:when>
<c:otherwise>
上面都不满足,输出
</c:otherwise>
</c:choose> 判断数据,属性与if一样
7.<c:forEach></c:forEach> 迭代数据(list集合,set集合,Map集合...)
用例子来解释属性。eg: for(String str:集合)
用forEach标签:
var 循环遍历的数据保存到var声明变量中(相当于str)
items 要遍历的集合,注意是从域对象中取值(相当于集合)
eg: for(int i=0;i<10;i++)
begin 从哪里开始(相当于int i=0;)
end 到哪里结束(相当于i<10)
step 步长(相当于i+=step)
varstatus 循环遍历的过程,产生内容
-index 下标值
-count 计数器
-first 判断是否有第一个
-last 判断是否有最后一个
8.<c:url></c:url> 与提交的地址相关(超链接,from表单,img的src属性)
value 可以不写项目名 form表单为例:action="<c:url value='/servletTest'>" 注意单双引号
默认拼接sessionid
var
scope
9.<c:import></c:import> 引入一个文件
url
var
context 虚拟路径
10.<c:redirect></c:redirect>重定向
url
context
11<c:param></c:param> 参数标签
name 参数名称
value 参数值
12.<c:forTokens></c:forTokens>切分字符串 也是一个循环
var
item 要切分的集合
delims 定义用来分割字符串的字符(切分的规则)
varStatus
begin end
七、Jstl中常用的EL函数
使用之前需要引入函数库 <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
1fn:toLowerCase 把字符串转换为小写
fn:toLowerCase("ILoveYou") 的返回值为字符串"iloveyou”
2fn:toUpperCase 把字符串转换为大写
fn:toUpperCase("ILoveYou") 的返回值为字符串“ILOVEYOU”
3.fn:trim 删除字符串首尾的空格,并返回结果字符串
例如,fn:trim(" I Love You ") 的返回值为字符串“I Love You”。
4.fn:length 返回集合或者数组的大小
5.fn:split 以指定字符串作为分隔符分割字符串,返回字符串数组
例如,fn:split("str.split", ".")[1]的返回值为字符串“split”。
6.fn:join 以一个字符串作为分隔符,将一个字符串数组中的所有元素合并为一个字符串并返回合并后的结果字符串
fn:join(fn:split("str.join", ","), ".") 的返回值为字符串“str.join”
7.fn:indexOf 返回指定字符串在一个字符串中第一次出现的索引值。
fn:indexOf("Iloveyou","y") 的返回值为5
8.fn:contains 检测一个字符串中是否包含指定的字符串
9.fn:containsIgnoreCase 忽略大小写
10.fn:startsWith函数用于检测一个字符串是否是以指定字符串开始的
对应 fn:endWith
11.fn:replace 将一个字符串中包含的指定子字符串替换为其它的指定字符串
fn:replace("I love you", " ", ".")的返回值为字符串“I.Love.You”
12fn:substring 用于截取一个字符串的子字符串并返回截取到的子字符串
fn:substring("ILoveYou", 1, 5) 的返回值为字符串“Love”
13.fn:substringAfter函数用于截取并返回一个字符串中的指定子字符串第一次出现之后的子字符串
对应的是 fn:substringBefore
八、自定义EL 函数
1.开发EL函数的步骤
* 编写一个Java类,提供一个方法,方法必须静态方法。方法必须有返回值。
package ELbymyself;
public class Demo1 {
public static String sayHello(String str){
return "你好啊 "+str;
}
}
* 在WEB-INF目录下,编写.tld结尾的文件(xml文件),进行配置。
* 在WEB-INF的目录下,不要在lib或者classes目录下
* 创建.tld的文件(XML的文件,XML的约束的)
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
1.0
myFn
http://zhouchenming.top/el/demo1
* 编写配置文件
<tlib-version>1.0</tlib-version>
<short-name>myFn</short-name>
<uri>http://zhouchenming.top/el/demo1</uri>
* 在JSP的页面上引入自己编写的EL函数库
<%@ taglib prefix="myFn" uri="http://zhouchenming.top/el/demo1" %>
2.作用:如果你编写一个EL的函数,JSP页面上处理不了的逻辑,你把它扔到后台使用java代码进行处理。对外提供就是一个EL函数。
九、自定义标签
1.没有标签主体
(1)编写类
public class demo2 extends SimpleTagSupport {
private PageContext pc;
private JspFragment jspBody;
public void doTag() throws JspException, IOException {
pc.getOut().write("自定义标签");
}
public void setJspContext(JspContext pc) {
this.pc = (PageContext) pc;
}
public void setJspBody(JspFragment jspBody) {
this.jspBody = jspBody;
}
}
(2)编写配置文件
<tlib-version>1.0</tlib-version>
<short-name>myTl</short-name>
<uri>http://zhouchenming.top/jstl/demo2</uri>
<tag>
<name>myT</name>
<tag-class>ELbymyself.demo2</tag-class>
<body-content>empty</body-content>
</tag>
(3)在JSP文件直接使用
<%@ taglib prefix="mytl" uri="http://zhouchenming.top/jstl/demo2" %>
<mytl:myT/>
2.带有标签主体
(1).编写代码
public class demo3 extends SimpleTagSupport{
private PageContext pc;
private JspFragment jspbody;
@Override
public void doTag() throws JspException, IOException {
jspbody.invoke(pc.getOut());
}
@Override
public void setJspContext(JspContext pc) {
this.pc = (PageContext) pc;
}
@Override
public void setJspBody(JspFragment jspBody) {
this.jspbody = jspBody;
}
}
(2).编写配置文件
<tag>
<name>out</name>
<tag-class>ELbymyself.demo3</tag-class>
<body-content>scriptless</body-content>
</tag>
(3).在JSP使用
<mytl:out>
<c:out value="你码的"></c:out>
</mytl:out>
(4).注意(标签主体的配置)
* empty:不能有标签体内容。
* scriptless:标签体内容不能是Java代码段,但可以是EL、JSTL等;
3.带有属性的自定义标签
(1).编写类
public class JstlDemo3 extends SimpleTagSupport{
private PageContext pc;
private JspFragment jspBody;
// test和JSP页面上的if test属性名称必须是相同的
// 你必须给我提供test属性的set方法
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
public void doTag() throws JspException, IOException {
// 直接调用JspFragment的invoke(Writer out) ,标签主体向外输出
if(test){
jspBody.invoke(pc.getOut());
}
}
public void setJspContext(JspContext pc) {
this.pc = (PageContext) pc;
}
public void setJspBody(JspFragment jspBody) {
this.jspBody = jspBody;
}
}
(2)配置(包含配置属性)
<tag>
<name>if</name>
<tag-class>cn.itcast.jstl.JstlDemo3</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>boolean</type>
</attribute>
</tag>
(3)使用标签
<myc:if test="${ requestScope.num eq 10 }">
我草你麻痹
</myc:if>