傳統表單提交體驗差,AJAX 非同步驗證可即時回饋。本文完整示範:JSP 頁面表單、onblur 觸發 AJAX GET、原生 XMLHttpRequest 封裝、Servlet 後端驗證、回調處理顯示結果。
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>註冊頁 - AJAX 驗證示範</title>
</head>
<body>
<form action="servlet/RegisterServlet" method="post">
<table>
<tr>
<td>用戶帳號:</td>
<td><input type="text" name="username" id="username" onblur="checkUser(this)" /></td>
</tr>
<tr>
<td>用戶密碼:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td><input type="submit" value="註冊" /></td>
<td><input type="reset" value="重置" /></td>
</tr>
</table>
</form>
<script>
// 建立 XMLHttpRequest(相容 IE6+)
function createXHR() {
return window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
}
// 失去焦點觸發驗證
function checkUser(input) {
var username = input.value.trim();
if (!username) {
alert("用戶名不能為空!");
input.focus();
return;
}
var xhr = createXHR();
var url = "servlet/RegisterServlet?username=" + encodeURIComponent(username);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var result = xhr.responseText.trim();
if (result === "true") {
alert("用戶名可用!");
} else {
alert("用戶名已存在!");
}
}
};
xhr.open("GET", url, true);
xhr.send(null);
}
</script>
</body>
</html>
@WebServlet("/servlet/RegisterServlet")
public class RegisterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.setContentType("text/plain;charset=UTF-8");
String username = req.getParameter("username");
// 模擬資料庫查詢
boolean exists = "admin".equals(username); // 僅示範
resp.getWriter().print(exists ? "false" : "true");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 實際註冊邏輯
}
}
<servlet>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>com.example.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/servlet/RegisterServlet</url-pattern>
</servlet-mapping>
| 項目 | 說明 |
|---|---|
| encodeURIComponent | 防止中文/特殊字元導致 URL 解析錯誤 |
| responseType text/plain | 簡單字串回傳,避免 XML/JSON 解析開銷 |
| trim() 比對 | 防止換行/空白導致判斷失敗 |
| 同步 vs 非同步 | 第三參數 true 為非同步,不阻塞 UI |
fetch() 或 axios,Promise 化、程式碼更簡潔。{"available": true, "message": ""},擴充性更好。setTimeout 延遲 300ms 發送,減少請求頻率。alert,體驗更佳。PreparedStatement 防 SQL 注入。