JSF1.2 到 JSF2.1 迁移 : Using a4j:ajax/f:ajax on First page causes: "ReferenceError: RichFaces/jsf is not defined"

标签 jsf jsf-2 richfaces ajax4jsf

我正在将 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 未定义”。

即使使用 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)。

最佳答案

ReferenceError: RichFaces / jsf is not defined

这是一个 JavaScript 错误。这意味着 var RichFaces = ...; 都不是也不var jsf = ...;是在 JavaScript 上下文中定义的任何地方。这又意味着自动包含 JSF 和 RichFaces 提供的 JavaScript 文件 jsf.jsrichfaces.js失败了。这可能是由于没有使用 <h:head> 造成的组件声明 HTML 头,这是 JSF 自动包含 JavaScript 文件的强制钩子(Hook)。

显然您忘记更换

<head>
    ...
</head>

在您的模板中

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

相应地修复它。

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


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

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

@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.
}

关于JSF1.2 到 JSF2.1 迁移 : Using a4j:ajax/f:ajax on First page causes: "ReferenceError: RichFaces/jsf is not defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12130596/

相关文章:

jsf - jsf 中的异常处理 - 在新页面中打印错误消息

html - JSF:自定义属性不适用于 EL 表达式?

java - 在 JSF 中生成自己的 session ID

css - h :inputText 周围出现额外空间

jsf - 如何在其他定义内设置定义

jsf - Intellij idea 新项目与 jsf 不工作

java - Java EE Web 应用程序的架构

jsf - Primefaces ajax事件更改不调用监听器

security - JSF 安全 : bean method accessibilty

jsf - xhtml 中的 javascript (Richfaces)