EL表达式


一、简介

1.1基本形式

  ${expression}

   <%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言.

1.2操作符

       a.点操作符 

       b.[]操作符,可以取集合值(有索引的都可以取,set不行),还可以代替点运算符;

     当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。

    例: ${user.My-Name}应当改为${user["My-Name"] }
    如果要动态取值时,就可以用[]来做,而.无法做到动态取值。

    例: ${sessionScope.user[data]}中data 是一个变量

1.3 运算符

1.算术运算符有五个:+、-、*或$、/或div、%或mod
2.关系运算符有六个:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
3.逻辑运算符有三个:&&或and、||或or、!或not
4.其它运算符有三个:Empty运算符、条件运算符、()运算符
最常用的表达式:

为空判断:${empty param.name}

三元运算:${A?B:C}

算数运算:${A*(B+C)} 

1.4取值过程

    EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果域对象中不存在标识符所对应的对象,则返回结果为空值;


二、作用

2.1.取值

例1:取对象

<%@page import="com.test.demo.Address"%>
<%@ page import="com.test.demo.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"  %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL</title>
</head>
<body>
  <%-- El表达式主要获取Bean的属性值--%>
  <%
  Address address=new Address("432000","湖北省石家庄");
  Student s=new Student("name",12,5000.90,address);
  request.setAttribute("stu", s);
  %>
  
  <%--直接写stu,会调用对象的toString()方法 --%>
  s: ${stu}
  <%--先调用 pageContext.findAttribute("stu");在4大域中查找是否有这个对象,
      有的话,再调用这个对象的get方法;再将属性值转化为String输出到浏览器!
   --%>
  姓名:${stu.name} <br/>
  年龄:${stu.age} <br/>
  薪资:${stu.salary} <br/>
  邮编: ${stu.address.zipcode}  <br/>
  地址: ${stu.address.location}  <br/>
   </body>
</html></span>

例2:取集合

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>   

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
  </head>
  
  <body>
     
     <%
     List<String> list=new ArrayList<String>();
     list.add("java1");
     list.add("java2");
     list.add("java3");
     list.add("java4");
     list.add("java5");
     request.setAttribute("list", list);
     
     %>
             取List集合第一个元素:${list[0]} <br/>
     
     <%
     Map<Integer,String> map=new LinkedHashMap<Integer,String>();
     map.put(1, "java开发1");
     map.put(2, "java开发2");
     map.put(3, "java开发3");
     map.put(4, "java开发4");
     map.put(5, "java开发5");
     //放在page域
     pageContext.setAttribute("map", map);
      %>
     
             取Map集合的第一个元素 :${map.1}
      
     <table>
       <tr>
         <th>书名</th>
         <th>操作</th>
       </tr>
         <c:forEach var="ss" items="${list}">
	         <tr>
	            <td> ${ss}</td>
	            <td>购买</td>  
	         </tr>
	     </c:forEach>
     </table>  
     <hr/>
     
      <table>
       <tr>
         <th>编号</th>
         <th>书名</th>
         <th>操作</th>
       </tr>
         <c:forEach var="entry" items="${map}" >
	         <tr>
	            <td>${entry.key}</td>
	            <td>${entry.value}</td>
	            <td>购买</td>  
	         </tr>
	     </c:forEach>
     </table>  
  </body>
</html>
</span>

2.2.执行运算

     a.数值运算

     b.逻辑运算

     c.三目运算

     d.空值判断empty

例:3:

<%@page import="com.test.demo.Student"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <body>
 <%--如果没有找到mm,返回空值,不是null --%>
	${mm}
	
 <%--运算 5大运算符 +-*/%(求余)  --%>
  8+10=${8+10} <br/>
  8-10=${8-10} <br/>
  8*10=${8*10} <br/>
  8/10=${8/10} <br/>
  10%3=${10%3} <br/>
  8*(6+1)=${8*(6+1)}<br/>
  
  <%--三目运算符 ,字符串不能比较大小--%>
 8与9谁大: ${8>9?8:9}<br/>
 8与9谁大: ${8>9?"8大":"9大"}<br/>
 a与b相等吗: ${"a"=="b"?true:false}<br/>
 
  
  <%--empty,如果对象为空或者null,返回true,否则返回false --%>
   <%
   Student stu=null;
   String str=null;
   String str1="";
   List<String> list=new ArrayList<String>();
   List<String> list1=null;
   List<String> list2=new ArrayList<String>();
   list2.add("사랑해");
   request.setAttribute("list", list);
   request.setAttribute("list1", list1);
   request.setAttribute("list2", list2);
   pageContext.setAttribute("stu", stu);
   session.setAttribute("str", str);
   session.setAttribute("str1", str1);
   %>
   
   <%--判断--%>
 Student对象是否为null:  ${empty stu}<br/>    <%--true--%>
 字符串是否为null:  ${empty str} <br/>        <%--true--%>
 字符串是否为空值:  ${empty str1} <br/>        <%--true--%>
 List集合是否为空: ${empty list} <br/>       <%--true--%>
 List1集合是否为null: ${empty list1} <br/>    <%--true--%>
 List2集合是否为null: ${empty list2} <br/>    <%--false--%>
 
 
 <%--取值方式1 --%>
     List2:${list2[0]} <br/>  
 <%--取值方式2,指定域范围 --%>
     List2:${requestScope.list2[0]} <br/>  
  </body>
