Нажатие h: commandLink вызывает Uncaught ReferenceError: mojarra не определена - PullRequest
8 голосов
/ 12 февраля 2012

Мне известна эта запись, и я дважды проверил все возможности там.

Я использую JSF 2.0 с реализацией Mojarra на Glassfish 3.

Я пытаюсь использовать два простых тега <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>

При нажатии на ссылку Link вообще ничего не происходит. На сервер не отправлено ни одного запроса, и возникает следующая ошибка Java Script:

Мохарра не определена

Методы bean-компонентов правильно вызываются и отлично работают в остальной части приложения.

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

Исходный код и сгенерированный вывод HTML выглядят нормально, у вас есть <h:head> в исходном коде JSF (в противном случае JSF не смог бы автоматически включить какие-либо файлы CSS / JS), а сценарий javax.faces:jsf.js присутствует в вывод HTML.

Вы сказали, что у вас ошибка JS, что mojarra не определено. Это может означать только то, что следующий автоматически сгенерированный скрипт

<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

в вашем браузере, чтобы увидеть, что он на самом деле получил (или использовать инструменты веб-разработчика, чтобы проверить ответ). Если это действительно неправильный ответ и проблема действительно в Filter, то вам, вероятно, нужно переписать его так, чтобы он продолжал цепочку, когда URI запроса начинается с ResourceHandler.RESOURCE_IDENTIFIER.

1026 * Е.Г. *

HttpServletRequest req = (HttpServletRequest) request;

if (req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response); // Let it continue.
    return;
}
1 голос
/ 12 февраля 2012

Попробуйте посмотреть, что происходит в Firebug или что-то похожее, чтобы увидеть, есть ли на самом деле связь с сервером. А поскольку это commandLink, посмотрите, есть ли какие-либо ошибки JavaScript на странице.

Вы говорите, что вы не получаете никаких журналов INFO, поэтому я думаю, что запрос даже не попадает в ваше приложение.

(я не вижу закрывающего тега html в вашем файле xhtml, возможно, вы просто не вставили его.)

...