使用jsp,它的能力太大需要注意安全,同时对于UI编程人员也过于复杂,可以使用EL(Expression Language)解决这些问题。最初作为JSTL的一部分,后来分离出来作为JSP的一部分,作为Java Unified Expression Language(JUEL)提供给JSP和JSF(Java Server Faces)。在Java EE 7时移到自己的JSR(JSR 341)(JSR是Java Specification Requests的缩写,意思是Java 规范提案。From :百度百科JSR)。
EL是什么
EL解析器需要知道在JSP中EL的开始和结束,有两种基本的EL语法:immediate evaluation(即时求值)和deferred evaluation(延后求值)。
Immediate Evaluation
顾名思义,JSP引擎在页面渲染是满足对其进行解释和求值,由于是从上到下顺序解析,解析到时,就要获值。
${expr},其中expr 是EL表达式。
这是EL的基本语法,如果我们需要在JSP中需要有类似的页面显示,又不误认为是EL,写成:\${not an EL expression}或者${not an EL expression}。
如果在JSP中,例如在HTML中要在EL前面有个\,那么可以:\${EL expression to evaluate}
Deferred Evaluation
Defferred Evalution是Unified Expression Language,主要用在JSF,很少用在JSP,虽然语法是有效的。
#{expr}
在JSF中,defferred evaluation是在页面渲染或/和在postback(回传)时获值,但在JSP中由于没有JSF的生命周期,方式是不一样的。在JSP中#{}只在JSP tag的属性中有效,延后获值至对tag的渲染,也就是tag的属性一开始并不确值,而是后面唤起方法来获值,最晚也需在tag内完成。这在JSP中很少使用。
同样,为了避免歧义,如果不是EL表达式,应该使用:
\#{not an EL expression}或者#{also not an EL expression}
然而,对于#{}仍可能有不识别的情况,我们可以在web.xml的<jsp-config>中的<jsp-property-group>中定义:
<deferred-syntax-allowed-as-literal>true</deferred-syntax-allowed-as-literal>
如果不进行全局定义,可以在jsp文件中在page属性里加上:
deferredSyntaxAllowedAsLiteral="true"
Deffered Evaluation将不在本章中涉及,实际上也很少使用。
位置
EL可以在jsp文件的任何位置,除了JSP的declarations、directives、scriptlets、expressions。
例如在HTML文本和HTML的tag属性中:
The user will see ${expr} text and will know that${expr} is good. |
例如在JSP的tag属性中:
<c:url value="/something/${expr}/${expr}" /> |
例如在JavaScript或CSS(Cascading Style Sheets)中:
<script type="text/javascript" lang="javascript"> |