2017-08-16 89 views
0

我目前使用的鑽嘴魚科javax.faces-2.2.8.jar和Apache Tomcat 6.0.26服務器。javax.faces:jsf.js資源返回404

我想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未定義。

我知道我應該使用<h:head><h:body>,否則jsf.js不包括在第一位。我試過幾個瀏覽器,結果是一樣的。我也嘗試了myfaces-core-2.0.2-bin jsf的實現。

我發現非常類似的問題here.問題用所棄的JS請求的用戶定義的過濾器相連接。但我 不定義Web部署描述符中的任何過濾器。可能有隱式定義的過濾器阻止該請求?或者還有其他的想法爲什麼有些東西阻止了這個請求?

因爲我問這個問題我安裝了「GlassFish應用服務器版本4.1.2」 服務器上部署應用程序的時間(我列入「javax.faces-2.2.8.jar」進入項目庫, 但我認爲服務器使用內部的「Mojarra 2.2.14」JSF實現)。作爲測試JSF實現的 的方法,我嘗試使用模板,複合組件。 <ui:composition>,<ui:define> 標籤和自定義庫包含工作根據需要。 authentication bean已創建並使用faces-congig.xml完美初始化。然後,它後,我刪除了一切與 沒有關係的問題,只剩下welcome.xhtml頁面。我再次得到「404未找到」。

的解決方案是,以除去一切從web.xml連接到面的servlet。

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

+0

我們可以看看你的'web.xml'文件? – Kaizen

+0

@Kaizen,我編輯了我的問題並添加了'web.xml'的信息。 – stovfl

+0

@Kaizen,謝謝你的貢獻,我已經得到了答案。 – stovfl

回答

1
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/welcome.xhtml</url-pattern> 
</servlet-mapping> 

很怪異....但你的歡迎頁面通過Faces Servlet進行加載這將意味着什麼。因此,名稱中包含.xhtml擴展名的jsf.js以及您自己發佈的jsf.js也不是。修正網址模式(或刪除所有面的servlet引用,因爲默認設置是最常見的罰款),一切都將工作

+0

是的,我同意你的意見。我錯誤地決定我應該將所有的facelets頁面映射到faces servlet。現在我已將網址格式更改爲'/faces/*'。現在瀏覽器返回'welcome.xhtml'請求中的空白頁面。從瀏覽器的控制檯,我看到服務器返回了'welcome.xhtml'的源代碼。 – stovfl

+0

只刪除所有面servlet thingsro,web.xml。默認值應該是好的 – Kukeltje

+0

一切正常,並按預期!非常感謝! :) – stovfl