利用 Spring IOC 容器管理 User 憑證對象,通過自動裝配 (byName) 注入到控制器 TestUtil,實現登錄驗證邏輯與視圖跳轉解耦。
package com.importnew;
public class User {
private String username;
private String password;
// Getter/Setter 省略
}
package com.importnew;
import javax.servlet.http.*;
import org.springframework.web.servlet.*;
import org.springframework.web.servlet.mvc.AbstractController;
public class TestUtil extends AbstractController {
private User user; // 由容器注入
public void setUser(User user) { this.user = user; }
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse resp) throws Exception {
String username = req.getParameter("username");
String password = req.getParameter("password");
if (username != null && username.equals(user.getUsername())
&& password != null && password.equals(user.getPassword())) {
return new ModelAndView("yes"); // 登錄成功視圖
} else {
return new ModelAndView("Error"); // 失敗視圖
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 視圖解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 用戶憑證 Bean -->
<bean id="user" class="com.importnew.User">
<property name="username" value="admin" />
<property name="password" value="123" />
</bean>
<!-- 控制器:autowire="byName" 會自動匹配 setUser(User) -->
<bean id="testUtil" class="com.importnew.TestUtil" autowire="byName">
<property name="user" ref="user" /> <!-- 顯式引用也可 -->
</bean>
</beans>
<web-app>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
| 技術點 | 說明 |
|---|---|
AbstractController | Spring MVC 早期控制器基類,需 spring-webmvc 依賴。現代項目推薦 @Controller + @RequestMapping。 |
autowire="byName" | 按 setter 方法名 (setUser) 匹配 Bean id (user)。若 Bean id 為 user、setter 為 setUser,自動注入。 |
InternalResourceViewResolver | 前綴 + 邏輯視圖名 + 後綴 = 物理 JSP 路徑。如 "yes" → "/yes.jsp"。 |
DispatcherServlet | 前端控制器,攔截 *.do 請求,加載上下文,分發到映射的 Controller。 |
@Controller
@RequestMapping("/login")
public class LoginController {
@Value("${app.admin.username}") // 從配置文件讀取
private String adminUsername;
@Value("${app.admin.password}")
private String adminPassword;
@PostMapping
public String login(@RequestParam String username, @RequestParam String password, Model model) {
if (adminUsername.equals(username) && adminPassword.equals(password)) {
return "redirect:/dashboard"; // 重定向
}
model.addAttribute("error", "用戶名或密碼錯誤");
return "login"; // 返回登錄頁
}
}
優勢:注解驅動、配置外部化、RESTful 風格、易測試、無 XML。
本例展示了 Spring IOC 核心價值:依賴反轉 將「創建 User、裝配到 Controller」的控制權交給容器,業務代碼專注於「驗證邏輯」。理解 autowire、ViewResolver、DispatcherServlet 三大組件交互,是掌握 Spring MVC 基礎架構的關鍵。