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

Java Web 進階學習:MVC 查詢模式完整實戰詳解

     編輯:Java 相關知識

前言

在 Java Web 開發學習的道路上,MVC(Model-View-Controller)架構模式是必須掌握的核心基礎。本文將透過一個完整的「學生信息查詢」實戰案例,深入剖析 MVC 在查詢業務中的具體應用流程,並分享實際開發中遇到的 SQL Server 連線問題及解決方案。

一、MVC 架構核心概念解析

什麼是 MVC?

MVC 全稱為 Model-View-Controller(模型-視圖-控制器),是一種經典的軟體設計模式,將應用程式拆分為三大核心模組,各司其職:

  • 模型:應用程式的核心主體,封裝業務邏輯與資料存取。一個模型可為多個視圖提供資料支援。
  • 視圖:用戶直接看到並互動的介面層。負責資料展示與接收用戶輸入,不包含任何實際業務處理邏輯。
  • 控制器:接收用戶請求,協調模型與視圖,完成用戶需求的中樞。

MVC 查詢業務流程

  1. 客戶端發送請求至伺服器
  2. 伺服器將請求分派給 Servlet(控制器)
  3. Servlet 根據業務邏輯調用 Model 層(DAO)
  4. Model 執行資料庫查詢,返回結果集
  5. Servlet 將結果存入 Request 域
  6. 透過轉發或重定向導向對應的 JSP 頁面(視圖)
  7. JSP 從 Request 域取得資料並渲染顯示

二、實戰案例:學生信息查詢系統

需求描述

點擊頁面超連結,查詢並顯示資料庫中所有學生的詳細信息。

專案目錄結構

src/
├── cn.edu.student.domain.Student.java      // 實體類
├── cn.edu.student.dao.StudentDao.java      // 資料存取層
├── cn.edu.student.servlet.ListAllStudentServlet.java // 控制器
├── WebContent/
│   ├── test.jsp                            // 請求發起頁面
│   └── student.jsp                         // 結果顯示頁面

1. 實體類:Student.java

package cn.edu.student.domain;

public class Student {
    private String studentId;  // 學號
    private String name;       // 姓名
    private String idCard;     // 身份證號
    private String sex;        // 性別
    private int age;           // 年齡
    private int grade;         // 年級

    // 構造器、Getter/Setter 方法省略...
}

2. 資料存取層:StudentDao.java

package cn.edu.student.dao;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import cn.edu.student.domain.Student;
import cn.edu.student.util.DBConnection;

public class StudentDao {
    public List<Student> getAll() {
        List<Student> students = new ArrayList<>();
        ResultSet rs = null;
        try {
            String sql = "SELECT studentId, name, idCard, sex, age, grade FROM student";
            rs = DBConnection.executeQuery(sql);
            while (rs.next()) {
                Student student = new Student(
                    rs.getString("studentId"),
                    rs.getString("name"),
                    rs.getString("idCard"),
                    rs.getString("sex"),
                    rs.getInt("age"),
                    rs.getInt("grade")
                );
                students.add(student);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
            }
        }
        return students;
    }
}

3. 控制器:ListAllStudentServlet.java

package cn.edu.student.servlet;

import java.io.IOException;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;
import cn.edu.student.dao.StudentDao;
import cn.edu.student.domain.Student;

public class ListAllStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        StudentDao studentDao = new StudentDao();
        List<Student> students = studentDao.getAll();
        request.setAttribute("students", students);
        request.getRequestDispatcher("/student.jsp").forward(request, response);
    }
}

4. 請求發起頁面:test.jsp

<a href="listAllStudent">查詢所有學生信息</a>

5. 結果顯示頁面:student.jsp

<%@ page import="java.util.List, cn.edu.student.domain.Student" %>
<body>
    <% List<Student> students = (List<Student>) request.getAttribute("students"); %>
    <h3>學生信息表</h3>
    <table border="1" cellpadding="5" cellspacing="0">
        <tr>
            <th>學號</th><th>姓名</th><th>身份證號</th>
            <th>性別</th><th>年齡</th><th>年級</th>
        </tr>
        <% for (Student student : students) { %>
        <tr>
            <td><%= student.getStudentId() %></td>
            <td><%= student.getName() %></td>
            <td><%= student.getIdCard() %></td>
            <td><%= student.getSex() %></td>
            <td><%= student.getAge() %></td>
            <td><%= student.getGrade() %></td>
        </tr>
        <% } %>
    </table>
</body>

三、實戰踩坑記:SQL Server SSL 連線失敗

問題現象

連接 SQL Server 時拋出異常:驅動程式無法通過安全套接字層(SSL)加密與 SQL Server 建立安全連接。錯誤:"Server key"

根因分析

JDK 與資料庫之間的安全金鑰協商失敗,通常是因為 JDK 版本過舊(如 JDK 1.6)不支援較新的 SSL/TLS 協議版本。

解決方案

  1. 下載 Bouncy Castle 加密庫兩個 JAR 包:
    • bcprov-ext-jdk15on-1.54.jar
    • bcprov-jdk15on-1.54.jar
  2. 將 JAR 包複製到 JDK 安裝目錄下:JDK_HOME\jre\lib\ext
  3. 修改 JDK_HOME\jre\lib\security\java.security 文件,將安全提供者優先級調整:
    # 原配置
    security.provider.1=sun.security.provider.Sun
    
    # 修改為
    security.provider.1=org.bouncycastle.jce.provider.BouncyCastleProvider
    
  4. 重啟應用伺服器驗證

四、總結與建議

本文透過完整的 MVC 查詢實戰案例,展示了從實體類、DAO、Servlet 到 JSP 的標準開發流程。重點補充了 legacy 環境下 SQL Server SSL 連線問題的排查思路。建議初學者:

  • 掌握 MVC 三層職責邊界,避免在 JSP 中混寫業務邏輯
  • 資源關閉(ResultSet、Connection)務必放在 finally 區塊
  • 遇到 JDBC 連線問題優先檢查驅動版本與 JDK 相容性
  • 實際專案建議採用連線池(Druid/HikariCP)與 ORM 框架(MyBatis/JPA)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved