1. 程式人生 > >淺談什麼是MVC設計模式

淺談什麼是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頁面上。 這是資料庫的資料:
我們需要建立一個動態網頁專案(Dynamic Web project ),然後倒入兩個jar包進去這個專案中。

   倒入專案的2種方法:

   1.設定成maven工程,在pom.xml檔案中倒入jar包的<dependency></dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</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:

package com.ricky.model;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class MysqlConnection {
	/**
	 * 連線MySQL資料庫,返回一個連線
	 * @return
	 */
	public static Connection getConnectiion() {
		Connection conn=null;
		Properties p=new Properties();
		try {
			p.load(new FileInputStream("E:/碼神/mvc/src/jdbc.properties"));
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection(p.getProperty("ip"), p.getProperty("username"), p.getProperty("password"));
			System.out.println(p.getProperty("ip"));
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
}

GetUser.java:

package com.ricky.model;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.ricky.modelUser.User;

public class GetUser {
	/**
	 * 用於從資料庫獲取資訊,然後把資訊存放在一個一個User物件中
	 * @return 返回一個裝User物件的連結串列
	 */
	public static List<User> getUserList() {
		List<User> userList=new ArrayList<User>();
		Connection conn=MysqlConnection.getConnectiion();
		Statement stat=null;
		ResultSet rs=null;
		try {
			stat=conn.createStatement();
			rs=stat.executeQuery("select * from user");
			while(rs.next()){
				String id=rs.getString("id");
				String username=rs.getString("username");
				String password=rs.getString("password");
				System.out.println(id+" "+username+" "+password);
				User user=new User(id,username,password);
				userList.add(user);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				rs.close();
				stat.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return userList;
	}
}


User.java:

package com.ricky.modelUser;

public class User {
	private String id;
	private String username;
	private String password;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	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;
	}
	public User(String id,String username,String password){
		this.id=id;
		this.username=username;
		this.password=password;
	}
}
View(檢視)

(建立一個簡單的jsp頁面來顯示資料)


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

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

userList.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table>
		<tr>
			<th>序號</th>
			<th>id</th>
			<th>username</th>
			<th>password</th>
		</tr>
		<c:forEach items="${userList }" var="user" varStatus="st">
			<tr>
				<td><c:out value="${st.index+1 }"></c:out></td>
				<td><c:out value="${user.id }"></c:out></td>
				<td><c:out value="${user.username }"></c:out></td>
				<td><c:out value="${user.password }"></c:out></td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

Controller(控制器)

(建立userServlet來接受資料庫的資料物件User,控制資料物件輸出到jsp頁面)

userServlet.java:

package com.ricky.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ricky.model.GetUser;
import com.ricky.modelUser.User;

/**
 * Servlet implementation class userServlet
 */
@WebServlet("/userServlet")
public class userServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public userServlet() {
        super();
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<User> userList=GetUser.getUserList();
		//設定一個userList屬性傳到下面的jsp頁面
		request.setAttribute("userList", userList);
		request.getRequestDispatcher("/userList.jsp").forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
執行userServlet: