首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JavaBean 入門(六):登入註冊綜合實戰 — 驗證、錯誤收集與回顯

     編輯:關於JSP

專案結構

register.java          // JavaBean:封裝表單數據、驗證邏輯、錯誤訊息
index.jsp              // 註冊表單頁
check.jsp              // 接收提交、自動綁定、驗證、決定去向
success.jsp            // 成功頁,顯示用戶信息

核心 Bean register.java

package 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; }
}

頁面流程

1. 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>

2. 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);
  }
%>

3. success.jsp — 顯示結果

<h3>註冊成功!</h3>
用戶名:<jsp:getProperty name="registerBean" property="name"/><br>
年齡:<jsp:getProperty name="registerBean" property="age"/><br>

關鍵設計亮點

  1. Bean 內聚驗證:isValidate() 封裝所有規則,Controller 無業務判斷。
  2. 錯誤收集 Map:errors.put(key, msg) 統一管理,getErrorMsg(key) 靈活取用。
  3. forward 保留 Request:驗證失敗時 forward 回表單頁,${param.xxx} 与 registerBean.getXxx() 雙重保障回顯。
  4. 清空無效輸入:驗證失敗時 this.name = "" 避免髒數據污染回顯。

現代化重構對比 (Spring Boot + Thymeleaf)

// 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%,零手工錯誤收集。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved