1.访问对象属性的方式
(1)用点号运算符"."访问,如${user.name} (2)用方括号运算符"[]"访问,如${user["name"]} 注:有特殊字符的情况,一般用方法2
2.访问数组元素
用方括号运算符"[]"访问,如${users[0]}
3.运算符
除了支持常用的的算术,关系,逻辑运算符外,还有条件运算符 a?b:c,如${a>b ? a : b} 特别的增加了一个检 查对象是否为空的运算符 empty,如${empty var} 如果var (1)不存在,即没被定义 (2)值为null (3)var为集合的对象时,并且集合为空 则返回 true
4.隐含对象
applicationScope 应用程序范围内的scoped变量组成的集合 cookie 所有cookie组成的集合 header HTTP请求头部,字符串 headerValues HTTP请求头部,字符串集合 initParam 全部应用程序参数名组成的集合 pageContext 当前页面的javax.servlet.jsp.PageContext对象 pageScope 页面范围内所有对象的集合 param 所有请求参数字符串组成的集合 paramValues 所有作为字符串集合的请求参数 requestScope 所有请求范围的对象的集合 sessionScope 所有会话范围的对象的集合
其中,applicationScope,pageScope,requestScope,sessionScope这四个隐含对象,虽然类似JSP中的,但是在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其它相关信息。
如<%request.setAttribute("username")%>,在EL中可以这样使用${sessionScope.username}。
接上面,那么所谓“其它相关信息”怎么取得呢?这就用到了pageContext对象
如<%session.getCreationTime()%>对应${pageContext.session.creationTime}
如<%request.getRequestURL()%>对应${pageContext.request.requestURL}
与输入有关的隐含对象,param,paramValues,取用户请求参数的时候可以用到,这个貌似只有在纯jsp编程中才用的到吧。
如<%request.getParameter("username")%>在EL中就是${param.username},而paramValues则是控件数组。
5.命名变量
EL表达式中的变量成为命名变量,关于这个命名变量还是用下面这段代码说会比较清楚
如${username}等于这段代码
<%
String username = (String)pageContext.findAttribute("username");
if(username != null){
%>
<%=username%>
<%
}
%>
来看一下 Object findAttribute(String name)这个函数的API
Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.
是说按照page,request,session(如果有效),application的顺序,来返回这个关联的对象。
6.EL函数
EL函数实际与java中的方法相对应。编写自定义EL函数的步骤如下: (1)编写一个public的java类,类中要作为EL函数的方法必须是 public static 类型的。
如public class MyTag
{
public static String append(String str1, String str2)
{
String bigStr = str1 + str2;
return bigStr;
}
}
(2)编写一个标记库描述文件 在WEB-INF目录下新建一个.tld文件,文件名自取,本例为myTag.tld,文件内容如下:
<?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 web-jsptaglibrary_2_0.xsd" version="2.0"> <description>MyTag</description> <tlib-version>1.0</tlib-version> <short-name>mytag</short-name> <uri>/mytaglib</uri> <function> <description>MyTag</description> <name>append</name> <function-class>com.xxx.util.MyTag</function-class> <function-signature>java.lang.String append(java.lang.String, java.lang.String)</function-signature> </function> </taglib>(3)在jsp中导入标签库在JSP页面导入标签库(不用再Web.xml中说明tld的位置,servlet容器可自动搜索tld文件,因此可打包成jar文件)
<%@taglib uri="/mytaglib" prefix="mytag" %>
(4)使用EL调用函数
${mytag:append("WEL","COME")}
7.可能出现的问题
(1)EL包冲突问题,解决方法转自javaeye中chxkyy的博客
javax.faces.FacesException: java.lang.LinkageError: loader constraints violated when linking javax/el/ExpressionFactory class
org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:425)
org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216)
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)
org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281)
错误的原因是tomcat/lib下的el-api.jar与项目WEB-INF/lib目录下的el-api.jar冲突。
把项目目录下的el-api.jar删除即可。
tomcat/lib下有包若干,下次在遇到此异常可以先检查下是否存在冲突。