我在所有jsp页面中使用了大量的jstl而不是jsp scriptlet,但我无法找到jstl中jsp表达式的替代方法。
我有我的代码段
mycode.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="appId" value="${requestScope.appId}"/>
<h1>${appId}</h1>
<BR/>
<a href="/admin/loadData">Load Data</a>
||   <a href="<%= UrlConstants.ADJUSTMENT_NOTE_LEDGER_SUGGEST_BOX%>">Load Demo</a>
我可以知道该行的替代方法&lt;%= UrlConstants.ADJUSTMENT_NOTE_LEDGER_SUGGEST_BOX%&gt;在jstl。这里UrlConstants是我的界面,用于声明一些网址常量
答案 0 :(得分:0)
<强>编辑强>
使用JSTL标准无法做到这一点。
使用scriptlet,无论是行<% =%>
还是更多<% %>
JSP都要经过JSP页面的转换阶段,然后再编译成servlet。
在翻译期间,指令以相同的方式插入到Scriptlet _jspService()方法的网页上。 _jspService()方法对应于JSP页面的主体。
在你的情况下,就像生成这样的一行:
out.write("<a href=\" + UrlConstants.ADJUSTMENT_NOTE_LEDGER_SUGGEST_BOX + "\" >Load Demo</a>" );
所以这适用于scriptlet。 JSTL有点不同。
EL允许页面作者使用表达式动态读取存储在JavaBeans组件,各种数据结构和隐式对象中的应用程序数据。 这些表达式在适当的时间进行评估,并支持即时和延期评估。 立即评估意味着评估表达式,并在首次呈现页面时立即返回结果。
延迟评估意味着使用表达式语言的技术可以使用自己的机制在页面生命周期的某个时间稍后评估表达式,只要适当的话。对于JavaServer Faces技术。
使用${}
语法的所有表达式都会立即进行评估,这由ELResolver
,ELContext
和其他对象进行。 EL机器的中心是可扩展的ELResolver类。
实现ELResolver的类定义了如何解析引用特定类型的对象或属性的表达式。根据以下表达式,第一次调用BeanELResolver
实例来查找基础对象employee,它是一个JavaBeans组件。解析器找到对象后,再次调用它来解析员工对象的属性lName。
${employee.lName}
统一EL包括一组标准解析器实现:ArrayELResolver
,BeanELResolver
,ListELResolver
,MapELResolver
和ResourceBundleELResolver
。 JSP 2.1提供了两个EL解析器来处理引用这些对象的表达式:ImplicitObjectELResolver
和ScopedAttributeELResolver
。
根据使用统一EL的技术,可能还有其他解析器。此外,应用程序开发人员可以添加自己的ELResolver
实现,以支持解析统一EL尚未支持的表达式,方法是将其注册到应用程序。
因此,默认情况下,EL不会评估所需模式的常量值。
有关详细信息,请参阅此链接:http://docs.oracle.com/javaee/5/tutorial/doc/bnahq.html 请参阅此链接How to reference constants in EL?有多种方法可以解决您的问题