MVC(Model-View-Controller)是一種軟件設計模式,用于將應用程序分解為三個相互關聯的組件:模型(Model)、視圖(View)和控制器(Controller)。這種模式在構建用戶界面和圖形界面應用程序時特別有用,它促進了代碼的模塊化和可維護性。
以下是MVC模式中每個組件的簡要描述:
1. **模型(Model)**:
? ?- 模型是應用程序的核心,代表應用程序的數據和業務邏輯。
? ?- 它管理應用程序的狀態和數據,并實現所有的業務規則。
? ?- 模型不直接與用戶界面交互,它通過控制器接收用戶的輸入和數據請求。
2. **視圖(View)**:
? ?- 視圖是用戶界面的一部分,負責展示數據(模型)給用戶,并接收用戶的輸入。
? ?- 它從模型中獲取數據,并定義數據的呈現方式。
? ?- 視圖應該盡可能簡單,不包含任何業務邏輯。
3. **控制器(Controller)**:
? ?- 控制器是模型和視圖之間的中介,它接收用戶的輸入并調用模型進行相應的更新。
? ?- 它還負責選擇視圖來顯示模型的數據,并處理用戶的交互。
? ?- 控制器解釋用戶的輸入,并轉換這些輸入為對模型的操作或對視圖的更新。
MVC模式的工作流程通常如下:
1. 用戶與視圖交互,發送請求。
2. 控制器接收請求,并決定調用哪個模型來處理請求。
3. 模型根據請求執行業務邏輯,并可能更新其狀態。
4. 控制器選擇合適的視圖來顯示模型的數據。
5. 視圖呈現數據給用戶。
MVC模式的主要優點包括:
- **代碼分離**:業務邏輯、數據和用戶界面被分離,使得代碼更易于管理和維護。
- **可擴展性**:由于組件之間的低耦合,可以獨立地修改或替換模型、視圖和控制器。
- **可復用性**:模型和控制器可以在不同的視圖上復用,視圖可以在不同的模型上復用。
- **測試友好**:由于業務邏輯和數據與用戶界面分離,可以更容易地進行單元測試。
MVC模式被廣泛用于Web應用程序開發,特別是在Java的Spring框架、ASP.NET MVC、Ruby on Rails等Web開發框架中。
SSM框架是指Spring、SpringMVC和MyBatis這三個開源框架的集合,它們通常一起使用來構建復雜的Java Web應用程序。每個框架都承擔著不同的角色:
1. **Spring**:Spring是一個輕量級的Java企業級應用開發框架,主要提供IoC(控制反轉)和AOP(面向切面編程)的支持。Spring框架的核心功能是提供依賴注入(DI),這使得應用程序的組件更加模塊化,易于測試和重用。Spring還提供了對事務管理、數據訪問、消息傳遞、安全性等企業服務的支持。
2. **SpringMVC**:SpringMVC是Spring框架的一部分,專門用于構建Web應用程序的MVC(模型-視圖-控制器)模式實現。它分離了應用程序的輸入、處理和輸出,使得代碼更加清晰和易于維護。SpringMVC處理HTTP請求并將它們映射到特定的處理器方法,這些方法通常返回模型和視圖,以呈現給用戶。
3. **MyBatis**:MyBatis是一個持久層框架,它提供了對數據庫的操作支持。MyBatis使用簡單的XML或注解用于配置和映射原生信息,將接口和Java的POJOs(Plain Old Java Objects)映射成數據庫中的記錄。MyBatis的主要特點是靈活,它允許開發者自己編寫SQL,從而提供了更好的性能和可定制性。
SSM框架的結合使用,可以提供一種分層架構,其中:
- Spring負責管理應用程序的業務邏輯和依賴注入。
- SpringMVC負責處理Web層的請求和響應。
- MyBatis負責數據訪問層的操作,即與數據庫的交互。
這種分層架構有助于提高代碼的可讀性、可維護性和可擴展性。SSM框架是構建大型Java Web應用程序的流行選擇,因為它結合了三個框架的最佳特性,提供了一個強大、靈活且易于使用的開發環境。
?
Spring框架的三個核心技術是IoC(控制反轉)、DI(依賴注入)和AOP(面向切面編程)。下面是這三個技術的簡述:
1. **IoC(控制反轉)**:
? ?- 控制反轉是一種設計原則,它將對象創建和依賴管理的控制權從程序代碼轉移到外部容器(在Spring中是Spring容器)。
? ?- 通過IoC,開發者不再直接在代碼中創建對象和配置依賴,而是通過配置文件或注解來描述這些關系,由Spring容器負責對象的創建和依賴的注入。
? ?- IoC有助于減少代碼的耦合度,提高代碼的可測試性和可維護性。
2. **DI(依賴注入)**:
? ?- 依賴注入是IoC的一種實現方式,它允許將依賴的對象通過構造函數、工廠方法或屬性設置注入到另一個對象中。
? ?- Spring通過DI來管理應用程序中的對象依賴關系,使得開發者可以專注于業務邏輯,而不必擔心對象的創建和依賴問題。
? ?- DI有助于實現模塊化和可重用的組件,同時也使得單元測試更加容易。
3. **AOP(面向切面編程)**:
? ?- 面向切面編程是一種編程范式,它允許開發者將橫切關注點(如日志、事務、安全等)與業務邏輯分離。
? ?- AOP通過切面(Aspect)來定義橫切關注點,并通過通知(Advice)將這些關注點織入到程序的指定位置(連接點,Join Point)。
? ?- Spring AOP提供了一種聲明式的方式來管理橫切關注點,從而減少了代碼的重復性和復雜性,提高了代碼的可維護性。
總結來說,IoC和DI使得依賴管理更加靈活和可配置,而AOP則提供了在不修改核心業務邏輯的情況下,將橫切關注點織入到應用程序中的能力。這三個核心技術共同構成了Spring框架的核心優勢,使得它成為開發企業級Java應用程序的流行選擇。
?
【登錄操作】
①業務邏輯層(模型)建立 JavaBean類 User【GET SET方法 無參構造方法】
public class User {private String username;private String password;public User() {}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
②接口類 UserDao?
public interface UserDao {void saveUser(User user);ArrayList<User> selectUser();
}
③接口實現 UserDaoimpl
3.1實現數據庫鏈接
public class UserDaoimpl implements UserDao{//先接入JDBCprivate static String driver = "com.mysql.jdbc.Driver";private static String dbUrl = "jdbc:mysql://localhost:3306/db";private static String dbUser = "root";private static String dbpsw="123456";//無參構造法public UserDaoimpl(){}//獲取Connectionpublic Connection getConnection(){Connection con = null;try {Class.forName(driver);con = DriverManager.getConnection(dbUrl,dbUser,dbpsw);}catch (Exception e){e.printStackTrace();}return con;}
}
3.2實現保存用戶信息功能(在impl類中繼續添加方法)
@Overridepublic void saveUser(User user) {Connection con =null;PreparedStatement stmt =null;try {con.setAutoCommit(false);con = getConnection();String sql = "insert into user (username,password) values (?,?)";stmt = con.prepareStatement(sql);stmt.setString(1,user.getUsername());stmt.setString(2,user.getPassword());stmt.execute();con.commit();} catch (Exception e){try {con.rollback();}catch (SQLException s){s.printStackTrace();}finally {try {stmt.close();con.close();}catch (Exception e){e.printStackTrace();}}}}
3.3查詢所有用戶信息
@Overridepublic ArrayList<User> selectUser() {Connection con= null;PreparedStatement pstm =null;ResultSet rs = null;ArrayList<User> users =new ArrayList<>();try {con = getConnection();String sql = "select * from User";pstm = con.prepareStatement(sql);rs = pstm.executeQuery();User user =new User();while (rs.next()){user.setUsername(rs.getString(1));user.setPassword(rs.getString(2));users.add(user);}rs.close();pstm.close();con.close();} catch (SQLException e) {throw new RuntimeException(e);}return users;}
}
④Servlet類
@WebServlet("/login")
public class Http extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name = req.getParameter("username");String psw = req.getParameter("password");User user = new User();UserDao userDao =new UserDaoimpl();ArrayList<User> users = userDao.selectUser();//實現登錄功能//實現條件查詢方法 與查詢類似只需更改sql語句//用getParameter接受到的name psw與數據庫中的一致if (name.equals(users.get(0).getUsername())&&psw.equals(users.get(0).getPassword())){req.setAttribute("username",name);//攜帶name返回req.getRequestDispatcher("/welcome.jsp").forward(req,resp);//跳轉至welcome頁 請求轉發攜帶信息return;}else {resp.sendRedirect("/login.jsp");//重定向不攜帶信息}}
}
⑤表單提交
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><form action="login" name="1" ><input type="text" placeholder="name" name="username"><br><input type="password" name="password" placeholder="psw"><br><button type="submit" value="login">denglu</button></form></body>
</html>