您好,欢迎访问三七文档
6-1EL简介JSP2.0技术手册第六章ExpressionLanguage6-1EL简介EL全名为ExpressionLanguage,它原本是JSTL1.0为方便存取数据所自定义的语言。当时EL只能在JSTL标签中使用,如下:c:outvalue=${3+7}程序执行结果为10。但是你却不能直接在JSP网页中使用:pHi!${username}/p到了JSP2.0之后,EL已经正式纳入成为标准规范之一。因此,只要是支持Servlet2.4/JSP2.0的Container,就都可以在JSP网页中直接使用EL了。除了JSP2.0建议使用EL之外,JavaServerFaces(JSR-127)也考虑将EL纳入规范,由此可知,EL如今已经是一项成熟、标准的技术。注意假若您所用的Container只支持Servlet2.3/JSP1.2,如:Tomcat4.1.29,您就不能在JSP网页中直接使用EL,必须安装支持Servlet2.4/JSP2.0的Container。6-2EL语法EL语法很简单,它最大的特点就是使用上很方便。接下来介绍EL主要的语法结构:${sessionScope.user.sex}所有EL都是以${为起始、以}为结尾的。上述EL范例的意思是:从Session的范围中,取得用户的性别。假若依照之前JSPScriptlet的写法如下:Useruser=(User)session.getAttribute(user);Stringsex=user.getSex();Java爱好者技术手册两者相比较之下,可以发现EL的语法比传统JSPScriptlet更为方便、简洁。6-2-1.与[]运算符EL提供.和[]两种运算符来存取数据。下列两者所代表的意思是一样的:${sessionScope.user.sex}等于${sessionScope.user[sex]}.和[]也可以同时混合使用,如下:${sessionScope.shoppingCart[0].price}回传结果为shoppingCart中第一项物品的价格。不过,以下两种情况,两者会有差异:(1)当要存取的属性名称中包含一些特殊字符,如.或–等并非字母或数字的符号,就一定要使用[],例如:${user.My-Name}上述是不正确的方式,应当改为:${user[My-Name]}(2)我们来考虑下列情况:${sessionScope.user[data]}此时,data是一个变量,假若data的值为sex时,那上述的例子等于${sessionScope.user.sex};假若data的值为name时,它就等于${sessionScope.user.name}。因此,如果要动态取值时,就可以用上述的方法来做,但.无法做到动态取值。接下来,我们更详细地来讨论一些情况,首先假设有一个EL:Java爱好者制作${expr-a[expr-b]}JSP2.0技术手册(1)当expr-a的值为null时,它会回传null。(2)当expr-b的值为null时,它会回传null。(3)当expr-a的值为一Map类型时:●假若!value-a.containsKey(value-b)为真,则回传null。●否则回传value-a.get(value-b)。(4)当expr-a的值为List或array类型时:●将value-b的值强制转型为int,假若不能转型为int时,会产生error。●然后,假若value-a.get(value-b)或Array.get(value-a,value-b)产生ArrayIndexOutOfBoundsException或IndexOutOfBoundsException时,则回传null。●假若value-a.get(value-b)或Array.get(value-a,value-b)产生其他的异常时,则会产生error。●最后都没有任何异常产生时,回传value-a.get(value-b)或Array.get(value-a,value-b)。(5)当expr-a的值为JavaBean对象时:●将value-b的值强制转型为String。●假若getter产生异常时,则会产生error。若没有异常产生时,则回传getter的结果。6-2-2EL变量EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page范围找,假如找不到,再依序到Request、Session、Application范围。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null(见表6-1):Java爱好者自动搜索顺序我们也可以指定要取出哪一个范围的变量(见表6-2):表6-2范例说明${pageScope.username}${requestScope.username}${sessionScope.username}${applicationScope.username}取出Page范围的username变量取出Request范围的username变量取出Session范围的username变量取出Application范围的username变量其中,pageScope、requestScope、sessionScope和applicationScope都是EL的隐含对象,由它们的名称可以很容易猜出它们所代表的意思,例如:${sessionScope.username}是取出Session范围的username变量。这种写法是不是比之前JSP的写法:Stringusername=(String)session.getAttribute(username);容易、简洁许多。有关EL隐含对象在6-3节中有更详细的介绍。6-2-3自动转变类型EL除了提供方便存取变量的语法之外,它另外一个方便的功能就是:自动转变类型,我们来看下面这个范例:${param.count+20}假若窗体传来count的值为10时,那么上面的结果为30。之前没接触过JSP的读者可能会认为上面的例子是理所当然的,但是在JSP1.2之中不能这样做,原因是从窗体所传来的值,它们的类型一律是String,所以当你接收之后,必须再将它转为其他类型,如:int、float等等,然后才能执行一些数学运算,下面是之前的做法:Stringstr_count=request.getParameter(count);Java爱好者=Integer.parseInt(str_count);count=count+20;接下来再详细说明EL类型转换的规则:(1)将A转为String类型●假若A为String时:回传A●否则,当A为null时:回传●否则,当A.toString()产生异常时:错误!●否则,回传A.toString()(2)将A转为Number类型的N●假若A为null或时:回传0●假若A为Character时:将A转为newShort((short)a.charValue())●假若A为Boolean时:错误!●假若A为Number类型和N一样时:回传A●假若A为Number时:·假若N是BigInteger时:·假若A为BigDecimal时:回传A.toBigInteger()·否则,回传BigInteger.valueOf(A.longValue())·假若N是BigDecimal时:·假若A为BigInteger时:回传A.toBigDecimal()·否则,回传BigDecimal.valueOf(A.doubleValue())·假若N为Byte时:回传newByte(A.byteValue())·假若N为Short时:回传newShort(A.shortValue())·假若N为Integer时:回传newInteger(A.intValue())Java爱好者技术手册·假若N为Long时:回传newLong(A.longValue())·假若N为Float时:回传newFloat(A.floatValue())·假若N为Double时:回传newDouble(A.doubleValue())·否则,错误!●假若A为String时:·假若N是BigDecimal时:·假若newBigDecimal(A)产生异常时:错误!·否则,回传newBigDecimal(A)·假若N是BigInteger时:·假若newBigInteger(A)产生异常时:错误!·否则,回传newBigInteger(A)·假若N.valueOf(A)产生异常时:错误!·否则,回传N.valueOf(A)●否则,错误!(3)将A转为Character类型●假若A为null或时:回传(char)0●假若A为Character时:回传A●假若A为Boolean时:错误!●假若A为Number时:转换为Short后,然后回传Character●假若A为String时:回传A.charAt(0)●否则,错误!(4)将A转为Boolean类型Java爱好者技术手册●假若A为null或时:回传false●否则,假若A为Boolean时:回传A●否则,假若A为String,且Boolean.valueOf(A)没有产生异常时:回传Boolean.valueOf(A)●否则,错误!6-2-4EL保留字EL的保留字如表6-3:表6-3AndOrNoinstanceofeqneltemptygtlegedivtruefalsenullmod所谓保留字的意思是指变量在命名时,应该避开上述的名字,以免程序编译时发生错误。6-3EL隐含对象笔者在“第五章:隐含对象(ImplicitObject)”中,曾经介绍过9个JSP隐含对象,而EL本身也有自己的隐含对象。EL隐含对象总共有11个(见表6-4):表6-4隐含对象类型说明PageContextjavax.servlet.ServletContext表示此JSP的PageContextPageScopejava.util.Map取得Page范围的属性名称所对应的值取得Request范围的属性名称所对应RequestScopejava.util.MapsessionScopejava.util.MapapplicationScopejava.util.Map的值取得Session范围的属性名称所对应的值取得Application范围的属性名称所对应的值如同param隐含对象java.util.Map类型续表ServletRequest.getParameter(Stringname)。回传String类型的值说明paramValuesjava.util.Map如同Java爱好者(Stringname)。回传String[]类型的值如同ServletRequest.getHeader(Stringname)。回传String类型的值如同Servl
本文标题:EL&&JSTL
链接地址:https://www.777doc.com/doc-5232374 .html