【问题标题】:Clicking h:commandLink causes Uncaught ReferenceError: mojarra is not defined单击 h:commandLink 会导致 Uncaught ReferenceError: mojarra is not defined
【发布时间】:2012-03-04 02:50:48
【问题描述】:

我知道this 的帖子,我仔细检查了那里的所有可能性。

我在 Glassfish 3 上使用带有 Mojarra 实现的 JSF 2.0。

我正在尝试使用两个简单的<h:commandLink> 标签来更改应用程序语言。 这是.xhtml 页面:

<!DOCTYPE html>
<html lang="en"  xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<h:head>
    <title>
        <h:outputText value = "#{appMessage['page.welcome']}" />
    </title>

    <f:metadata>
        <f:event type = "preRenderView" listener = "#{sessionController.changeLanguage}" />
    </f:metadata>
</h:head>

<h:body>
    <h1><h:outputText value = "#{appMessage['text.slide.welcome']}" /></h1>

    <h:form id = "fm-language">
        <h:commandLink action = "#{sessionController.changeLanguage('en')}" value = "#{appMessage['link.english']}" />
        <h:commandLink action = "#{sessionController.changeLanguage('de')}" value = "#{appMessage['link.german']}" />
    </h:form>

</h:body>

这是 HTML 代码:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>The Maze Project</title>
    </head>
    <body>
        <h1>Welcome</h1>
        <form id="fm-language" name="fm-language" method="post" action="/maze/welcome.xhtml" enctype="application/x-www-form-urlencoded">
            <input type="hidden" name="fm-language" value="fm-language" />
            <script type="text/javascript" src="/maze/javax.faces.resource/jsf.js.xhtml?ln=javax.faces">
            </script>
            <a href="#" onclick="mojarra.jsfcljs(document.getElementById('fm-language'),{'fm-language:j_idt13':'fm-language:j_idt13'},'');return false">English</a>
            <a href="#" onclick="mojarra.jsfcljs(document.getElementById('fm-language'),{'fm-language:j_idt15':'fm-language:j_idt15'},'');return false">Deutsch</a>            
            <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="8038443616162706480:-1387069664590476821" autocomplete="off" />
        </form>
</body>

当按下 commandLink 时,什么都没有发生。没有向服务器发送请求,并抛出以下 Java Script 错误:

mojarra 没有定义

bean 方法被正确调用并在应用程序的其余部分中正常工作。

【问题讨论】:

  • 我可以假设您已经在最小的视图模板中对此进行了测试吗? IE。在同一个&lt;h:body&gt; 内的&lt;h:form&gt; 之外绝对没有别的东西?如果没有,请发布一个完整的 SSCCE。
  • @BalusC 我更新了问题。
  • 乍一看还不错。 #{languageController} bean 是如何注解/注册的?
  • @BalusC languageController 是 Session Scoped 中的一个 ManagedBean。还更新了问题以正确处理此详细信息。我觉得很奇怪,根本没有采取任何行动。
  • @BalusC 此外,如果 EL 中指定的方法不存在,我应该得到类似 action="#{nonexistent}": Identity 'nonexistent' was null and was unable to invoke 的内容。奇怪的是,如果使用不存在的操作进行测试,这两个链接不会引发任何类型的错误。

标签: javascript jsf undefined mojarra commandlink


【解决方案1】:

源代码和生成的 HTML 输出看起来不错,您在 JSF 源代码中有一个 &lt;h:head&gt;(否则 JSF 无法自动包含任何 CSS/JS 文件),并且 javax.faces:jsf.js 脚本存在于HTML 输出。

你说,你得到了一个mojarra 没有定义的JS错误。那只能意味着以下自动生成的脚本

<script type="text/javascript" src="/maze/javax.faces.resource/jsf.js.xhtml?ln=javax.faces">
</script>

没有产生有效的响应。反过来,这只能意味着您有一个Filter,它映射到/**.xhtml,它以某种方式限制了jsf.js 资源请求。也许一些本土的身份验证过滤器并没有完全正确地完成它的工作。尝试打开

http://localhost:8080/maze/javax.faces.resource/jsf.js.xhtml?ln=javax.faces

在您的浏览器中查看它实际检索到的内容(或使用 Web 开发人员工具检查响应)。如果它确实不是正确的响应并且问题确实出在Filter 中,那么您可能需要重写它,以便在请求URI 以ResourceHandler.RESOURCE_IDENTIFIER 开头时它应该继续链。

例如

HttpServletRequest req = (HttpServletRequest) request;

if (req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response); // Let it continue.
    return;
}

【讨论】:

  • 太棒了!你是完全正确的。该过滤器阻止了访问。谢谢!
【解决方案2】:

尝试观察 Firebug 或类似的东西发生了什么,看看是否真的有服务器通信。 并且由于它是一个 commandLink,请查看页面上是否有任何 javascript 错误。

你说,你没有得到任何 INFO 日志,所以我认为请求甚至没有到达你的应用程序。

(我在您的 xhtml 文件中没有看到结束的 html 标记,可能是您没有粘贴它。)

【讨论】:

  • 如果切换到 h:commandButton 会发生什么?对我来说似乎是客户端问题。 (并且 JS 开启?不同的浏览器)我确实总是在我的 jsf 应用程序中使用带有返回值的操作方法,您可以尝试将字符串返回值添加到操作方法中。
  • 我在使用带有 void 的操作方法时遇到了类似的问题。切换到返回字符串有帮助。
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 2019-01-22
  • 2019-12-31
  • 2020-05-24
相关资源
最近更新 更多