El表达式

来源:互联网 发布:梦幻西游手游for mac 编辑:程序博客网 时间:2024/06/08 04:39

1.当web.xml的版本是2.3(约束文档)的时候,默认是不支持EL表达式的。这时候如果还在jsp中使用el表达式,那么el表达式会原封不动的显示给浏览器。例:${name}

如果想让2.3版本支持EL表达式,那么必须在jsp的Page指令中添加一条如下语句,告诉jsp是要支持EL表达式。2.3版本默认为false

<%@page isELIgnored="true" %>


如果想让当前WEB应用程序中的所有JSP页面都忽略EL表达式,则可以在Web应用程序的web.xml配置文件中添加如下代码:

<jsp-config><jsp-property-group><url-pattern>*.jsp</url-pattern><el-ignored>true</el-ignored></jsp-property-group></jsp-config>



2.用EL表达式获取项目名称有两种方式:

*${pageContext.request.contextPath}

*${pageContext.servletContext.contextPath}


3.EL表达式的11个隐含对象:(表示在什么域里取值)这些域里存值的方式都是用Msp集合存的。

*${pageContext}

*${pageScope.userName}

*${requestScope.userName}

*${sessionScope.userName}

*${applicationScope.userName}

*${param.userName}//表示获取Url上的参数

*${paramValues.userName[0]}//表示获取Url上key为userName的value,这个value有多个,以数组形式返回。即127.0.0.1/servletDay1/servlet/servlet1?userName=xxc&userName=pkq

*${header.host }//表示获某个取消息头的值

*${headerValues.host[0]}//表示获取名字一样的消息头的值,以数组形式返回。

*${cookie}//返回所有的cookie 例如{JSESSIONID=javax.servlet.http.Cookie@4262d5d7}   这时如果${cookie.JSESSIONID}则返回javax.servlet.http.Cookie@4262d5d7

这时如果要返回的是JSESSIONID的值,就需要这么写${cookie.JSESSIONID.value}

*${initParam}//返回初始化参数的name和value  {pass=123}  若要返回123则需要这么写${initParam.pass}

在web.xml中如下代码叫初始化参数

<context-param>  <param-name>pass</param-name>  <param-value>123</param-value>  </context-param>

在使用隐含对象需要注意的是:如下是${pageScope}打印出来的内容,可以看出pageScope是当前页面所有对象的集合。

这时如果要通过pageScope来获取response的值

不能写成${pageScope.javax.servlet.jsp.jspResponse}  这样写的话 会去找pageScope  的javaBean里的javax  javaBean里的 servlet....

正确写法是:${pageScope['javax.servlet.jsp.jspResponse'] }  




注意:

EL中的标识符中不能包含单引号、双引号、减号和正斜杠(/)等特殊字符。${uesr_name}这样的是不允许出现的



EL表达式的执行运算:

*empty运算符:检查变量是否为null或空   ${not empty pageScope }  或者   ${ empty pageScope }

*三元运算符:${user==null?user.name:""}


在用EL表达式还有一个必须要注意的是:如下代码,是给userName设值,但是当设置的值为模拟消息头的标签的时候,就会出现不良后果。当前显示页面就会被跳转了。

<body>  <%  request.setAttribute("userName", "<meta http-equiv='Refresh' content='1;URL=http://www.baidu.com/'>");   %>   ${userName}</body>


防止这种情况的发生,可以使用EL自定义函数:

EL自定义函数就是在EL表达式中调用的某个Java类的静态方法,这个java的静态方法需要在Web应用程序中专门进行配置,才可以被EL表达式调用。EL自定义函数可以扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。


一般来说,EL自定义函数开发与应用包括以下三个步骤:

*编写EL自定义函数映射的Java类中的静态方法(这个Java必有带有public修饰符方法必须是这个类中的带有public修饰符的静态方法)

*编写标签库描述符(tld)文件,在tld文件中描述自定义函数

*在JSP页面中导入和使用自定义函数


例子如下:

1.编写EL自定义函数映射的Java类中的静态方法。路径为apache-tomcat-6.0.29\webapps\examples\WEB-INF\classes\util

本例子中EL自定义函数映射的Java类是Tomcat自带的JSP例子程序中提供的一个HTMLFilter类。

/** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements.  See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to You under the Apache License, Version 2.0* (the "License"); you may not use this file except in compliance with* the License.  You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package util;/** * HTML filter utility. * * @author Craig R. McClanahan * @author Tim Tye * @version $Id: HTMLFilter.java 939521 2010-04-30 00:16:33Z kkolinko $ */public final class HTMLFilter {    /**     * Filter the specified message string for characters that are sensitive     * in HTML.  This avoids potential attacks caused by including JavaScript     * codes in the request URL that is often reported in error messages.     *     * @param message The message string to be filtered     */    public static String filter(String message) {        if (message == null)            return (null);        char content[] = new char[message.length()];        message.getChars(0, message.length(), content, 0);        StringBuffer result = new StringBuffer(content.length + 50);        for (int i = 0; i < content.length; i++) {            switch (content[i]) {            case '<':                result.append("<");                break;            case '>':                result.append(">");                break;            case '&':                result.append("&");                break;            case '"':                result.append(""");                break;            default:                result.append(content[i]);            }        }        return (result.toString());    }}

2.编写标签库描述符(tld)文件,在tld文件中描述自定义函数

该文件叫(el.tld)路径为apache-tomcat-6.0.29\webapps\examples\WEB-INF\jsp2目录下找到jsp2-example-taglib.tld文件

为了能够让一个java类的静态方法可以被EL表达式调用,需要在一个标签库描述符(tld)文件中对EL自定义函数进行描述,以将Java类中的静态方法映射成一个EL自定义函数。

下面对TLD文件中的一些主要元素进行解释说明:

(1)<taglib>元素是TLD文件的根元素,不应对其进行任何修改。

(2)<uri>元素用于指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件,必须将<uri>元素中的内容修改成我们自己的URI.

(3)<function>元素用于描述一个EL自定义函数,其中<name>子元素用于指定EL自定义函数的名称,<function-class>子元素用于指定完整的java类名(包名.类名),<function-signature>子元素用于指定Java类中的静态方法的签名(返回值+参数类型),方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。一个标签库描述文件中可以有多个<function>元素,每个<function>元素分别用于描述一个EL自定义函数,同一个TLD文件的每个<function>元素中的<name>子元素的设值不能相同,因为都代表一个方法。

<?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">    <description>A tag library exercising SimpleTag handlers.</description>    <tlib-version>1.0</tlib-version>    <short-name>SimpleTagLibrary</short-name>    <uri>http://www.wow.com/xxc</uri>    <function><description>Converts the string to all caps</description>        <name>trans</name><function-class>util.HTMLFilter</function-class><function-signature>java.lang.String filter(java.lang.String)</function-signature>    </function></taglib>

3.在JSP页面中导入和使用自定义函数

在JSP中需要使用taglib指令来引入标签库描述文件,其语法格式如下:

这边的uri属性和上面tld文件中的<uri>元素中的值一样。

<%@ taglib uri="http://www.wow.com/xxc" prefix="xxc"%>

使用:${引用代号:方法名(变量)}   方法名对应TLD文件中<function>元素中<name>子元素的值

 ${xxc:trans(userName) }


这时候页面显示<meta http-equiv='Refresh' content='1;URL=http://www.baidu.com/'>,源码显示
 &lt;meta http-equiv='Refresh' content='1;URL=http://www.baidu.com/'&gt;


EL自定义函数的指定流程总结:

当JSP引擎遇到 ${xxc:trans(userName) }语句时候,它按如下流程进行处理:

(1)在JSP页面中查找prefix属性设置为“xxc”的taglic指令,获得其uri属性值为http://www.wow.com/xxc

(2)在<TOMCAT_HOME>\webapps\servletDay4\WEB-INF目录极其子目录下查找<uri>元素为http://www.wow.com/xxc的TLD文件,找到el.tld文件。

(3)在el.tld文件中查找<name>子元素的值为trans的<function>元素,该<function>元素的<function-class>和<function-signature>子元素的值分别为util.HTMLFilter和java.lang.String filter(java.lang.String)。

(4)在<TOMCAT_HOME>\webapps\servletDay4\WEB-INF\classes目录下查找util.HTMLFilter类,然后在这个类中查找签名形式为java.lang.String filter(java.lang.String)的public型的静态方法。

(5)将EL表达式中传递给EL自定义函数的每个参数的值转换为TLD文件中对应的方法签名中的类型,然后调用EL自定义函数对应的Java类中的静态方法。

(6)EL表达式获得Java类的静态方法返回的结果,然后进行输出或其他运算处理。如果Java类的静态方法的返回值类型为void,EL自定义函数就将其转换为null后进行处理。如果Java类的静态方法在执行过程中抛出了异常,EL引擎就将这个异常包装成ELException异常抛出。