日期:2014-05-17  浏览次数:20730 次

XHTML MP MIME 类型与文件扩展

MIME 类型

下面三个 MIME 类型可用于 XHTML MP 文档:

?? application/vnd.wap.xhtml+xml
?? application/xhtml+xml
?? text/html
 

开放移动联盟 (Open Mobile Alliance, OMA) 为 XHTML MP 文档指定的 MIME 类型为 "application/vnd.wap.xhtml+xml". 该 MIME 类型对于要正确显示 XHTML MP 文档的一些 WAP 浏览器 (比如, 一些诺基亚60系列浏览器) 来说是必须的.

另一个可选择的 MIME 类型是 "application/xhtml+xml". 该类型是 XHTML 系列文档的 MIME 类型.

"text/html" MIME 类型也是一个可用的选择. 它是 HTML 文档的 MIME 类型. XHTML MP 文档使用 "text/html" 有一个好处是你的 XHTML MP 页面在普通 Web 浏览器是显示也是没有任何问题的. (一些像 IE6 之类的 Web 浏览器并不能显示带有 "application/vnd.wap.xhtml+xml" 或 "application/xhtml+xml" MIME 类型的文档, 而是会弹出对话框让你用外部程序打开或找个地方保存文件.) 缺点是用户代理 (User Agent) 将不会把你的 XHTML MP 页面视为 XML 文档, 也就意味着即使标记代码没有严格遵守 XML 规则, 用户代理也不会抱怨什么.

? 动态选择 MIME 类型

另一个选项是探测某用户代理可处理的 MIME 类型从而动态地选择. 例如,? 你的服务器发现某用户代理能处理 "application/vnd.wap.xhtml+xml" MIME 类型, 然后你的所有 XHTML MP 文档都会用 "application/vnd.wap.xhtml+xml" 传输给该用户代理.

要想动态选择 MIME 类型, 你需要用服务器端语言 (如 PHP, ASP, JSP, Perl) 写几行代码. 伪代码如下:

?? 1. 获取收到的 HTTP 请求的 Accept Header 值. Accept Header 包含了发送请求的客户端用户代理所能处理的所有的 MIME 类型.

?? 2. 如果 Accept Header 值包含 "application/vnd.wap.xhtml+xml", 将 XHTML MP 文档的 MIME 类型设为 "application/vnd.wap.xhtml+xml".
???? 否则如果 Accept Header 值包含 "application/xhtml+xml", 将 XHTML MP 文档的 MIME 类型设为 "application/xhtml+xml".
???? 否则将 XHTML MP 文档的 MIME 类型设为 "text/html".

下面的例子演示了怎样用 PHP 编写上述代码. 如果你用的服务器端技术不是 PHP, 代码将稍有不同, 但基本思想没有变化.

<?php
$acceptHeader = $_SERVER['HTTP_ACCEPT'];
 
if (false !== strpos($acceptHeader, 'application/vnd.wap.xhtml+xml'))
? header('Content-type: application/vnd.wap.xhtml+xml');
else if (false !== strpos($acceptHeader, 'application/xhtml+xml'))
? header('Content-type: application/xhtml+xml');
else
? header('Content-type: text/html');
?>
 

这里是上述 PHP 代码的一些描述:

1. Accept Header 的值是从 HTTP 请求中获取的. 然后将其存放于 acceptHeader 中.

$acceptHeader = $_SERVER['HTTP_ACCEPT'];
 

2. 接下来, 检查变量 $acceptHeader, 看其是否包含关键字 "application/vnd.wap.xhtml+xml" 或 "application/xhtml+xml". 字符串函数 strpos(string $haystack, string $needle) 返回 $needle 第一次出现的位置. 如果没有找到 $needle, strpos(string $haystack, string $needle) 将返回 false. 也就是说, 如果找到 $needle 了的话, 返回值将不会是 false.

if (false !== strpos($acceptHeader, 'application/vnd.wap.xhtml+xml'))
...
else if (false !== strpos($acceptHeader, 'application/xhtml+xml'))
...
 

3. 方法

header('Content-type: ...');
 

用于设置文档的 MIME 类型.

?

下面的例子演示了如何在实际的 XHTML MP 文档中使用 PHP 代码. 你要做的非常简单 -- 复制 PHP 代码并粘贴到 XHTML MP 文档中 并用 ".php" 作为文件扩展名. (我们将在后面的章节中作深入讨论此例中的 XHTML MP 标记.)

(hello_world.php)

<?php
$acceptHeader = $_SERVER['HTTP_ACCEPT'];
 
if (false !== strpos($acceptHeader, 'application/vnd.wap.xhtml+xml'))
? header('Content-type: application/vnd.wap.xhtml+xml');
else if (false !== strpos($acceptHeader, 'application/xhtml+xml'))
? header('Content-type: application/xhtml+xml');
else
? header('Content-type: text/html');
?>
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" 
"http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
? <head>
??? <title>XHTML MP 教程</title>
? </head>
 
? <body>
??? <p>大家好. 欢迎大家来学习 XHTML MP 教程.</p>
? </body>
</html>
 

文件扩展

静态 XHTML MP 文档的典型扩展名为 ".xhtml", ".html" and ".htm". 只要在 WAP 服务器的配置文件里正确设置了和文件扩展相关联的 MIME 类型, 你就可以使用你喜欢的其它文件扩展. 如果你要用 ASP, JSP, Perl, PHP 或 SSI (服务器端包含) 之类的服务器端语言往 XHTML MP 文档中动态添加内容, 你或许要将你的 XHTML MP 文档的文件扩展修改为服务器端所用的技术. 例如, PHP 所用的典型扩展为 ".php", 而 SSI 所用的典型扩展为 ".shtml".

?

多普达S1 IE:??