EL表达式的使用

E L(Expression Language)  目的:为了使JSP写起来更加简单。

1、获取数据
     ${expression}

2、[ ]与.运算符
     EL 提供“.“和“[ ]“两种运算符来存取数据。
     当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用“[ ]“。例如:
         ${user.My-Name}应当改为${user["My-Name"] }
     如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
         ${sessionScope.user[data]}中data 是一个变量
3、变量
     EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
     因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找

使用范例:

<%@page import="org.eclipse.jdt.internal.compiler.lookup.ImportConflictBinding"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@page import="com.entity.People"%>
<%@page import="java.util.*"%>
<!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>Insert title here</title>
</head>
<body>
  <!-- 直接取数据 -->
    <%
        pageContext.setAttribute("info1", "page范围属性");
        request.setAttribute("info1", "request范围属性");
        session.setAttribute("info1", "session范围属性");
        application.setAttribute("info1", "application范围属性");
    %>
    ${info1}
    <hr>

<!-- 提交表单参数 --> <form action="el.jsp" method="psot"> name属性:<input type="text" name="name" /> <br> age属性:<input type="text" name="age" /> <br> <input type="submit" value="提交到el.jsp"> <hr>

<!-- paramValues提交一组参数 --> <form action="el.jsp" method="post"> <input type="checkbox" name="hobby" value="java语言" />java语言 <input type="checkbox" name="hobby" value="C语言" />C语言 <input type="checkbox" name="hobby" value="php语言" />php语言 <br> <input type="submit" value="提交到el.jsp"> <hr>

<!-- 对象操作 --> <% People zhangsan = new People(); zhangsan.setId(1); zhangsan.setName("zhangsan"); zhangsan.setAge(12); request.setAttribute("zhangsan", zhangsan); %> 编号:${zhangsan.id }<br> 姓名:${zhangsan.name }<br> 年龄:${zhangsan.age }<br> <hr>
<!-- list操作 --> <% People p1 = new People(); p1.setName("张三"); People p2 = new People(); p2.setName("李四"); List<People> list = new ArrayList<People>(); list.add(p1); list.add(p2); request.setAttribute("list",list); %> <!-- 取list指定位置的数据 --> ${list[0].name} ${list[1].name} <hr> <!-- 运算符操作 --> <% request.setAttribute("num1", 10); request.setAttribute("num2", 3); request.setAttribute("flog1", true); request.setAttribute("flog2", false); %> 算术运算符<br> num1=${num1 },num2=${num2 }<br> num1+num2=${num1+num2 }<br> num1-num2=${num1-num2 }<br> num1-num2=${num1-num2 }<br> num1*num2=${num1*num2 }<br> num1/num2=${num1/num2 }<br> num1%num2=${num1%num2 } <hr> 关系运算符<br> flag1=${flag1 },flag2=${flag2 }<br> flag1 && flag2: ${flag1 && flag2 }<br> flag1 || flag2: ${flag1 || flag2 }<br> !flag1: ${!flag1} } <hr> 三目运算符<br> num1>num2: ${num1>num2?"yes":"no" } <hr> 判断空操作:${empty num1 } EL表达式中使用二元表达式<hr> <% session.setAttribute("user",new People("张三")); %> ${user==null? "对不起,您没有登陆 " : user.username} </body> </html>

  在对对象进行操作时要用<%@page import%>把包引进来  

 <%=user.getAddr( ) %>等价于${user.addr} 

el.jsp页面范例:

<%@ 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>Insert title here</title>
</head>
<body>
    this is el.jsp
    <%
        request.setCharacterEncoding("utf-8");
    %>
    <!--表单提交过来的参数 -->
    姓名:${param.name}<br>
    年龄:${param.age}<hr>
    <!-- 提交过来的一组参数 -->
    技能1:${paramValues.hobby[0]}<br>
    技能2:${paramValues.hobby[1]}<br>
    技能3:${paramValues.hobby[2]}
</body>
</html>

 4、表达式内置对象说明

EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
  语法:${隐式对象名称}:获得对象的引用

序号 隐含对象名称 描       述
1 pageContext 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。)
2 pageScope 代表page域中用于保存属性的Map对象
3 requestScope 代表request域中用于保存属性的Map对象
4 sessionScope 代表session域中用于保存属性的Map对象
5 applicationScope 代表application域中用于保存属性的Map对象
6 param 表示一个保存了所有请求参数的Map对象
7 paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]
8 header 表示一个保存了所有http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”]
9 headerValues 表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
10 cookie 表示一个保存了所有cookie的Map对象
11 initParam 表示一个保存了所有web应用初始化参数的map对象

 示例代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>el隐式对象</title>
