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

Spring IOC 實戰:基於依賴注入的用戶登錄驗證完整示例

     編輯:Java 綜合教學

場景描述

利用 Spring IOC 容器管理 User 憑證對象,通過自動裝配 (byName) 注入到控制器 TestUtil,實現登錄驗證邏輯與視圖跳轉解耦。

完整代碼結構

1. 領域模型 User.java


package com.importnew;

public class User {
    private String username;
    private String password;
    // Getter/Setter 省略
}

2. 控制器 TestUtil.java (繼承 AbstractController)


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"); // 失敗視圖
        }
    }
}

3. Spring 配置 applicationContext.xml


<?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>

4. Web 配置 web.xml


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

關鍵技術點解析

技術點說明
AbstractControllerSpring 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。

現代化改造建議 (Spring 3+ / Spring Boot)


@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 基礎架構的關鍵。

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