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:??
accept:text/html; text/vnd.sun.j2me.app-descriptor, */*??
accept-language:zh-cn??
?
多普达S1 UCWeb??
host:123.122.99.136??
accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, dn/807993233-aa6ec33c,ss/220x268??
摩托罗拉L7??
host:123.122.99.136??
accept:application/vnd.wap.wmlc, application/vnd.wap.wbxml, application/vnd.wap.wmlscriptc, text/wml, text/vnd.wap.wml, text/html, text/css, application/xhtml+xml, application/vnd.wap.xhtml+xml, application/vnd.wap.multipart.related, application/vnd.wap.multipart.mixed, multipart/mixed, application/vnd.wap.sic, application/vnd.phonecom.mmc-wbxml, application/vnd.oma.dd+xml, application/motorola-mmstemplate, image/gif, image/bmp, image/vnd.wap.wbmp, image/png, image/jpeg, image/ems.userdefined.picture, image/ems.userdefined.animation, image/ems.predefined.animation, audio/imelody, audio/mid, audio/midi, audio/x-midi, audio/mp3, audio/mpeg, audio/mpeg3, audio/mpg, audio/x-mp3, audio/x-mpeg, audio/x-mpeg3, audio/x-mpg, audio/x-wav, audio/wav, audio/amr, audio/mp4, audio/3gpp, audio/m4a, audio/x-m4a, video/mp4, video/3gpp, application/vnd.oma.drm.message, application/vnd.oma.drm.rights+xml, application/vnd.oma.drm.content, application/vnd.oma.drm.rights+wbxml, text/x-vcard, text/x-vcalendar, text/uri-list, text/vnd.sun.j2me.app-descriptor, application/java-archive, application/octet-stream, application/vnd.wap.mms-message, text/vnd.wap.si, text/plain, text/vnd.wap.wmlscript??
accept-application:2,4??
accept-charset:UTF-8??
诺基亚E71??
host:123.122.99.136??
accept:text/html, text/css, multipart/mixed, application/java-archive, application/java, application/x-java-archive, text/vnd.sun.j2me.app-descriptor, application/vnd.oma.drm.message, application/vnd.oma.drm.content, application/vnd.oma.dd+xml, application/vnd.oma.drm.rights+xml, application/vnd.oma.drm.rights+wbxml, application/x-nokia-widget, */*, text/x-vcard, text/x-vcalendar, image/gif, image/vnd.wap.wbmp??
accept-charset:iso-8859-1, utf-8; q=0.7, *; q=0.7