原始碼在 JSP 中直接撰寫 test test = new test; 並呼叫 test.add(),但這段程式碼缺少 <script> 標籤包裹,且混淆了伺服端 Java 與客戶端 JavaScript 的執行環境:
// RegisterServlet.java
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
// 呼叫 Service/DAO 寫入資料庫
boolean ok = UserService.register(username, password);
resp.setContentType("application/json;charset=UTF-8");
resp.getWriter().write("{\"success\":" + ok + "}");
}
}
<form id="regForm">
<input name="username" id="username" required />
<input name="password" type="password" id="password" required />
<button type="submit">註冊</button>
</form>
<script>
document.getElementById('regForm').addEventListener('submit', function(e) {
e.preventDefault(); // 防止表單傳統提交跳轉
const formData = new FormData(this);
fetch('register', { method: 'POST', body: formData })
.then(r => r.json())
.then(data => {
if (data.success) alert('註冊成功!');
else alert('註冊失敗,請重試');
})
.catch(err => console.error(err));
});
</script>
| 項目 | 伺服端 (Java/JSP/Servlet) | 客戶端 (HTML/JS/CSS) |
|---|---|---|
| 執行階段 | 請求到達伺服器時 | 瀏覽器渲染頁面後 |
| 資料庫存取 | ✅ 直接連線 | ❌ 不可能 |
| 互動方式 | 產生 HTML/JSON 回應 | 發送 HTTP 請求 (AJAX/Fetch) |
<script> 內寫 Java 語法(test t = new test();)→ 瀏覽器報錯 Uncaught SyntaxError。const userId = '${user.id}';(EL 表達式)。onclick="add()" 未阻止預設提交 → 頁面跳轉導致 AJAX 中斷。e.preventDefault() 或 return false。JSP 不是「寫 Java 給瀏覽器跑」的工具。正確做法是:JSP 輸出靜態頁面 → JavaScript 發 AJAX → Servlet 處理業務與資料庫 → 回傳 JSON。釐清前後端職責,是 Web 開發入門最關鍵的一課。