我正在尝试在另一台计算机上的Apache Tomcat上运行我的Eclipse JSF项目。我用this tutorial创建了一个WAR文件。但是,当我部署WAR并在Firefox中打开Facelet页面时,我仅收到以下错误消息:
此XML文件似乎没有与之关联的任何样式信息。文档树如下所示。
这是我第一次尝试在没有Eclipse的情况下运行JSF应用程序。这是怎么引起的,我该如何解决?
我实际上正在尝试打开以下Facelet页面:
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition template="/WEB-INF/templates/template_a.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:define name="title">
tytol
</ui:define>
</ui:composition>
此XML文件似乎没有与之关联的任何样式信息。文档树如下所示。
[当客户端(Web浏览器)出于某种原因将HTTP响应内容解释为text/xml
而不是text/html
并且解析的XML树没有任何XML-stylesheet时,您将在客户端出现此错误。换句话说,由于错误或缺少HTTP响应内容类型,Web浏览器将检索到的HTTP响应内容错误地解析为XML而不是HTML。
对于具有默认扩展名.xhtml
的JSF / Facelets文件,如果HTTP请求未调用FacesServlet
从而无法解析Facelets文件并生成该文件,则可能会发生这种情况基于XHTML源代码的所需HTML输出。然后,Firefox仅基于.xhtml
文件扩展名来猜测HTTP响应内容类型,该文件扩展名在您的Firefox配置中显然默认解释为text/xml
。
[您需要确保在浏览器地址栏中看到的HTTP请求URL与在Webapp的<url-pattern>
中注册的FacesServlet
的web.xml
匹配,以便能够调用它并生成基于XHTML源代码的所需HTML输出。例如,如果是*.jsf
,则需要通过/some.jsf
而不是/some.xhtml
打开页面。或者,您也可以只将<url-pattern>
更改为*.xhtml
。这样,您就无需摆弄虚拟URL。
因此请注意,您实际上不需要XML样式表。这只是Web浏览器在尝试尽最大努力使所检索的HTTP响应内容中具有可呈现性时所做的误解。它实际上应该已经检索了正确生成的HTML输出,Firefox无疑确切地知道如何处理HTML内容。
原因是下载的svg文件未设置正确的名称空间,因此浏览器无法呈现该文件进行预览,仅显示XML树。
您需要在下载之前手动添加SVG名称空间,这很简单!
svgAutoConvert(svgStr) {
const viewport = `<svg width="100%" height="100%" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">`;
// const viewport = `<svg width="100%" height="100%" viewBox="0 0 1000 1000">`;
const xml = /<\?xml[\s\S]*\?>/i;
let result = ``;
result = svgStr.replace(xml,``);
let index = result.indexOf(`>`);
result = result.substr(index + 1);
result = viewport + result;
result += `<?xml version="1.0" encoding="UTF-8"?>\n`;
return result;
},
如果使用的是Eclipse,则有很多简单的方法可以创建战争..1-右键单击您的项目2-然后选择Export-> WAR File3-它将显示您的Web项目名称,并提供您要保存war文件的目标位置。4-如果要导出源文件,请选中导出源文件选项。5,然后单击完成。
就这样,您将获得您的项目war文件并复制此war,并将其放入Tomcat Webapps目录中并启动服务器。