我安装了Weblogic 10.3.5。我在服务器上部署了一个带有JSF2.0和JSTL1.2的WAR。但我也需要EL 2.2的功能。我需要什么JAR?如果有人能给我指一份从头开始的分步指南,那就太好了,因为我已经尝试了几个小时,但没有成功。
最简单的方法是在/WEB-INF/lib
中删除jboss-el.jar,它是一个与el 2.1兼容的实现,提供与el 2.2相同的功能,并告诉JSF实现使用该el实现。如何做到这一点取决于所使用的JSF实现。在Mojarra的情况下,您需要将以下上下文参数添加到web.xml
:
<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
在MyFaces的情况下,它是以下上下文参数:
<context-param>
<param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name>
<param-value>org.jboss.el.ExpressionFactoryImpl</param-value>
</context-param>
另请参阅:
- 调用直接方法或EL中带有参数/变量/参数的方法
我觉得公认的答案可能适用于也可能不适用于所有情况,当然,问题是你将被困在EL的单个JBoss版本中,而在未来的2.2实现补丁版本中,没有任何持续的错误修复支持。
最终,以下是在WebLogic 10.3.6服务器上对我有效的方法。
我从Glassfish下载了EL2.2 API和Implementation jar,并将它们包含在web应用程序的WEB-INF/lib
文件夹中。
el-api-2.2.jar
el-impl-2.20-SNAPSHOT.jar
完成此操作后,通常需要向web.xml
添加一个上下文参数,以表示要为新EL实现加载的类,如BalusC的答案中所示。Weblogic似乎并不关心这一点,然而,它的类加载器有自己的处理方式。您需要在weblogic.xml
中指定,以便优先加载WEB-INF/lib
中的EL类。这将允许您的Glassfish实现代替与WebLogic捆绑的旧EL实现进行加载。
<container-descriptor>
<prefer-application-packages>
<package-name>com.sun.el.*</package-name>
<package-name>javax.el.*</package-name>
</prefer-application-packages>
</container-descriptor>
当我发现el 2.2的jboss实现在重新部署时存在永久空间内存泄漏时,我重新提出了这个问题。我尝试了其他几种可用的实现方式,即
- juel 2.2.1
- tomcat jasper el 7.0.35
但一个也没跑。使用2.2 glassfish实现也不起作用(即使使用更喜欢的web-inf类或更喜欢的应用程序包),这是类加载问题的原因。
如果有任何建议,我将不胜感激,哪种实现是最新的,并且可以在不更改服务器类路径的情况下使用weblogic。