淺談MVC設計模式

什麼是MVC?

     MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。


換句話說:

Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。
  通常模型對象負責在數據庫中存取數據。
View(視圖)是應用程序中處理數據顯示的部分。
  通常視圖是依據模型數據創建的。
Controller(控制器)是應用程序中處理用戶交互的部分。
  通常控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。

     MVC是一個框架模式,它強制性的使應用程序的輸入、處理和輸出分開。使用MVC應用程序被分成三個核心部件:模型、視圖、控制器。它們各自處理自己的任務。最典型的MVC就是JSP + servlet + javabean的模式

Model:常用javabean去實現,通過各種類來對數據庫的數據進行獲取,並封裝在對象當中。

View:常用JSP來實現,通過可直接觀察的JSP頁面來展示我們從數據庫中獲取的數據。

Controller:常用servlet來實現,通過servlet來獲取經過javabean包裝過的對象(已存入數據庫中的數據),然後再發送數據傳輸到JSP界面。


這裏可能有人會想知道,javabean是什麼:

JavaBean 是一種Java語言寫成的可重用組件。爲寫成JavaBean,類必須是具體的和公共的,並且具有無參數的構造器。JavaBean 通過提供符合一致性設計模式的公共方法將內部域暴露成員屬性,long和class方法獲取。衆所周知,屬性名稱符合這種模式,其他Java 類可以通過自省機制發現和操作這些JavaBean 的屬性。

JavaBean一般由三部分組成:

1.屬性

2.方法

3.事件

實際上JavaBean是一種Java類,通過封裝屬性和方法成爲具有某種功能或者處理某個業務的對象,簡稱bean。由於javabean是基於java語言的,因此javabean不依賴平臺,具有以下特點:
1. 可以實現代碼的重複利用
2. 易編寫、易維護、易使用
3. 可以在任何安裝了Java運行環境的平臺上的使用,而不需要重新編譯
總結:
粗俗的講,javabean就是一個簡單的類,但是這個類要有set()、get()方法,還有類中的屬性都要是私有化的(private),方法是公有化的(public),還有就是要有一個無參的構造方法,如果你要設置了帶參數的構造方法,那麼請把無參的構造方法重新寫一次,因爲默認的構造方法會被帶參數的構造方法覆蓋掉。

根據經典模式(JSP + servlet + javabean)來舉範例:
場景:我們把數據庫中的表的信息顯示在JSP頁面上。
這是數據庫的數據:

我們需要創建一個動態網頁項目(Dynamic Web project ),然後倒入兩個jar包進去這個項目中。

   倒入項目的2種方法:

   1.設置成maven工程,在pom.xml文件中倒入jar包的<dependency></dependency>

   

[java] view plain copy
  1. <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->  
  2. <dependency>  
  3.     <groupId>javax.servlet</groupId>  
  4.     <artifactId>jstl</artifactId>  
  5.     <version>1.2</version>  
  6. </dependency>  
  7.   
  8. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->  
  9. <dependency>  
  10.     <groupId>mysql</groupId>  
  11.     <artifactId>mysql-connector-java</artifactId>  
  12.     <version>5.1.39</version>  
  13. </dependency>  
2.下載jar包,然後倒入到WebContent/WEB-INF/lib目錄下(不要導錯地方)


msyql-connector-java-5.1.39.jar:連接數據庫使用的。

點擊打開鏈接

jstl-1.2.jar:用於在jsp頁面進行數據庫的數據迭代輸出。

點擊打開鏈接

關於什麼是jstl,還有它的用法,博主推薦一下這篇博文:

點擊打開鏈接




Model(模型)

(創建兩個包,一個model包用於建立連接數據庫和獲取數據,一個modelUser包用於建立存放數據的對象User)


MysqlConnection.java:

[java] view plain copy
  1. package com.ricky.model;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.sql.Connection;  
  6. import java.sql.DriverManager;  
  7. import java.sql.SQLException;  
  8. import java.util.Properties;  
  9.   
  10. public class MysqlConnection {  
  11.     /** 
  12.      * 連接MySQL數據庫,返回一個連接 
  13.      * @return 
  14.      */  
  15.     public static Connection getConnectiion() {  
  16.         Connection conn=null;  
  17.         Properties p=new Properties();  
  18.         try {  
  19.             p.load(new FileInputStream("E:/碼神/mvc/src/jdbc.properties"));  
  20.             Class.forName("com.mysql.jdbc.Driver");  
  21.             conn=DriverManager.getConnection(p.getProperty("ip"), p.getProperty("username"), p.getProperty("password"));  
  22.             System.out.println(p.getProperty("ip"));  
  23.         } catch (IOException e) {  
  24.             e.printStackTrace();  
  25.         } catch (ClassNotFoundException e) {  
  26.             e.printStackTrace();  
  27.         } catch (SQLException e) {  
  28.             e.printStackTrace();  
  29.         }  
  30.         return conn;  
  31.     }  
  32. }  

