虽然 WAP 这个术语在今天的智能手机时代已经很少被提及,但其核心思想——为移动设备(主要是手机)提供简化的网页内容——在今天仍然非常重要,只是形式演变成了 移动优先响应式网页设计

本教程将分为几个部分:

  1. 理解 WAP 的本质:它到底是什么,为什么现在还要了解它。
  2. WAP 开发的核心概念:与普通网页开发的关键区别。
  3. 技术栈和工具:你需要什么技术。
  4. 实战演练:创建一个简单的 WAP 站点:一个从头到尾的例子。
  5. 现代 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 开发中扮演着至关重要的角色,它的主要任务是:

  1. 动态生成 WML 内容:根据用户请求、数据库数据等,动态输出 .wml 格式的字符串。
  2. 设置正确的 MIME 类型:这是最关键的一步!服务器必须告诉浏览器,它发送的内容是 WML,而不是 HTML,否则,浏览器会将其当作文本显示,而不是解析成页面。
    • PHP 设置 MIME 类型的代码:header("Content-Type: text/vnd.wap.wml");

第三部分:技术栈和工具

  • 后端语言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:测试

  1. index.php, add.php, template.wml 这三个文件放到你的 Web 服务器根目录(如 htdocswww)。
  2. 在浏览器中访问 http://localhost/你的文件夹名/index.php
  3. 如果你使用的是普通浏览器,看到的会是原始的 XML/WML 代码,这就是为什么我们需要 WAP 模拟器或设置正确的 MIME 类型,现代浏览器默认不解析 WML。
  4. 使用 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 开发的演进,并让你写出更高效、更注重用户体验的代码,希望这份教程对你有帮助!