我知道this帖子,我仔细检查了那里的所有可能性。
我在Glassfish 3上使用JSF 2.0和Mojarra实现。
我正在尝试使用两个简单的<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方法,并在其余的应用程序中正常工作。
答案 0 :(得分:5)
源和生成的HTML输出看起来很好,你在JSF源中有<h:head>
(否则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
在浏览器中查看实际检索的内容(或使用Web开发人员工具检查响应)。如果它确实不是正确的响应并且问题确实存在于Filter
中,那么您可能需要重写它,以便当请求URI以ResourceHandler.RESOURCE_IDENTIFIER
开头时它应该继续链。
E.g。
HttpServletRequest req = (HttpServletRequest) request;
if (req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
chain.doFilter(request, response); // Let it continue.
return;
}
答案 1 :(得分:1)
尝试观察Firebug中发生的事情或类似的事情,看看是否实际存在服务器通信。 因为它是一个commandLink,看看页面上是否有任何javascript错误。
你说,你没有得到任何INFO日志,所以我认为请求甚至没有到你的申请。
(我不会在你的xhtml文件中看到关闭的html标记,也许你还没有粘贴它。)