JBoss 6 上的 JSF 1.2 和 EL 表达式未解决
Posted
技术标签:
【中文标题】JBoss 6 上的 JSF 1.2 和 EL 表达式未解决【英文标题】:JSF 1.2 on JBoss 6 and EL expression not being resolved 【发布时间】:2011-08-21 01:11:49 【问题描述】:我已经用这个撞到墙上几个小时了,我不知道为什么会发生这种情况......
最近我们开始了从 JBoss 4.2.3 迁移到 JBoss 6 Final 的过程。我们正在使用 JSF 1.2。我已经成功地将应用程序适应新的 JBoss(主要是通过从 WEB-INF/lib 中删除一些 JAR 并稍微调整 web.xml)并且应用程序启动良好。
问题是一些 EL 表达式没有得到解决,而其他的却解决了。我还在日志中收到 0 个异常或警告。
我有一个名为“mapContext”的 bean,它在 JSF xml 配置文件之一中定义。它被创建得很好。在我的 JSF 页面上,我有:
<h:inputHidden id="mapContextId" value="#mapContext.webContextId" />
在渲染的页面中它变成:
<input id="mapForm:mapContextId" type="hidden" name="mapForm:mapContextId" value="#mapContext.webContextId" />
如您所见,JSF 标记被渲染得很好,但 EL 没有被解释。
server.log 中没有日志表明有任何问题。
JSF 1.2、JSTL 1.2、Jboss 6、JDK 6。
Web.xml:
<context-param>
<param-name>org.jboss.jbossfaces.JSF_CONFIG_NAME</param-name>
<param-value>Mojarra-1.2</param-value>
</context-param>
任何帮助将不胜感激!
更多细节:
我已经仔细检查了我的代码和配置。我还在我正在使用的自定义变量解析器中添加了一些日志记录,以查看 JSF 使用了哪些 bean。结果很奇怪。
首先,我用不同的输出增强了我的 JSF 页面,现在它看起来像这样:
<h:inputHidden id="mapContextId1" value="#mapContext" />
<h:inputHidden id="mapContextId2" value="#selectionPointSymbol.width" />
<h:inputHidden id="mapContextId" value="#mapContext.webContextId" />
<h:inputHidden id="mapContextId3" value="#selectionPointSymbol4.width" />
并呈现为:
<input type="hidden" name="mapForm" value="mapForm" />
<input id="mapForm:mapContextId1" type="hidden" name="mapForm:mapContextId1" value="#mapContext" />
<input id="mapForm:mapContextId2" type="hidden" name="mapForm:mapContextId2" value="#selectionPointSymbol.width" />
<input id="mapForm:mapContextId" type="hidden" name="mapForm:mapContextId" value="#mapContext.webContextId" />
<input id="mapForm:mapContextId3" type="hidden" name="mapForm:mapContextId3" value="#selectionPointSymbol4.width" />
我检查了日志,我可以看到 mapContext 正在被非标准 JSF 标记很好地解析:
12:27:24,911 ERROR [mb.ags.adf.resolvers.AGSUserResolver] AGSUserResolver asked to resolve: mapContext
12:27:24,911 ERROR [mb.ags.adf.resolvers.AGSUserResolver] AGSUserResolver delegated to: com.sun.faces.el.ChainAwareVariableResolver@ab4f3c and resulted with: mb.ags.adf.map.MbWebContext@20
12:27:24,927 ERROR [mb.ags.adf.resolvers.AGSUserResolver] AGSUserResolver asked to resolve: mapContext
12:27:24,927 ERROR [mb.ags.adf.resolvers.AGSUserResolver] AGSUserResolver delegated to: com.sun.faces.el.ChainAwareVariableResolver@ab4f3c and resulted with: mb.ags.adf.map.MbWebContext@20
(日志中有很多)。
但是没有关于:selectionPointSymbol 或 selectionPointSymbol4 的单个日志(根本没有定义这样的 bean!),它们仅用于标准标签。
服务器日志中仍然没有错误或警告:(
更多细节:简单测试。
JSF 页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page buffer="96kb" autoFlush="true" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<f:view>
<f:loadBundle basename="mb.ags.res.AGSClient" var="msg"/>
<html>
<head>
<title>*********</title>
<link rel="stylesheet" title="base" href="/gis/css/base-style.css" type="text/css" media="screen" />
<style type="text/css">
body overflow:auto;
</style>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<div id="loading_table_container" style="position:absolute; text-align:center; left:0; top:0; width:100%; height:100%; z-index:20000; background-color:white;">
<table id="loading" style="z-index:20001;" >
<tr>
<td align="center" valign="middle" style="font-size: 12px">
<img src="/gis/images/loading_big.gif" align="absmiddle"/><br/><br/>
<h:outputText value="#msg.welcome_page_map_client_loading"/>
<h:outputText id="mapContextId2" value="#selectionPointSymbol.width" />
</td>
</tr>
</table>
</div>
<script>
var url = "<%= redirectUrl %>";
var refresh = "<meta http-equiv=\"refresh\" content=\"1000; URL=" + url + "\" />";
document.writeln(refresh);
</script>
</body>
</html>
</f:view>
呈现为:
<html>
<head>
<title>GIS</title>
<link rel="stylesheet" title="base" href="/gis/css/base-style.css" type="text/css" media="screen" />
<style type="text/css">
body overflow:auto;
</style>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type="text/javascript" language="javascript" src="/gis/js/prototype.js"></script>
<script type="text/javascript" language="javascript" src="/gis/js/scriptaculous/scriptaculous.js?load=effects"></script>
<script type="text/javascript" language="javascript" src="/gis/js/ext/ext-prototype-adapter.js"></script>
<script type="text/javascript" language="javascript" src="/gis/js/ext/ext-all.js"></script>
<script type="text/javascript" language="javascript" src="/gis/js/mb_errors.js"></script>
<script type="text/javascript" language="Javascript" src="/gis/js/esri_core.js"></script>
<script type="text/javascript" language="Javascript" src="/gis/js/mapviewer.js"></script>
<script type="text/javascript" language="javascript" src="/gis/js/ExternalClient.js"></script>
<script type="text/javascript" language="Javascript" src="/gis/js/index_init.js"></script>
</head>
<body>
<div id="loading_table_container" style="position:absolute; text-align:center; left:0; top:0; width:100%; height:100%; z-index:20000; background-color:white;">
<table id="loading" style="z-index:20001;" >
<tr>
<td align="center" valign="middle" style="font-size: 12px">
<img src="/gis/images/loading_big.gif" align="absmiddle"/><br/><br/>
#msg.welcome_page_map_client_loading<span id="mapContextId2">#selectionPointSymbol.width</span>
</td>
</tr>
</table>
</div>
<script>
var url = "/gis/mapviewer.jsf?msid=1000005&uid=1&cid=1&mapContextId=1";
var refresh = "<meta http-equiv=\"refresh\" content=\"1000; URL=" + url + "\" />";
document.writeln(refresh);
</script>
</body>
</html>
仍然不知道发生了什么,因为没有日志表明有任何问题。
【问题讨论】:
【参考方案1】:确保以下事项:
/WEB-INF/lib
中没有像 el-*.jar
这样的特定于 servletcontainer 的库。
web.xml
被声明为符合 Servlet 3.0 规范(JBoss 6 支持)。
web.xml
不包含 com.sun.faces.expressionFactory
的上下文参数,它指向不同的(显然不存在的)EL 实现。
【讨论】:
天哪,非常感谢!! web.xml 附有旧规范,仍在使用 2.4!【参考方案2】:如果您的 EL sn-p 中未定义 mapContext
,JSF 会静默返回空白字符串。
您确定 mapContext 配置正确吗?在迁移过程中很容易错过。
【讨论】:
更多细节添加到我的问题中。 您是如何告诉 JSF bean 应该以该名称公开的?在 JSF 2.0 之前,所有 @Named 的东西都不可用 转到绝对基础知识。带有#mapContext 的单个页面应该在bean toString 中结束。确定一个断点。 Thorbjørn,我在帖子中添加了一些有趣的细节。请检查一下。以上是关于JBoss 6 上的 JSF 1.2 和 EL 表达式未解决的主要内容,如果未能解决你的问题,请参考以下文章