2

我正在将 JSF1.2 应用程序迁移到 JSF 2.1。它有一个使用 facelets 模板的登录页面。并且模板页面有 h:head 标签。登录页面在 ui:composition/ui:define/h:form/a4j:outputPanel/h:panelGrid/h:panelGroup 标签内有一个标签 h:selectBooleanCheckbox。

<h:selectBooleanCheckbox value="#{bean.alogin}" >
  <a4j:ajax event="click" execute="@form" render="loginPanel" />    
</h:selectBooleanCheckbox>

单击复选框时,我在浏览器错误控制台中收到“ReferenceError: RichFaces is not defined”。

即使使用 f:ajax 标签,问题也是一样的,并且有

<h:outputScript name="jsf.js" library="javax.faces" target="head"/>

在模板页面/登录页面。

此问题(未找到/加载 js 库)仅出现在登录页面的首次加载中。这意味着如果我登录到我的应用程序并注销,然后使用上面的复选框,就没有问题。

请指导任何指示,这将非常有帮助。首先十分感谢。

以下是head标签中生成的html:

<script src="/myapp/javax.faces.resource/jsf.js.faces?ln=javax.faces" type="text/javascript">&lt;!--
//--&gt;</script>

我在 web.xml 中有两个 *.faces 映射。一个是CustomFilter(实现javax.servlet.Filter),另一个是CustomServlet(扩展org.apache.myfaces.webapp.MyFacesServlet)。

4

1 回答 1

2

ReferenceError: RichFaces / jsf 未定义

这是一个 JavaScript 错误。这意味着 JavaScript 上下文中既var RichFaces = ...;没有也没有var jsf = ...;定义任何地方。这反过来意味着自动包含 JSF 和 RichFaces 提供的 JavaScript 文件jsf.js并且richfaces.js失败了。这可能是由于没有使用<h:head>组件来声明 HTML 头,这是 JSF 自动包含 JavaScript 文件的强制钩子。

显然你忘了更换

<head>
    ...
</head>

在您的模板中

<h:head>
    ...
</h:head>

相应地修复它。

使用<h:outputScript name="jsf.js" library="javax.faces" target="head"/>仅修复错误的 JSF 部分,而不是 RichFaces 部分,实际上是一种解决方法,而不是解决方案。


更新:根据您的问题更新,您确认您已经Filter在这些资源的确切 URL 模式上映射了某种登录(至少,过滤器名称“会话过滤器”结合到目前为止描述的问题症状表明您'正在阻止用户未登录的请求)。JSF 资源也由*.facesURL 模式提供FacesServlet,因此它们也由该过滤器检查(如果您仔细研究了生成的<script src>URL,您就会意识到这一点)。

您可能需要更改您Filter以跳过对这些资源的登录检查,以便这些资源也不会被重定向到登录页面。您可以通过检查请求 URI 是否与ResourceHandeler.RESOURCE_IDENTIFIERURL 无关来做到这一点。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;

    if (req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
        chain.doFilter(request, response); // Skip JSF resources (CSS/JS/Images/etc)
        return;
    }

    // ... Continue your login check here.
}
于 2012-08-27T17:04:30.970 回答