</html>
</span>

三、11个隐式对象

3.1 与范围有关的隐含对象 

pageScope、requestScope、sessionScope 和applicationScope;
它们对应JSP的pageContext、request、session和application一样;
例如: ${sessionScope.username}
等价 session.getAttribute("username") 取得username的值

3.2 与输入有关的隐含对象 

与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。
例如我们要取得用户的请求参数时,可以利用下列方法:
    request.getParameter(String name)
    request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
    ${param.name}
    ${paramValues.name}

 3.3 pageContext  

    pageContext取得其他有关用户要求或页面的详细信息。
    ${pageContext.request.queryString}         取得请求的参数字符串
    ${pageContext.request.requestURL}         取得请求的URL,但不包括请求之参数字符串
    ${pageContext.request.contextPath}         服务的web application 的名称
    ${pageContext.request.method}           取得HTTP 的方法(GET、POST)
    ${pageContext.request.protocol}         取得使用的协议(HTTP/1.1、HTTP/1.0)
    ${pageContext.request.remoteUser}         取得用户名称
    ${pageContext.request.remoteAddr }         取得用户的IP 地址
    ${pageContext.session.new}             判断session 是否为新的
    ${pageContext.session.id}               取得session 的ID
    ${pageContext.servletContext.serverInfo}   取得主机端的服务信息

 3.4 其他对象

1.cookie

cookie表示是一个Map<String,Cookie>,keycookie对象的namevaluecookie对象本身,

${cookie.JSESSIONID.value}

2.header和headerValues
header 储存用户浏览器和服务端用来沟通的数据
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。
若同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。
3.initParam
initParam取得设定web站点的环境参数(Context)
例:String userid = (String)application.getInitParameter("userid");
      可以使用 ${initParam.userid}来取得名称为userid

四、EL函数

4.1.语法

${fn:function( arg1, arg2, arg3 …. argN)}
其中fn为前置名称(prefix),它必须和taglib 指令的前置名称一置,使用之前导入标签

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

4.2.功能 

操作字符串(16个函数)

例4:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
  <%--functions 函数16个
  4大域对象:pageScope,requestScope,sessionScope,applicationScope
   --%>
<body>
	<%--取到集合的长度 --%>
	<%
		ArrayList<String> arrayList1 = new ArrayList<String>();
		arrayList1.add("aa");
		arrayList1.add("bb");
		arrayList1.add("cc");
		session.setAttribute("arrayList1", arrayList1);
		String str4[]=new String[]{"aaa","bbb","ccc"};
		request.setAttribute("str4", str4);
	%>
	集合的长度: ${fn:length(sessionScope.arrayList1)} 
</span><span style="font-size:12px;">        <br /> 是否包含:${fn:contains("HELLO","H")}
	<br /> 是否包含子串(忽略大小写): ${fn:containsIgnoreCase("HELLO word", "llo")}
	<br /> 是否以指定子串结尾:${fn:endsWith("abc.txt", ".txt")}
	<br /> 把一些字符转成XML表示: ${fn:escapeXml("hello")}
	       <%--没有匹配成功,返回 -1 --%>
	<br />aa位置: ${fn:indexOf("hello", "aa")}
	<br />el位置:${fn:indexOf("hello", "el")}
	<br />  将数组中的数据联合成一个新字符串,并使用指定字符格开 ${fn:join(str4, "-")} 
	<br /> 替换字符串中指定的字符: ${fn:replace("hello java", "java", "sql")}
	        <%--split返回的是一个字符串数组,要显示需要指定索引值 --%>
	<br /> 把字符串按照指定字符切分: ${fn:split("aa:bb:cc", ":")[0]}
	<br /> 判断字符串是否以某个子串开始 :${fn:startsWith("哈哈", "哈")}
	<br /> 获取子串  :${fn:substring("hello java", 0, 2)}
	<br /> 获取从某个字符所在位置之后的子串:${fn:substringAfter("hello","l")}
	<br /> 获取从某个字符所在位置之前的子串:${fn:substringBefore("hello","l")}
	<br /> toLowerCase 转为小写:${fn:toLowerCase("ABC")}
	<br /> toUpperCase 转为大写字符: ${fn:toUpperCase("abcdf")}
	<br /> trim 去除字符串前后的空格 :${fn:trim("  bbb ")}
	<br />
	
	<%--if结构 --%>
	<c:if test="${fn:contains('HELLO','H')}">
	    包含了
	</c:if>
