菜鸟学Android(四十五):EL表达式和EL函数库

一、EL表达式简介

EL全名为Expression Language,它的出现主要是替代<%= %>脚本表达式

它有四大的作用:

1.1 获取数据

1.2 执行运算

1.3 获取web常见的开发对象

1.4 调用java方法


二、EL的作用详解

上面已经简单的介绍EL的四大作用,但是具体有什么作用,下面会详细的介绍


2.1 获取数据

获取数据也就是获取属性

它的语法是:${标识符}

EL能获取javabean属性、数组、Collection、Map类型集合的数据

看下面的综合案例:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@page import="com.javabean.Persion;"%>
<%
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>
   
  </head>
  
  <body>
  <h1>获取常数</h1><hr>
    ${"这是常数"}
    
  <h1>获取域中的变量</h1><hr>
  <%
  String name="小红";
  pageContext.setAttribute("name",name);
   %>
    ${name}
    
    <h1>获取数组中的数据</h1><hr>
    <%
  String[] names={"小红","小明","小黑","小黄"};
  pageContext.setAttribute("names",names);
   %>
    ${names[2]}
    
     <h1>获取集合中的数据</h1><hr>
    <%
 	ArrayList list=new ArrayList();
 	list.add("1");
 	list.add("2");
 	list.add("3");
 	list.add("4");
 	pageContext.setAttribute("list",list);
   %>
    ${list[2]}
    
    <h1>获取map中的数据</h1><hr>
    <%
 	//Map<String,String> map=new HashMap();
 	//pageContext.setAttribute("map",map);
   %>
  // ${map["map"]}
   <h1>获取javabean的数据</h1>
   <% 
   Persion p=new Persion();
   p.setName("小雪");
   p.setAge("23");
   pageContext.setAttribute("p",p);
   %>
    ${p.name}
    ${p["age"] }
    
  </body>
</html>
在浏览器中输入:http://localhost/Day06/EL/el1.jsp,即可显示:


我们将转换过来的servlet看看有什么独特的地方:

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.42
 * Generated at: 2015-08-05 14:09:28 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp.EL;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.*;
import com.javabean.Persion;;

public final class el1_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("\r\n");