</head>

<body>
    1、pageContext对象:获取JSP页面中的pageContext对象
    <br /> ${pageContext}
    <hr>
    2、pageScope对象:从page域(pageScope)中查找数据
    <br />
    <%
        pageContext.setAttribute("name", "张三"); //map
    %>
    ${pageScope.name}
    <hr>
    3、requestScope对象:从request域(requestScope)中获取数据
    <br />
    <%
        request.setAttribute("name", "李四"); //map
    %>
    ${requestScope.name}
    <hr>
    4、sessionScope对象:从session域(sessionScope)中获取数据
    <br />
    <%
        session.setAttribute("user", "sf1"); //map
    %>
    ${sessionScope.user}
    <hr>
    5、applicationScope对象:从application域(applicationScope)中获取数据
    <br />
    <%
        application.setAttribute("user", "sf2"); //map
    %>
    ${applicationScope.user}
    <hr>
    6、param对象:获得用于保存请求参数map,并从map中获取数据
    <br />
    ${param.name}
    <!-- 此表达式会经常用在数据回显上 -->
    <form
        action="${pageContext.request.contextPath}/servlet/RegisterServlet"
        method="post">
        <input type="text" name="username" value="${param.username}">
        <input type="submit" value="注册">
    </form>
    <hr>
    7、paramValues对象:paramValues获得请求参数//map{"",String[]}
    <br />
    <!-- http://localhost:8080/JavaWeb_EL_Study_20140826/ELDemo03.jsp?like=aaa&like=bbb -->
    ${paramValues.like[0]} ${paramValues.like[1]}
    <hr>
    8、header对象:header获得请求头
    <br /> ${header.Accept}
    <br />
    <%--${header.Accept-Encoding} 这样写会报错
                 测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
            --%>
    ${header["Accept-Encoding"]}
    <hr>
    9、headerValues对象:headerValues获得请求头的值
    <br />
    <%--headerValues表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组 
            例如:headerValues.Accept返回的是一个string[]数组 ,headerValues.Accept[0]取出数组中的第一个值
            --%>
    ${headerValues.Accept[0]}
    <br />
    <%--${headerValues.Accept-Encoding} 这样写会报错
                 测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
                 headerValues["Accept-Encoding"]返回的是一个string[]数组,headerValues["Accept-Encoding"][0]取出数组中的第一个值
            --%>
    ${headerValues["Accept-Encoding"][0]}
    <hr>
    10、cookie对象:cookie对象获取客户机提交的cookie
    <br />
    <!-- 从cookie隐式对象中根据名称获取到的是cookie对象,要想获取值,还需要.value -->
    ${cookie.JSESSIONID.value} //保存所有cookie的map
    <hr>
    11、initParam对象:initParam对象获取在web.xml文件中配置的初始化参数
    <br />
    <%--
         <!-- web.xml文件中配置初始化参数 -->
       <context-param>
           <param-name>xxx</param-name>
           <param-value>yyyy</param-value>
       </context-param>
       <context-param>
           <param-name>root</param-name>
           <param-value>/JavaWeb_EL_Study_20140826</param-value>
       </context-param>
         --%>
    <%--获取servletContext中用于保存初始化参数的map --%>
    ${initParam.xxx}
    <br /> ${initParam.root}
</body>
</html>

RegisterServlet的代码如下:

package com.web.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegisterServlet extends HttpServlet {
    /* 
     * 处理用户注册的方法
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //1、接收参数
        String userName = request.getParameter("username");
        /**
         * 2、直接跳转回/ELDemo03.jsp页面,没有使用request.setAttribute("userName", userName)将userName存储到request对象中
         * 但是在ELDemo03.jsp页面中可以使用${param.username}获取到request对象中的username参数的值
         */
        request.getRequestDispatcher("/ELDemo03.jsp").forward(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

注意:
  测试header和headerValues时,如果头里面有“-” ,例Accept-Encoding,则要header["Accept-Encoding"]、headerValues["Accept-Encoding"]
  测试cookie时,例${cookie.key}取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}或${cookie.key.value}

 

使用EL调用Java方法

  EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。语法:${prefix:method(params)}
  在EL表达式中调用的只能是Java类的静态方法,这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。
  EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。

是否启用EL表达式:

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

 

posted @ 2015-07-10 15:39  绯云  阅读(4478)  评论(0编辑  收藏  举报