【问题标题】:javax.faces:jsf.js resource returns 404javax.faces:jsf.js 资源返回 404
【发布时间】:2017-08-16 14:08:59
【问题描述】:

我目前使用 mojarra javax.faces-2.2.8.jar 和 Apache Tomcat 6.0.26 Server。

我正在尝试将 ajax 行为添加到输入字段(只是为了简化)。

这是简单的 facelets 页面(welcome.xhtml):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  
      xmlns:al = "http://xmlns.jcp.org/jsf/composite/AppearanceLibrary" 
      xmlns:h = "http://xmlns.jcp.org/jsf/html" 
      xmlns:ui = "http://xmlns.jcp.org/jsf/facelets"
      xmlns:f = "http://xmlns.jcp.org/jsf/core">
    <h:head/>
    <h:body>
        <h:form>
            <h:outputLabel for = "login" 
                       value = "login" />
            <h:inputText id = "login" value = "#{authentication.submittedLogin}">
                <f:ajax execute = "login" render = "out" />
            </h:inputText>
            <h:outputText id = "out" value = "#{authentication.submittedLogin}" />
        </h:form>
    </h:body>
</html>

这是 HTML 输出:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"><head id="j_idt2"><script type="text/javascript" src="/JSFCars/javax.faces.resource/jsf.js.xhtml?ln=javax.faces&amp;stage=Development"></script></head><body>
<form id="j_idt4" name="j_idt4" method="post" action="/JSFCars/welcome.xhtml" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="j_idt4" value="j_idt4" />
<label for="j_idt4:login">login</label><input id="j_idt4:login" type="text" name="j_idt4:login" onchange="mojarra.ab(this,event,'valueChange','j_idt4:login','j_idt4:out')" /><span id="j_idt4:out"></span><input type="hidden" name="javax.faces.ViewState" id="j_id1:javax.faces.ViewState:0" value="o5U6o+AhXUBnlwlaf5BbfJsXNxEe0OmBn+vyQUuLH1If1Hk802YaE1PT+ACraIlE+2rJMXEMJcDEgtaxMDURnPR0EFkR0Pdln4WoUMimfPxwbiCQCQcPfL+JDsPkyx+S6SvffiRyQFmz40B/lF5qtnt+AzzGhkYyuiuokiZVnJYv4hZBVhImLwKLm28dGvVh9qfnpnjngXm8cmAdIVULAY1sn1koFC2Bv702uBK0z9I6jHzMQFdPPCpBd5b+rri7R952i9cfi/CYGdcFSCq1yZGYL0s7E5Dshgaaikr5MVdJ4pRRQbiF60hypro+ZLavymy7G2pMukJNRaMhr7SxZffK13rGuCfpBXzXwdSeXZp2tMpWBhXJZ8gk/7rYzizmMgOTssZtj1inrPAgJdMSu2CJM2Q1xMV5wQSmSpU3bSHWdGknSMH4EGZsipKf8YCr3EsOSPD9khK8hlT5AmLm/iQ0j1xRHJny/6mIPJjVPPN/nD6AXBY+9bdt+SUPEKpT4u8in5ZulcG57t/9NUq/VA==" autocomplete="off" />
</form></body>
</html>

这是我的部署描述符:

<?xml version = "1.0" encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
         xmlns = "http://xmlns.jcp.org/xml/ns/javaee" 
         xsi:schemaLocation = "http://xmlns.jcp.org/xml/ns/javaee 
                               http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
         id = "WebApp_ID" 
         version = "3.1">
    <context-param>
        <param-name>
            javax.faces.STATE_SAVING_METHOD
        </param-name>
        <param-value>
            client
        </param-value>
    </context-param>
    <context-param>
        <param-name>
            javax.servlet.jsp.jstl.fmt.localizationContext
        </param-name>
        <param-value>
            resources.application
        </param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <listener>
        <listener-class>
            com.sun.faces.config.ConfigureListener
        </listener-class>
      </listener>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/welcome.xhtml</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>welcome.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

在浏览器的 JavaScript 控制台中,我收到此请求 http://localhost:8086/JSFCars/javax.faces.resource/jsf.js.xhtml?ln=javax.faces&stage=Development 失败并显示 404(未找到)的消息。结果,当我尝试调用输入字段的 ajax 行为时,我收到以下消息:Uncaught ReferenceError: mojarra is not defined。

我知道我应该使用 &lt;h:head&gt;&lt;h:body&gt;,否则 jsf.js 不会放在首位。我试过几个浏览器,结果都是一样的。我也尝试了 myfaces-core-2.0.2-bin jsf 实现。

我发现了非常相似的问题here. 该问题与拒绝 js 请求的用户定义过滤器有关。但是我 不要在 Web 部署描述符中定义任何过滤器。是否有任何隐式定义的过滤器阻止该请求?或者还有其他想法为什么会阻止该请求?

自从我问这个问题以来,我安装了“GlassFish Server Open Source Edition 4.1.2” 服务器并在其上部署应用程序(我将“javax.faces-2.2.8.jar”包含到项目库中, 但我认为服务器使用内部的“Mojarra 2.2.14”JSF 实现)。作为测试方式 我尝试使用模板、复合组件的 JSF 实现。 &lt;ui:composition&gt;, &lt;ui:define&gt; 标签和自定义库包含根据需要工作。 authentication bean 是使用 faces-congig.xml 创建和完美初始化的。然后在它之后我删除了所有与 这个问题只剩下welcome.xhtml页面。我再次得到“404 Not found”。

解决方案是从web.xml 中删除所有与faces servlet 相关的内容。

The view of the rendered welcome.xhtml page after applying the solution

【问题讨论】:

  • 我们可以看看你的web.xml文件吗?
  • @Kaizen ,我编辑了我的问题并添加了web.xml 的信息。
  • @Kaizen,谢谢你的贡献,我已经得到答案了。

标签: jsf


【解决方案1】:
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/welcome.xhtml</url-pattern>
</servlet-mapping>

很奇怪.... 这意味着您的欢迎页面是通过 Faces servlet 加载的。因此,名称中带有 .xhtml 扩展名的 jsf.js 以及您自己发布的名称也不是。修复 url 模式(或删除所有 faces servlet 引用,因为默认值通常很好),一切都会正常

【讨论】:

  • 是的,我同意你的看法。我错误地决定应该将所有 facelets 页面映射到 faces servlet。现在我已将 url 模式更改为 &lt;url-pattern&gt;/faces/*&lt;/url-pattern&gt;。现在浏览器在welcome.xhtml 请求上返回空白页面。从浏览器的控制台我看到服务器返回了welcome.xhtml 的源代码。
  • 只需删除所有面孔 servlet thingsro,即 web.xml。默认应该没问题
  • 一切都按预期完美运行!太感谢了! :)
猜你喜欢
  • 2014-04-18
  • 2020-01-28
  • 1970-01-01
  • 2021-08-25
  • 2019-05-15
  • 2015-12-11
  • 2018-08-26
  • 2020-12-12
  • 2012-06-28
相关资源
最近更新 更多