虽然 WAP 这个术语在今天的智能手机时代已经很少被提及,但其核心思想——为移动设备(主要是手机)提供简化的网页内容——在今天仍然非常重要,只是形式演变成了 移动优先 和 响应式网页设计。
本教程将分为几个部分:
- 理解 WAP 的本质:它到底是什么,为什么现在还要了解它。
- WAP 开发的核心概念:与普通网页开发的关键区别。
- 技术栈和工具:你需要什么技术。
- 实战演练:创建一个简单的 WAP 站点:一个从头到尾的例子。
- 现代 WAP 开发的演变:如何用现代技术实现类似目标。
第一部分:理解 WAP 的本质
1 什么是 WAP?
WAP (Wireless Application Protocol) 是一套全球性的标准,它使得移动设备(如早期的功能机)能够访问互联网上的信息和应用程序。
你可以把它想象成 “手机版的互联网”,在智能手机普及之前,手机屏幕小、处理能力弱、网络速度慢(通常是 GPRS 或 EDGE),无法直接浏览为电脑设计的复杂网页,WAP 就是为了解决这些问题而生的。
2 WAP 与 WWW 的区别
| 特性 | WAP (Wireless Application Protocol) | WWW (World Wide Web) |
|---|---|---|
| 协议 | WAP 协议栈 (WSP, WTP, WTLS) 通常运行在 WAP 网关上 | HTTP/HTTPS |
| 浏览器 | WAP 浏览器 (如 Opera Mini 早期版本) | 普通浏览器 (Chrome, Firefox, Safari) |
| 目标设备 | 小屏幕、低性能、低带宽的移动设备 | 大屏幕、高性能、高带宽的电脑 |
| 用户体验 | 简洁、文本为主、导航清晰 | 丰富、多媒体、交互复杂 |
3 为什么今天还要学 WAP?
虽然纯粹的 WAP 站点已经非常罕见,但 WAP 的设计理念对今天的移动开发仍有深远影响:
- 性能优化:WAP 教会了我们如何在极端限制下提供核心内容,这个思想是现代移动 Web 开发的基石。
- 移动优先:WAP 是最早的“移动优先”思想实践,它先考虑最差的设备,再逐步增强。
- 响应式设计:现代的响应式网页设计,其本质就是根据设备屏幕大小和性能,动态调整内容和布局,这正是 WAP 想要解决的问题的现代化解决方案。
第二部分:WAP 开发的核心概念
1 WML (Wireless Markup Language)
这是 WAP 开发的核心,WML 就像是 HTML 的“精简版”。
- 卡片和牌组:WML 的内容组织方式,一个
.wml文件可以包含多个card(卡片),多个card组成一个deck(牌组),浏览器会一次性下载整个deck,然后通过<do>和<prev>等标签在card之间导航,减少网络请求。 - 类似 HTML,但标签更少、更简单。
<p>,<a>,<img>,<input>,<select>等。 - 变量和事件:支持简单的变量 (
$variable) 和事件处理,如onenterforward。
2 WMLScript
一种轻量级的脚本语言,类似于 JavaScript,用于在客户端增加简单的交互逻辑,如数据验证、弹出对话框等,但由于其功能有限且兼容性问题,在现代开发中基本被忽略。
3 服务器端处理
PHP 在 WAP 开发中扮演着至关重要的角色,它的主要任务是:
- 动态生成 WML 内容:根据用户请求、数据库数据等,动态输出
.wml格式的字符串。 - 设置正确的 MIME 类型:这是最关键的一步!服务器必须告诉浏览器,它发送的内容是 WML,而不是 HTML,否则,浏览器会将其当作文本显示,而不是解析成页面。
- PHP 设置 MIME 类型的代码:
header("Content-Type: text/vnd.wap.wml");
- PHP 设置 MIME 类型的代码:
第三部分:技术栈和工具
- 后端语言:PHP (本教程核心),也可以是 JSP、ASP.NET 等。
- 数据库:MySQL, SQLite 等,用于存储数据。
- Web 服务器:Apache 或 Nginx。
- WAP 模拟器/真机测试:
- 模拟器:Opera Mobile Emulator (现在叫 Opera Developer) 是一个非常棒的 WAP/WML 测试工具。
- 真机:找一部老式的诺基亚或索尼爱立信手机,或者使用现代手机浏览器的“桌面模式”来查看一些古老的 WAP 站点,感受一下。
第四部分:实战演练:创建一个简单的 PHP WAP 站点
我们将创建一个 WAP 版的“待办事项列表”应用。
步骤 1:环境准备
确保你的本地或服务器环境已经安装了 PHP 和 Apache/Nginx。
步骤 2:创建数据库
创建一个数据库和 todos 表。
CREATE DATABASE wap_todo;
USE wap_todo;
CREATE TABLE todos (
id INT AUTO_INCREMENT PRIMARY KEY,
task VARCHAR(255) NOT NULL,
completed BOOLEAN DEFAULT FALSE
);
步骤 3:创建 WAP 模板文件
为了让代码更清晰,我们先创建一个 WML 模板文件 template.wml。
template.wml
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN" "http://www.wapforum.org/DTD/wml13.dtd">
<wml>
<card id="main" title="Todo List">
<p>
<!-- 这里是动态内容 -->
<?php echo $content; ?>
</p>
</card>
</wml>
注意:DOCTYPE 和 <wml> 标签是 WML 文件的必需部分。
步骤 4:创建主入口文件 index.php
这个文件将处理所有的逻辑,并输出最终的 WML 内容。
index.php
<?php
// 1. 连接数据库
$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'wap_todo';
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($conn->connect_error) {
// 在 WAP 设备上,错误信息要简洁
$content = "数据库连接失败!";
include 'template.wml';
exit();
}
// 2. 设置 WML 的 MIME 类型
header("Content-Type: text/vnd.wap.wml");
// 3. 处理添加新任务的表单提交
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['new_task'])) {
$task = trim($_POST['new_task']);
if (!empty($task)) {
$stmt = $conn->prepare("INSERT INTO todos (task) VALUES (?)");
$stmt->bind_param("s", $task);
$stmt->execute();
// 提交后重定向,避免刷新页面重复提交
header("Location: index.php");
exit();
}
}
// 4. 处理任务完成状态切换
if (isset($_GET['action']) && isset($_GET['id'])) {
$id = (int)$_GET['id'];
if ($_GET['action'] == 'complete') {
$conn->query("UPDATE todos SET completed = 1 WHERE id = $id");
} elseif ($_GET['action'] == 'uncomplete') {
$conn->query("UPDATE todos SET completed = 0 WHERE id = $id");
}
header("Location: index.php");
exit();
}
// 5. 生成动态内容
$content = "<a href='index.php?action=add'>添加新任务</a><br/><br/>";
// 获取所有任务
$sql = "SELECT id, task, completed FROM todos ORDER BY id DESC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$task_text = htmlspecialchars($row['task']);
$status = $row['completed'] ? '[已完成]' : '[未完成]';
$action_link = $row['completed']
? "<a href='index.php?action=uncomplete&id={$row['id']}'>标记未完成</a>"
: "<a href='index.php?action=complete&id={$row['id']}'>标记完成</a>";
$content .= "{$status} {$task_text} - {$action_link}<br/>";
}
} else {
$content .= "暂无任务。<br/>";
}
// 6. 包含模板并输出
include 'template.wml';
$conn->close();
?>
步骤 5:创建添加任务的页面 add.php
add.php
<?php
// 设置 WML 的 MIME 类型
header("Content-Type: text/vnd.wap.wml");
// 直接包含一个添加任务的表单模板
?>
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN" "http://www.wapforum.org/DTD/wml13.dtd">
<wml>
<card id="add" title="添加任务">
<p>
<form method="post" action="index.php">
任务: <input name="new_task" size="15"/><br/>
<do type="accept" label="提交">
<go href="#"/>
</do>
</form>
<br/>
<a href="index.php">返回列表</a>
</p>
</card>
</wml>
步骤 6:测试
- 将
index.php,add.php,template.wml这三个文件放到你的 Web 服务器根目录(如htdocs或www)。 - 在浏览器中访问
http://localhost/你的文件夹名/index.php。 - 如果你使用的是普通浏览器,看到的会是原始的 XML/WML 代码,这就是为什么我们需要 WAP 模拟器或设置正确的 MIME 类型,现代浏览器默认不解析 WML。
- 使用 Opera Mobile Emulator 或一部老手机来访问,你应该能看到一个功能完整的 WAP 待办事项列表。
第五部分:现代 WAP 开发的演变
我们不再使用 WML,而是采用更现代、更强大的技术来实现为移动设备优化的网站。
响应式网页设计
这是目前最主流的方案,使用 HTML5 + CSS3 + JavaScript。
-
核心:通过 媒体查询 来检测设备的屏幕尺寸、方向等,并应用不同的 CSS 样式。
-
示例:
/* 默认样式,适用于手机 */ .container { width: 100%; padding: 10px; } /* 当屏幕宽度大于 768px 时(平板或桌面) */ @media (min-width: 768px) { .container { width: 750px; margin: 0 auto; padding: 20px; } }
移动优先
一种设计哲学,先为小屏幕的移动设备设计内容和布局,然后使用媒体查询逐步为更大的屏幕添加样式和功能,这确保了所有用户,无论使用什么设备,都能获得核心内容和良好的基础体验。
渐进式 Web 应用
结合了 Web 和原生应用的优势,提供类似 App 的体验(如离线工作、推送通知、添加到主屏幕),它通常使用现代的 Web API(如 Service Worker, Web App Manifest)构建。
PHP 的角色
在现代化的移动 Web 开发中,PHP 的角色没有变,它依然是强大的后端引擎,负责:
- 提供 RESTful API 接口,供前端(Vue, React, Angular)或移动 App 调用。
- 动态生成 HTML 页面,并通过 CDN 加速,确保全球用户都能快速访问。
- 处理用户认证、数据存储等后端逻辑。
- WAP 是历史:它是一种为早期功能机设计的、基于 WML 的技术。
- WAP 的思想是未来:它所倡导的性能优化、移动优先、内容为王的理念,是现代移动 Web 开发的核心。
- PHP 是强大的后端:无论是过去生成 WML,还是今天构建 API 和响应式网站,PHP 都能胜任。
学习 WAP 的历史有助于你更好地理解移动 Web 开发的演进,并让你写出更高效、更注重用户体验的代码,希望这份教程对你有帮助!