</body>
</html>
</span>

4.3 Functions源码

public class Functions {

    //*********************************************************************
    // String capitalization

    /**
     * Converts all of the characters of the input string to upper case.
     */
    public static String toUpperCase(String input) {
        return input.toUpperCase();
    }

    /**
     * Converts all of the characters of the input string to lower case.
     */
    public static String toLowerCase(String input) {
        return input.toLowerCase();
    }
    
    //*********************************************************************
    // Substring processing
    
    public static int indexOf(String input, String substring) {
        if (input == null) input = "";
        if (substring == null) substring = "";
        return input.indexOf(substring);
    }    

    public static boolean contains(String input, String substring) {
        return indexOf(input, substring) != -1;
    }    

    public static boolean containsIgnoreCase(String input, String substring) {
        if (input == null) input = "";
        if (substring == null) substring = "";        
        String inputUC = input.toUpperCase();
        String substringUC = substring.toUpperCase();
        return indexOf(inputUC, substringUC) != -1;
    }    

    public static boolean startsWith(String input, String substring) {
        if (input == null) input = "";
        if (substring == null) substring = "";
        return input.startsWith(substring);
    }    
        
    public static boolean endsWith(String input, String substring) {
        if (input == null) input = "";
        if (substring == null) substring = "";
        int index = input.indexOf(substring);
        if (index == -1) return false;
        if (index == 0 && substring.length() == 0) return true;
        return (index == input.length() - substring.length());
    }  
    
    public static String substring(String input, int beginIndex, int endIndex) {
        if (input == null) input = "";
        if (beginIndex >= input.length()) return "";
        if (beginIndex < 0) beginIndex = 0;
        if (endIndex < 0 || endIndex > input.length()) endIndex = input.length();
        if (endIndex < beginIndex) return "";
        return input.substring(beginIndex, endIndex);
    }    
    
    public static String substringAfter(String input, String substring) {
        if (input == null) input = "";
        if (input.length() == 0) return "";
        if (substring == null) substring = "";
        if (substring.length() == 0) return input;
        
        int index = input.indexOf(substring);
        if (index == -1) {
            return "";
        } else {
            return input.substring(index+substring.length());
        }
    }    
        
    public static String substringBefore(String input, String substring) {
        if (input == null) input = "";
        if (input.length() == 0) return "";
        if (substring == null) substring = "";
        if (substring.length() == 0) return "";

        int index = input.indexOf(substring);
        if (index == -1) {
            return "";
        } else {
            return input.substring(0, index);
        }
    }    

    //*********************************************************************
    // Character replacement
    
    public static String escapeXml(String input) {
        if (input == null) return "";
        return Util.escapeXml(input);
    }
    
    public static String trim(String input) {
        if (input == null) return "";
        return input.trim();
    }    

    public static String replace(
    String input, 
    String substringBefore,
    String substringAfter) 
    {
        if (input == null) input = "";
        if (input.length() == 0) return "";
        if (substringBefore == null) substringBefore = "";
        if (substringBefore.length() == 0) return input;
                
        StringBuffer buf = new StringBuffer(input.length());
        int startIndex = 0;
        int index;
        while ((index = input.indexOf(substringBefore, startIndex)) != -1) {
            buf.append(input.substring(startIndex, index)).append(substringAfter);
            startIndex = index + substringBefore.length();
        }
        return buf.append(input.substring(startIndex)).toString();
    }
    
    public static String[] split(
    String input, 
    String delimiters) 
    {
        String[] array;
        if (input == null) input = "";
        if (input.length() == 0) {
            array = new String[1];
            array[0] = "";
            return array;
        }
        
        if (delimiters == null) delimiters = "";

        StringTokenizer tok = new StringTokenizer(input, delimiters);
        int count = tok.countTokens();
        array = new String[count];
        int i = 0;
        while (tok.hasMoreTokens()) {
            array[i++] = tok.nextToken();
        }
        return array;
    }        
        
    //*********************************************************************
    // Collections processing
    
