【发布时间】:2010-06-08 15:23:03
【问题描述】:
我正在尝试实现我发现的图像平移器here Chrome 会根据所请求文件的扩展名以不同的方式呈现相同的文档。我创建了一个测试用例,当文件 not 命名为 test.xhtml
时它可以工作您可以从here下载测试用例
有人知道为什么或如何解决它吗?我希望我的文件是 .xhtml 在 IE 和 FF 中运行良好。
代码: test.html / test.xhtml(更改名称以查看适用于其中一个但不适用于另一个)。
<!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" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<style type="text/css">
/*Default CSS for pan containers*/
.pancontainer {
position: relative; /*keep this intact*/
overflow: hidden; /*keep this intact*/
width: 300px;
height: 300px;
border: 1px solid black;
}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="http://www.dynamicdrive.com/dynamicindex4/imagepanner.js"></script>
</head>
<body>
<div class="pancontainer" data-orient="center" data-canzoom="yes" style="width: 350px; height: 200px; float: left; position: relative; overflow-x: hidden; overflow-y: hidden; cursor: move; "><img src="./test_files/image.jpg" style="position: absolute; width: 700px; height: 525px; left: -175px; top: -163px; display: block;" />
</div>
</body>
</html>
更新: 显然,多亏了 cmets,tomcat 将 application/xhtml+xml 作为 Content-Type 发送。
HTTP_TRANSACTION_READ_RESPONSE_HEADERS
--> HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By: JSF/1.2
Pragma: no-cache
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: must-revalidate
Expires: Mon, 8 Aug 2006 10:00:00 GMT
Content-Type: application/xhtml+xml;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 09 Jun 2010 07:39:30 GMT
我在web.xml 中添加了一个 mime 类型:
<mime-mapping>
<extension>xhtml</extension>
<mime-type>text/html</mime-type>
</mime-mapping>
但还是不行。我相信FacesServlet 正在读取文件扩展名并发送内容类型,覆盖web.xml 中的配置
<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>*.xhtml</url-pattern>
</servlet-mapping>
我尝试修改 web.xml 配置以将 .xhtml 更改为 .html,但 Faces Servlet 将文件作为 application/xhtml+xml 提供,我想我可以向 webapp 添加一个过滤器,将 Content-Type 修改为text/html 但这有点 hacky。
为什么带有 Facelets 的 JSF 不将文件作为 html 提供?或者怎么做?
更新 找到了如何从 JSF 提供文本/html。你需要添加
<f:view contentType="text/html"/>
在<html> 之后和<head> 之前
现在它在 chrome 中可以正常工作了。
【问题讨论】:
-
使用带有 text/html 的 XHTML doctype 没有积极的影响,它只会强制浏览器进入 quirks 模式。要提供 XHTML 并将其解析为 XML,您必须将其作为 'application/xhtml+xml' 提供。为什么不使用 HTML5 文档类型?它更宽松,并且向后和向前兼容..
-
顺便说一句,您是在本地打开它还是通过网络服务器打开它?如果在本地,Chrome 可能会尝试根据扩展名猜测内容类型。
-
@Sean 无论是在本地还是通过网络服务器(Tomcat)都存在同样的问题。
-
@pakore:你检查过 tomcat 使用的 mime 类型吗?您确定它确实知道发送 .xhtml 文件的正确 mime 类型吗?
-
@Sean_Kinsey 你是对的,tomcat 发送的是 application/xhtml+xm 而不是 text/html。查看我的更新。
标签: xhtml jsf google-chrome content-type facelets