String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

      out.write("\r\n");
      out.write("\r\n");
      out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
      out.write("<html>\r\n");
      out.write("  <head>\r\n");
      out.write("   \r\n");
      out.write("  </head>\r\n");
      out.write("  \r\n");
      out.write("  <body>\r\n");
      out.write("  <h1>获取常数</h1><hr>\r\n");
      out.write("    ");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${\"这是常数\"}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("\r\n");
      out.write("    \r\n");
      out.write("  <h1>获取域中的变量</h1><hr>\r\n");
      out.write("  ");

  String name="小红";
  pageContext.setAttribute("name",name);
   
      out.write("\r\n");
      out.write("    ");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${name}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("\r\n");
      out.write("    \r\n");
      out.write("    <h1>获取数组中的数据</h1><hr>\r\n");
      out.write("    ");

  String[] names={"小红","小明","小黑","小黄"};
  pageContext.setAttribute("names",names);
   
      out.write("\r\n");
      out.write("    ");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${names[2]}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("\r\n");
      out.write("    \r\n");
      out.write("     <h1>获取集合中的数据</h1><hr>\r\n");
      out.write("    ");

 	ArrayList list=new ArrayList();
 	list.add("1");
 	list.add("2");
 	list.add("3");
 	list.add("4");
 	pageContext.setAttribute("list",list);
   
      out.write("\r\n");
      out.write("    ");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${list[2]}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("\r\n");
      out.write("    \r\n");
      out.write("    <h1>获取map中的数据</h1><hr>\r\n");
      out.write("    ");

 	Map<String,String> map=new HashMap();
 	pageContext.setAttribute("map",map);
   
      out.write("\r\n");
      out.write("   ");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${map[\"map\"]}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("\r\n");
      out.write("   <h1>获取javabean的数据</h1>\r\n");
      out.write("   ");
 
   Persion p=new Persion();
   p.setName("小雪");
   p.setAge("23");
   pageContext.setAttribute("p",p);
   
      out.write("\r\n");
      out.write("    ");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${p.name}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("\r\n");
      out.write("    ");
      out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${p[\"age\"] }", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
      out.write("\r\n");
      out.write("    \r\n");
      out.write("  </body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
上面的数据都是先存储在域里面,然再拿出来的

先存储

pageContext.setAttribute("names",names);
再拿出来

 ${names[2]}

上面的在转换的servlet是这样的:

out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${names[2]}", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));


2.2 执行运算

语法:${运算表达式}

(1)算数运算:所有参与元算的元素都会被转成数字,如果不能转就报错,空元素参与运算当作没参与。
(2)关系运算:
(3)逻辑运算:
(4)empty/not empty判断一个对象或集合或数组是否为空或长度为0
(5)三元表达式 name == null ? "张三" : name;

下面的案例:

2.3 获取web开发常用对象

${对象名称}

有11个常用的对象名称

pageContext:代表pageContext对象,注意和pageScope进行区分
pageScope:代表page域,可以用来获取page域中的属性
reqeustScope:代表reqeust域,可以用来获取reqeust域中的属性
sessionScope:代表session域,可以用来获取session域中的属性
applicationScope:代表application域,可以用来获取application域中的属性


param 代表请求参数组成的map集合${param.userName}
paramValues 代表请求参宿组成的map集合,但是此集合的value是String[],用来获取一名多值的param


header 获取请求头组成的map
headerValues 获取请求头组成的map但是value是一个String[],用来获取一名多值的head


cookie 获取cookie组成的map对象,此map的值是一个cookie对象${cookie.cookieName.cookieValue}


initParam 以map封装的web.xml中配置的整个web应用的初始化参数


具体的解释:

 !pageContext -- 有了它可以很方便的获取jsp页面中的9大隐式对象
        
 !pageScope -- page域中属性组成的Map
 !requestScope -- request域中属性组成的Map

 !sessionScope -- session域中属性组成的Map

 !applicationScope --application域中属性组成的Map


        
!param -- 所有请求参数组成的Map<String,String>
 paramValues -- 所有请求参数组成的Map<String,String[]>
        
 header -- 所有请求头组成的Map<String,String>
 headerValues -- 所有请求头组成的Map<String,String[]>
        

 !cookie -- 所有cookie信息组成的Map<String,Cookie>
        
 initParam -- 所有web应用的初始化参数组成Map

先讲

 !pageScope -- page域中属性组成的Map
 !requestScope -- request域中属性组成的Map

 !sessionScope -- session域中属性组成的Map

 !applicationScope --application域中属性组成的Map

案例:el4.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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>
  
  </head>
  
  <body>
  <%
  pageContext.setAttribute("name","li");
  request.setAttribute("name","wang");
   %>
  <%
   String name1=(String)pageContext.getAttribute("name");
   String name2=(String)request.getAttribute("name");
   out.write("java实现的:"+name1+"<br>");
   out.write("java实现的:"+name2+"<br>");
   %>
   ${pageScope.name}
   ${requestScope.name}
   
  </body>
</html>

然后在浏览器中输入:http://localhost/Day06/EL/el4.jsp 即可显示:


sessionScope和applicationScope 的功能相似,就不介绍了

下面讲

param -- 所有请求参数组成的Map<String,String>
paramValues -- 所有请求参数组成的Map<String,String[]>

案例:

param的意思就是参数的map集合,但是里面只能取一个参数

el5.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
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>
   
  </head>
  
  <body>
  ${param.name}
  </body>
</html>
当浏览器输入:


可以获得参数


但是如果参数是多个的话,那么只能获得第一个参数


那么如何解决这个问题?这就需要用paramValues

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
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>
   
  </head>
  
  <body>
  ${paramValues.name[2]}
  </body>
</html>
这个时候就可以显示出了指定的参数了


下面的讲

header
headerValues

案例el6.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
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>
   
  </head>
  
  <body>
   ${header.Accept}
   ${header["Accept-Language"]}
  </body>
</html>
上面的代码就是将下面的header获取出来

在浏览器中输入:http://localhost/Day06/EL/el6.jsp 即可得到



下面讲

 cookie

先看默认有多少个cookie, 可以看出,只要一个默认的cookie

看下面


那么可以用el表达式获取数值

el7.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
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>
   
  </head>
  
  <body>
   <%
   Cookie[] cs=request.getCookies();
   for(int i=0;i<cs.length;i++){
   		out.write(cs[i].getValue());
   }
    %>
   ${"<br>"}
   ${cookie.JSESSIONID}
   ${"<br>"}
   ${cookie.JSESSIONID.name}
   ${"<br>"}
   ${cookie.JSESSIONID.value }
  </body>
</html>
上面是用java代码获取的,下面是用EL表达式获取的,注意下面三种表达式有什么区别:

在浏览器中输入:http://localhost/Day06/EL/el7.jsp

可以显示:


下面讲

initParam-———所有web应用的初始化参数组成Map


先在web.xml设置配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	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-app_2_4.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  
 <context-param>
 	<param-name>name1</param-name>
 	<param-value>hhhh</param-value>
 </context-param>
 
 <context-param>
 	<param-name>name2</param-name>
 	<param-value>jjjj</param-value>
 </context-param>
</web-app>

然后可以建立el8.jsp获取上面的值

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
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>
   
  </head>
  
  <body>
    ${initParam.name1 }
  </body>
</html>
在浏览器中输入:http://localhost/Day06/EL/el8.jsp 可显示



2.4 调用java方法

调用过程:

写一个类其中包含要被el调用的方法,这个方法必须是静态的方法

写一个tld文件在其中对要被调用的静态方法进行一下描述
在jsp页面中taglib指令将tld文件引入当前jsp页面,从而在jsp页面中就可以调用描述好的方法  

先写一个java类,里面包含静态方法

package com.util;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class ELFunc {
	//里面要包含静态方法
	public static String myEncode(String str,String encode){
		try {
			return URLEncoder.encode(str, encode);
		} catch (UnsupportedEncodingException e) {
			
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}
如何调用,先写一个tld文件来描述:

注意tld文件写在那里是有规定的,应该写在WEB-INF 目录下,但是不能写在lib目录和classes 目录下


新建tld

第一步:


第二步:


第三步:


上面新建了一个tld,这时候就要引入java方法,但是因为没有提示,所以在之前先做提示

在web-jsptaglibrary_2_0.xsd"前面添加这段代码:http://java.sun.com/xml/ns/j2ee


这时候就有提示了:


这时候就可以描述java代码了

tld变成这样了:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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">
 <tlib-version>1.0</tlib-version>
 <short-name>cuixueyong</short-name>
 <uri>http://www.cuixueyong.com</uri>
 
 <function>
 	  <name>jk</name>
     <function-class>com.util.ELFunc</function-class>
     <function-signature>java.lang.String myEncode(java.lang.String,java.lang.String)</function-signature>
 </function>
</taglib>

下面解释是到底有什么含义:


新建好了上面的,这时候就要建jsp 文件用EL表达式引进:

el10.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://www.cuixueyong.com" prefix="hh"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

  </head>
  
  <body>
   ${hh:jk("中文","utf-8")}
  </body>
</html>
上面的都是什么意思?下面的图片解释:


在浏览器中输入:http://localhost/Day06/EL/el10.jsp 即可显示:


三、如何使用EL函数库

EL函数库是由第三方的公司开发的,原本是要导入到lib目录下的,但是java EE5 开始就有内置的jar包

它的名称叫做:jstl 如在下面的位置


我们可以打开,里面有描述它的文件


如何使用?建立一个e11.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="jk"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    
  </head>
  
  <body>
   ${jk:toLowerCase("sdfhkADJGHDI")}
   ${"<br>"}
   ${jk:toUpperCase("sdfhkADJGHDI")}
  </body>
</html>
上面的功能可以用下面的图解释:



这样就完成了一次EL函数库里面的函数的调用。注意EL函数库是JSTL的一个知识点。

那么什么是JSTL?下一节有详细的介绍。









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
11.函数名 函数说明 使用举例 12.fn:contains 判定字符串是否包含另外一个字符串 <c:if test="${fn:contains(name, searchString)}"> 13.fn:containsIgnoreCase 判定字符串是否包含另外一个字符串(大小写无关) <c:if test="${fn:containsIgnoreCase(name, searchString)}"> 14.fn:endsWith 判定字符串是否以另外字符串结束 <c:if test="${fn:endsWith(filename, ".txt")}"> 15.fn:escapeXml 把一些字符转成XML表示,例如 <字符应该转为< ${fn:escapeXml(param:info)} 16.fn:indexOf 子字符串在母字符串中出现的位置 ${fn:indexOf(name, "-")} 17.fn:join 将数组中的数据联合成一个新字符串,并使用指定字符格开 ${fn:join(array, ";")} 18.fn:length 获取字符串的长度,或者数组的大小 ${fn:length(shoppingCart.products)} 19.fn:replace 替换字符串中指定的字符 ${fn:replace(text, "-", "?")} 20.fn:split 把字符串按照指定字符切分 ${fn:split(customerNames, ";")} 21.fn:startsWith 判定字符串是否以某个子串开始 <c:if test="${fn:startsWith(product.id, "100-")}"> 22.fn:substring 获取子串 ${fn:substring(zip, 6, -1)} 23.fn:substringAfter 获取从某个字符所在位置开始的子串 24.${fn:substringAfter(zip, "-")} 25.fn:substringBefore 获取从开始到某个字符所在位置的子串 ${fn:substringBefore(zip, "-")} 26.fn:toLowerCase 转为小写 ${fn.toLowerCase(product.name)} 27.fn:toUpperCase 转为大写字符 ${fn.UpperCase(product.name)} 28.fn:trim 去除字符串前后的空格 ${fn.trim(name)}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值