    public static int length(Object obj) throws JspTagException {
        if (obj == null) return 0;  
        
        if (obj instanceof String) return ((String)obj).length();
        if (obj instanceof Collection) return ((Collection)obj).size();
        if (obj instanceof Map) return ((Map)obj).size();
        
        int count = 0;
        if (obj instanceof Iterator) {
            Iterator iter = (Iterator)obj;
            count = 0;
            while (iter.hasNext()) {
                count++;
                iter.next();
            }
            return count;
        }            
        if (obj instanceof Enumeration) {
            Enumeration enum_ = (Enumeration)obj;
            count = 0;
            while (enum_.hasMoreElements()) {
                count++;
                enum_.nextElement();
            }
            return count;
        }
        try {
            count = Array.getLength(obj);
            return count;
        } catch (IllegalArgumentException ex) {}
        throw new JspTagException(Resources.getMessage("FOREACH_BAD_ITEMS"));        
    }      

    public static String join(String[] array, String separator) {
        if (array == null) return "";         
        if (separator == null) separator = "";
        
        StringBuffer buf = new StringBuffer();
        for (int i=0; i<array.length; i++) {
            buf.append(array[i]);
            if (i < array.length-1) buf.append(separator);
        }
        
        return buf.toString();
    }
}


五,jstl核心标签

1.重点标签

保存数据:<c:set></c:set>  

获取数据:<c:out value=""></c:out>

单条件判断:<c:if test=""></c:if>

多条件判断:

         <c:choose></c:choose>

        <c:when test=""></c:when>

        <c:otherwise></c:otherwise>

循环数据:

          <c:forEach></c:forEach>

          <c:forTokens items="" delims=""></c:forTokens>

重定向: <c:redirect></c:redirect>


例子:

<%@page import="com.test.demo.Student"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--导入标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
    <title>核心标签库</title>  
  </head>
  
  <body>
    <%--使用标签 --%>
    <%--set标签 :保存数据(保存到域中)默认保存到page域 
                    代替了setAttribute
    --%>
    <c:set var="name" value="rose" scope="request"></c:set>
    
    <%
    	String msg = null;
    	pageContext.setAttribute("msg",msg);
     %>
    
    ${msg }
    <br/>
    <%--out标签: 获取数据(从域中) 
    default: 当value值为null时,使用默认值
    escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)
           转义的含义,像普通文本一样输出;
    --%>
    <c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true"></c:out>
    
    <hr/>
    
    <%--if标签 :单条件判断--%>
    <c:if test="${!empty msg}">
    	条件成立
    </c:if>
    
    <hr/>
    <%--choose标签+when标签+otherwirse标签: 多条件判断 --%>
    <c:set var="score" value="56"></c:set>
    
    <c:choose>
    	<c:when test="${score>=90 && score<=100}">
    		优秀
    	</c:when>
    	<c:when test="${score>=80 && score<90}">
    		良好
    	</c:when>
    	<c:when test="${score>=70 && score<80}">
    		一般
    	</c:when>
    	<c:when test="${score>=60 && score<70}">
    		及格
    	</c:when>
    	<c:otherwise>
    		不及格
    	</c:otherwise>
    </c:choose>
    
    <%-- forEach标签:循环 --%>
    <%
    	//List
     	List<Student>  list = new ArrayList<Student>();
     	list.add(new Student("rose",18));
     	list.add(new Student("jack",28));
     	list.add(new Student("lucy",38));
     	//放入域中
     	pageContext.setAttribute("list",list);
     	
     	//Map
     	Map<String,Student> map = new HashMap<String,Student>();
     	map.put("100",new Student("mark",20));
     	map.put("101",new Student("maxwell",30));
     	map.put("102",new Student("narci",40));
     	//放入域中
     	pageContext.setAttribute("map",map);
     %>
     <hr/>
     <%--
      begin="" : 从哪个元素开始遍历,从0开始.默认从0开始
      end="":     到哪个元素结束。默认到最后一个元素
      step="" : 步长    (每次加几)  ,默认1
      items="": 需要遍历的数据(集合) 
      var="": 每个元素的名称 
      varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始)
      
     --%>
    <c:forEach items="${list}" var="student" varStatus="varSta">
    	序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/>
    </c:forEach>
    
    <hr/>
    
    <c:forEach items="${map}" var="entry">
    	${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/>
    </c:forEach>
    <hr/>
    <%-- forToken标签: 循环特殊字符串 --%>
    <%
    	String str = "java-php-net-平面";
    	pageContext.setAttribute("str",str);
     %>
    
    <c:forTokens items="${str}" delims="-" var="s">
    	${s }<br/>
    </c:forTokens>
    
    <%--redrict:重定向 --%>
    <c:redirect url="http://www.baidu.com"></c:redirect>
    
  </body>
</html>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值