register.java // JavaBean:封裝表單數據、驗證邏輯、錯誤訊息
index.jsp // 註冊表單頁
check.jsp // 接收提交、自動綁定、驗證、決定去向
success.jsp // 成功頁,顯示用戶信息
register.javapackage javabean01;
import java.util.*;
public class RegisterBean implements java.io.Serializable {
private String name;
private String age; // 前端輸入皆為 String,Bean 內驗證轉型
private Map errors = new HashMap<>();
public RegisterBean() {
this.name = ""; this.age = ""; this.errors = new HashMap<>();
}
// 驗證入口
public boolean isValidate() {
boolean ok = true;
if (!age.matches("\\d+")) {
ok = false; this.age = ""; errors.put("errage", "年齡只能是數字");
}
if (!name.matches("\\w{6,15}")) {
ok = false; this.name = ""; errors.put("errname", "用戶名需 6-15 位字母數字下劃線");
}
return ok;
}
public String getErrorMsg(String key) {
return errors.getOrDefault(key, "");
}
// 標準存取器 (供 jsp:setProperty 自動綁定)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getAge() { return age; }
public void setAge(String age) { this.age = age; }
}
index.jsp — 註冊表單<form action="check.jsp" method="post">
用戶名:<input name="name" value="${param.name}">
<span style="color:red">${registerBean.errorMsg.errname}</span><br>
年齡:<input name="age" value="${param.age}">
<span style="color:red">${registerBean.errorMsg.errage}</span><br>
<input type="submit" value="註冊">
</form>
check.jsp — 處理與分發<%@ page contentType="text/html;charset=utf-8" %>
<jsp:useBean id="registerBean" class="javabean01.RegisterBean" scope="request">
<jsp:setProperty name="registerBean" property="*"/>
</jsp:useBean>
<%
if (registerBean.isValidate()) {
// 驗證通過,轉發成功頁 (保留 request 屬性)
request.getRequestDispatcher("success.jsp").forward(request, response);
} else {
// 驗證失敗,回顯表單 (同 request)
request.getRequestDispatcher("index.jsp").forward(request, response);
}
%>
success.jsp — 顯示結果<h3>註冊成功!</h3>
用戶名:<jsp:getProperty name="registerBean" property="name"/><br>
年齡:<jsp:getProperty name="registerBean" property="age"/><br>
isValidate() 封裝所有規則,Controller 無業務判斷。errors.put(key, msg) 統一管理,getErrorMsg(key) 靈活取用。forward 回表單頁,${param.xxx} 与 registerBean.getXxx() 雙重保障回顯。this.name = "" 避免髒數據污染回顯。// Controller
@PostMapping("/register")
public String register(@Valid RegisterForm form, BindingResult br, Model m) {
if (br.hasErrors()) return "register"; // 自動回顯 + 錯誤綁定
service.register(form);
return "redirect:/success";
}
// Form (Record + Bean Validation)
public record RegisterForm(
@NotBlank @Pattern(regexp="\\w{6,15}") String name,
@NotNull @Min(1) @Max(150) Integer age
) {}
// register.html (Thymeleaf)
<input name="name" th:value="${registerForm.name}" th:errorclass="is-invalid">
<span th:if="${#fields.hasErrors('name')}" th:errors="*{name}" class="error"></span>
**聲明式驗證 + 自動綁定 + 重導向結束**,代碼量減少 70%,零手工錯誤收集。