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表达式中调用的某个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/'>
当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异常抛出。