【发布时间】:2016-05-16 09:55:33
【问题描述】:
我正在对这个旧应用程序进行大规模迁移。它使用 JSF1.2、Seam 2.2 和 Richfaces 2.x。我们将它迁移到 JSF 2.1、Seam 2.3 和 Richfaces 4.x。迁移后我无法加载任何 css 或 js。
我从萤火虫那里得到了这个错误:
orderForm.seam:9 Uncaught ReferenceError: jQuery is not 定义(匿名函数)@ orderForm.seam:9 orderForm.seam:17 未捕获的 ReferenceError:未定义 RichFaces
这是我的模板 xhtml(已编辑以替换名称的 src 属性):
<?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:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich"
xmlns:s="http://jboss.org/schema/seam/taglib">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>company name</title>
<link rel="shortcut icon" href="#{request.contextPath}/favicon.ico" />
<h:outputStylesheet name="/private/stylesheet/theme.xcss" />
<h:outputStylesheet name="/private/stylesheet/default.css" />
<h:outputStylesheet name="/private/stylesheet/CalendarControl.css" />
<h:outputStylesheet name="/private/stylesheet/theme.css" />
<h:outputScript name="/private/js/jquery.js" />
<h:outputScript name="/private/js/idle-timer.js" />
<h:outputScript name="/private/js/jquery.formatCurrency.js" />
<h:outputScript name="/private/js/CalendarControl.js" />
</h:head>
<body>
<ui:insert name="head" />
<script type="text/javascript">
jQuery.noConflict();
</script>
<rich:popupPanel style="background-color: white;" id="eula"
autosized="true" width="500" moveable="false" resizeable="false">
<f:facet name="header">
<h:outputText value="Eula" />
</f:facet>
<center>
<iframe src="eula.html"
style="height: 410px; width: 500px; overflow: auto; border: 1px solid #666; padding: 8px;" />
<h:form>
<h:commandButton action="#{identity.logout()}" value="I Decline" />
<h:commandButton action="#{authenticator.markEulaAgreed()}"
value="I Accept" />
</h:form>
</center>
</rich:popupPanel>
</body>
</html>
我尝试尽可能简化组合以跟踪问题:
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.org/schema/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a="http://agilers.com/taglib"
xmlns:rich="http://richfaces.org/rich"
xmlns:a4j="http://richfaces.org/a4j"
template="layout/2columns-even.xhtml">
</ui:composition>
这里是 web.xml:
<?xml version="1.0" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<session-config>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
</session-config>
<!-- RichFaces -->
<context-param>
<param-name>org.richfaces.skin</param-name>
<param-value>DEFAULT</param-value>
</context-param>
<!-- Suppress spurious stylesheets -->
<context-param>
<param-name>org.richfaces.enableControlSkinning</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>org.richfaces.enableControlSkinningClasses</param-name>
<param-value>false</param-value>
</context-param>
<!-- Change load strategy to DEFAULT to disable sending scripts/styles as
packs -->
<context-param>
<param-name>org.richfaces.resourceOptimization.enabled</param-name>
<param-value>false</param-value>
</context-param>
<error-page>
<error-code>400</error-code>
<location>/index.html</location>
</error-page>
<error-page>
<error-code>401</error-code>
<location>/index.html</location>
</error-page>
<error-page>
<error-code>402</error-code>
<location>/index.html</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/index.html</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>405</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>406</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>407</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>408</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>409</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>410</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>411</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>412</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>413</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>414</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>415</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>416</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>417</error-code>
<location>/Error404.html</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/index.html</location>
</error-page>
<error-page>
<error-code>501</error-code>
<location>/index.html</location>
</error-page>
<error-page>
<error-code>502</error-code>
<location>/index.html</location>
</error-page>
<error-page>
<error-code>503</error-code>
<location>/index.html</location>
</error-page>
<error-page>
<error-code>504</error-code>
<location>/index.html</location>
</error-page>
<error-page>
<error-code>505</error-code>
<location>/index.html</location>
</error-page>
<context-param>
<description>CAS renew</description>
<param-name>renew</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/taglib/company.taglib.xml</param-value>
</context-param>
<filter>
<display-name>HSTS Filter</display-name>
<filter-name>HSTSFilter</filter-name>
<filter-class>com.company.filter.HSTSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HSTSFilter</filter-name>
<url-pattern>*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter>
<display-name>IE9 Filter</display-name>
<filter-name>ie9filter</filter-name>
<filter-class>com.company.filter.IE9Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>ie9filter</filter-name>
<url-pattern>*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter>
<filter-name>SessionIdFilter</filter-name>
<filter-class>com.company.filter.SessionIdFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionIdFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Authentication Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://www.company.com/login/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>https://www.company.com</param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>https://www.company.com/login</param-value>
</init-param>
<init-param>
<param-name>redirectAfterValidation</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>https://www.company.com</param-value>
</init-param>
</filter>
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
</filter>
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/private/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Authentication Filter</filter-name>
<url-pattern>/private/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/private/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/private/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/private/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>
<listener>
<listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
</listener>
<listener>
<listener-class>com.company.servlet.SessionServletListener</listener-class>
</listener>
<filter>
<filter-name>Seam Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
<init-param>
<param-name>createTempFiles</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>maxRequestSize</param-name>
<param-value>1000000</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Seam Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Seam Resource Servlet</servlet-name>
<servlet-class>org.jboss.seam.servlet.SeamResourceServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Seam Resource Servlet</servlet-name>
<url-pattern>/seam/resource/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<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>*.seam</url-pattern>
</servlet-mapping>
<security-constraint>
<display-name>Restrict raw XHTML Documents</display-name>
<web-resource-collection>
<web-resource-name>XHTML</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>
<persistence-unit-ref>
<persistence-unit-ref-name>companyEntityManagerFactory</persistence-unit-ref-name>
<persistence-unit-name>company</persistence-unit-name>
</persistence-unit-ref>
</web-app><servlet-name>Seam Resource Servlet</servlet-name>
<url-pattern>/seam/resource/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<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>*.seam</url-pattern>
</servlet-mapping>
<security-constraint>
<display-name>Restrict raw XHTML Documents</display-name>
<web-resource-collection>
<web-resource-name>XHTML</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>
<persistence-unit-ref>
<persistence-unit-ref-name>companyEntityManagerFactory</persistence-unit-ref-name>
<persistence-unit-name>company</persistence-unit-name>
</persistence-unit-ref>
</web-app>
编辑 2:我验证了在旧版本上,firebug 的资源选项卡不存在来自 JSF 和richfaces 的资源,但它仍在工作,并且在 xhtml 中添加的资源正确存在,而在迁移版本上只有 JSF 和 Richfaces,但它们都带有 .seam 扩展名,而且我明确声明的资源不存在。另一个有趣的事实是,如果我把它放在 web.xml 中,它就会发生:
<context-param>
<param-name>org.richfaces.resourceOptimization.enabled</param-name>
<param-value>false</param-value>
</context-param>
否则它不会给加载的资源带来任何东西。
鉴于有错误的新 web.xml 已更改为:
Uncaught ReferenceError: A4J is not defined
【问题讨论】:
-
好吧,一个
h:output*tags have no src attribute。但是如果你有任何 Seam 过滤器,它可能会干扰资源。 -
尝试禁用资源servlet,并检查
<head>中生成的内容,资源未正确链接。 -
禁用 Seam Resource servlet 并没有什么不同,但我在问题描述中添加了更多信息
-
加载你自己的jquery会导致这个;摆脱
/private/js/jquery-* -
@MichaelLemos 你能解决这个问题吗?我有一个类似的
RichFaces is not defined错误,目前还没有找到解决方案