请求生命周期
Dispatcher → Action → Interceptor → Result,严格按链路走向。
Dispatcher
Action
Interceptors
Result
%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="s" uri="/struts-tags" %>
所有课程模块(首页/实验/JSON 等)都由 AuthInterceptor 保护,未登录访问会自动跳转。请先登录再回来。
每个模块都通过 `.action` 路由触达,由统一的 Session 鉴权链路保护。
未登录访问 `dashboard.action` 等任何端点都会被 AuthInterceptor 重定向至 `loginPage.action`。
`UserAction` 按字段绑定,`ValidationAction` 造成的字段错误会带回当前 JSP。
`ajax.action` 返回对话式 JSON,`api/users.action` 呈现 REST 样式,便于教学对照。