GetUser.java:

[java] view plain copy
  1. package com.ricky.model;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.ResultSet;  
  5. import java.sql.SQLException;  
  6. import java.sql.Statement;  
  7. import java.util.ArrayList;  
  8. import java.util.List;  
  9.   
  10. import com.ricky.modelUser.User;  
  11.   
  12. public class GetUser {  
  13.     /** 
  14.      * 用於從數據庫獲取信息,然後把信息存放在一個一個User對象中 
  15.      * @return 返回一個裝User對象的鏈表 
  16.      */  
  17.     public static List<User> getUserList() {  
  18.         List<User> userList=new ArrayList<User>();  
  19.         Connection conn=MysqlConnection.getConnectiion();  
  20.         Statement stat=null;  
  21.         ResultSet rs=null;  
  22.         try {  
  23.             stat=conn.createStatement();  
  24.             rs=stat.executeQuery("select * from user");  
  25.             while(rs.next()){  
  26.                 String id=rs.getString("id");  
  27.                 String username=rs.getString("username");  
  28.                 String password=rs.getString("password");  
  29.                 System.out.println(id+" "+username+" "+password);  
  30.                 User user=new User(id,username,password);  
  31.                 userList.add(user);  
  32.             }  
  33.         } catch (SQLException e) {  
  34.             e.printStackTrace();  
  35.         }finally{  
  36.             try {  
  37.                 rs.close();  
  38.                 stat.close();  
  39.                 conn.close();  
  40.             } catch (SQLException e) {  
  41.                 e.printStackTrace();  
  42.             }  
  43.         }  
  44.         return userList;  
  45.     }  
  46. }  


User.java:

[java] view plain copy
  1. package com.ricky.modelUser;  
  2.   
  3. public class User {  
  4.     private String id;  
  5.     private String username;  
  6.     private String password;  
  7.     public String getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(String id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getUsername() {  
  14.         return username;  
  15.     }  
  16.     public void setUsername(String username) {  
  17.         this.username = username;  
  18.     }  
  19.     public String getPassword() {  
  20.         return password;  
  21.     }  
  22.     public void setPassword(String password) {  
  23.         this.password = password;  
  24.     }  
  25.     public User(String id,String username,String password){  
  26.         this.id=id;  
  27.         this.username=username;  
  28.         this.password=password;  
  29.     }  
  30. }  


View(視圖)

(創建一個簡單的jsp頁面來顯示數據)


這裏需要在jsp文件中引用jstl(上面有篇博文有詳細介紹用法):

[java] view plain copy
  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  


userList.jsp:

[java] view plain copy
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3.     <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  8. <title>Insert title here</title>  
  9. </head>  
  10. <body>  
  11.     <table>  
  12.         <tr>  
  13.             <th>序號</th>  
  14.             <th>id</th>  
  15.             <th>username</th>  
  16.             <th>password</th>  
  17.         </tr>  
  18.         <c:forEach items="${userList }" var="user" varStatus="st">  
  19.             <tr>  
  20.                 <td><c:out value="${st.index+1 }"></c:out></td>  
  21.                 <td><c:out value="${user.id }"></c:out></td>  
  22.                 <td><c:out value="${user.username }"></c:out></td>  
  23.                 <td><c:out value="${user.password }"></c:out></td>  
  24.             </tr>  
  25.         </c:forEach>  
  26.     </table>  
  27. </body>  
  28. </html>  

Controller(控制器)

(創建userServlet來接受數據庫的數據對象User,控制數據對象輸出到jsp頁面)

userServlet.java:

[java] view plain copy
  1. package com.ricky.controller;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.List;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.annotation.WebServlet;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import com.ricky.model.GetUser;  
  13. import com.ricky.modelUser.User;  
  14.   
  15. /** 
  16.  * Servlet implementation class userServlet 
  17.  */  
  18. @WebServlet("/userServlet")  
  19. public class userServlet extends HttpServlet {  
  20.     private static final long serialVersionUID = 1L;  
  21.          
  22.     /** 
  23.      * @see HttpServlet#HttpServlet() 
  24.      */  
  25.     public userServlet() {  
  26.         super();  
  27.     }  
  28.   
  29.     /** 
  30.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
  31.      */  
  32.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  33.         List<User> userList=GetUser.getUserList();  
  34.         //設置一個userList屬性傳到下面的jsp頁面  
  35.         request.setAttribute("userList", userList);  
  36.         request.getRequestDispatcher("/userList.jsp").forward(request, response);  
  37.     }  
  38.   
  39.     /** 
  40.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
  41.      */  
  42.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  43.         // TODO Auto-generated method stub  
  44.         doGet(request, response);  
  45.     }  
  46.   
  47. }<span style="color:#ff0000;">  
  48. </span>  


運行userServlet:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章