JavaWeb之EL篇

一.EL概述

EL(Expression Language):目的是使JSP写起来更简单。

1.1、EL的作用

在JSP2.0后要把html和css分离、要把html和js分开、要把Java脚本替换成标签。不包含<%...%>等

而标签的好处:即使不是java人员,也可以轻松的去使用

1.2、EL的格式及使用

使用格式:${}

使用前提:如果不希望使用EL,需要在JSP的page指令需要指定isELIgnore="true",默认是false,即不忽略

1.3、EL的运算符

基本都是一样,重点是empty较常用

!或not 非 ${!true} 或 ${not true}
==或eq 等于 ${5==5}或${5 eq 5}
empty 是否为空 ${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”}     true

EL表达式的值如果为null,会显示空串,也就是什么也不显示

操作List和数组:${list[0]}、${arr[0]};

操作bean的属性:${person.name}、${person[‘name’]},对应person.getName()方法

操作Map的值:${map.key}、${map[‘key’]},对应map.get(key)

1.4、EL的内置对象

EL一共11个内置对象,无需创建即可以使用。这11个内置对象中有10个是Map类型的,最后一个是pageContext对象。

applicationScope(重点) 应用程序范围内的scoped变量组成的Map集合
cookie 所有cookie组成的Map集合
header HTTP请求头部,字符串
headerValues HTTP请求头部,字符串集合
initParam 全部应用程序参数名组成的集合
pageContext 当前页面的javax.servlet.jsp.PageContext对象
pageScope(重点) 页面范围内所有对象的集合
param 所有请求参数字符串组成的集合
paramValues 所有作为字符串集合的请求参数
requestScope(重点)所有请求范围的对象的集合
sessionScope(重点)所有会话范围的对象的集合


EL域对象相关

pageScope:${pageScope.name}等同与pageContext.getAttribute(“name”);
requestScope:${requestScope.name}等同与request.getAttribute(“name”);
sessionScoep: ${sessionScope.name}等同与session.getAttribute(“name”);
applicationScope:${applicationScope.name}等同与application.getAttribute(“name”);
使用EL来获取域中保持的javaBean对象,那么javaBean一定要设置get方法

全域查找:${person}表示依次在pageScope、requesScopet、sessionScope、appliationScope四个域中查找名字为person的属性

注意:

EL表达式在获取Map或javaBean的值时,有两种方式request.xxx或request['xxx'],作用相同,但是若果Map的键或javaBean的属性名包含'_',EL就必须使用下标的方式request['xx_x']

pageContext对象

pageContext:pageContext是PageContext类型!可以使用pageContext对象调用getXXX()方法,例如pageContext.getRequest(),可以${pageContext.request}。也就是读取JavaBean属性!

${pageContext.request.queryString} 等价于 pageContext.getRequest().getQueryString();
${pageContext.request.requestURL} 等价于 pageContext.getRequest().getRequestURL();
${pageContext.request.contextPath} 等价于 pageContext.getRequest().getContextPath();
${pageContext.request.method} 等价于 pageContext.getRequest().getMethod();
${pageContext.request.protocol} 等价于 pageContext.getRequest().getProtocol();
${pageContext.request.remoteUser} 等价于 pageContext.getRequest().getRemoteUser();
${pageContext.request.remoteAddr} 等价于 pageContext.getRequest().getRemoteAddr();
${pageContext.session.new} 等价于 pageContext.getSession().isNew();
${pageContext.session.id} 等价于 pageContext.getSession().getId();
${pageContext.servletContext.serverInfo} 等价于 pageContext.getServletContext().getServlteInfo()



二、EL函数库

1.什么是EL函数库

EL函数库是由第三方对EL的扩展,

EL函数库就是定义一些有返回值的静态方法。然后通过EL语言来调用它们!

EL函数库中包含了很多对字符串的操作方法,以及对集合对象的操作。例如:${fn:length(“abc”)},但用的不是很多

因为是第三方的东西,所以需要导入。导入需要使用taglib指令!

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

常见方法:

String toUpperCase(String input):
l String toLowerCase(String input):
l int indexOf(String input, String substring):
l boolean contains(String input, String substring):
l boolean containsIgnoreCase(String input, String substring):
l boolean startsWith(String input, String substring):
l boolean endsWith(String input, String substring):
l String substring(String input, int beginIndex, int endIndex):
l String substringAfter(String input, String substring):hello-world, “-“
l substringBefore(String input, String substring):hello-world, “-“
l String escapeXml(String input):把字符串的“>”、“<”。。。转义了!
l String trim(String input):
l String replace(String input, String substringBefore, String substringAfter):
l String[] split(String input, String delimiters):
l int length(Object obj):可以获取字符串、数组、各种集合的长度!
l String join(String array[], String separator):</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"><strong><%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
…
String[] strs = {"a", "b","c"};
List list = new ArrayList();
list.add("a");
pageContext.setAttribute("arr", strs);
pageContext.setAttribute("list", list);
%>
${fn:length(arr) }<br/><!--3-->
${fn:length(list) }<br/><!--1-->
${fn:toLowerCase("Hello") }<br/> <!-- hello -->
${fn:toUpperCase("Hello") }<br/> <!-- HELLO -->
${fn:contains("abc", "a")}<br/><!-- true -->
${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true -->
${fn:contains(arr, "a")}<br/><!-- true -->
${fn:containsIgnoreCase(list, "A")}<br/><!-- true -->
${fn:endsWith("Hello.java", ".java")}<br/><!-- true -->
${fn:startsWith("Hello.java", "Hell")}<br/><!-- true -->
${fn:indexOf("Hello-World", "-")}<br/><!-- 5 -->
${fn:join(arr, ";")}<br/><!-- a;b;c -->
${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World -->
${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c -->

${fn:substring("0123456789", 6, 9)}<br/><!-- 678 -->
${fn:substring("0123456789", 5, -1)}<br/><!-- 56789 -->
${fn:substringAfter("Hello-World", "-")}<br/><!-- World -->
${fn:substringBefore("Hello-World", "-")}<br/><!-- Hello -->
${fn:trim("     a b c     ")}<br/><!-- a b c -->
${fn:escapeXml("<html></html>")}<br/> <!-- <html></html> -->

同样,也可以自定义EL函数

1.写一个类,写一个有返回值的静态方法

2.编写tld文件,可以参考jstl给定的fn.tld文件来写,把tld文件放到/WEB-INF目录下

package cn.cil.funcations;

public class MyFuncations {
	public static String get() {
		return "自定义EL函数库测试";
	}
}
TLD

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
    
  <tlib-version>1.0</tlib-version>
  <short-name>cc</short-name>
  <uri>http://www.xixihahaxiaobenzhu.cn/jsp/functions</uri>

  <function>
    <name>get</name>
    <function-class>cn.cil.funcations.MyFunction</function-class>
    <function-signature>String get()</function-signature>
  </function>
</taglib>

JSP

<body> 
  	<h1>${cc:get() }</h1>
  </body>

自定义EL函数的注意事项:

编写完tld后,需要将它放置到<web应用>\WEB-INF目录中或WEB-INF目录下的除了classes和lib目录之外的任意子目录中。
  TLD文件中的<uri> 元素用指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件。
  <function>元素用于描述一个EL自定义函数,其中:
  <name>子元素用于指定EL自定义函数的名称。
  <function-class>子元素用于指定完整的Java类名,
  <function-signature>子元素用于指定Java类中的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值