EL表达式的学习

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下有包若干,下次在遇到此异常可以先检查下是否存在冲突。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值