主頁 > 後端開發 > MVC 三層架構案例詳細講解

MVC 三層架構案例詳細講解

2023-05-18 07:40:57 後端開發

MVC 三層架構案例詳細講解

在這里插入圖片描述

@

目錄
  • MVC 三層架構案例詳細講解
    • 每博一文案
    • 1. MVC 概述
    • 2. MVC設計思想
    • 3. 三層架構
    • 4. MVC 與 三層架構的關系:
    • 5. 案例舉例:用戶賬戶轉賬
      • 5.1 M(Model :資料/業務處理層)
      • 5.2 C (Controller : 控制層)
      • 5.3 V (View :視圖/展示)
    • 6. 總結:
    • 7. 最后:

每博一文案

多讀書,書中有,你對生活,困難所解不開的答案
比如:《殺死一只是更鳥》中提到的
對應我們:我們努力中考,高考,升本,考研,每天都在努力學習,但是某天突然想到萬一沒有考上的話,那現在的努力又有什么意義呢?
答案:在《殺死一只是更鳥》里有這樣一段話:
> 勇敢是,當你還未開始,你就知道自己會輸,可你依然要去做,而且無論如何都要把它堅持到底,你很少能贏,但有時也會,努力的這個程序本身就是有意義,能夠獲得理想的結果當然很好,但如果失敗了也沒關系,因為你的勇敢,從未辜負你的青春,而黎明的光亮,總有一刻,會照亮穿梭于黑暗之中的自己,況且,你還不一定會輸呢,

1. MVC 概述

MVC開始是存在于桌面程式中的,M是指業務模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實作代碼分離,從而使同一個程式可以使用不同的表現形式,比如一批統計資料可以分別用柱狀圖、餅圖來表示,C存在的目的則是確保M和V的同步,一旦M改變,V應該同步更新, [1-2]

模型-視圖-控制器(MVC)是[Xerox PARC](https://baike.baidu.com/item/Xerox PARC/10693263?fromModule=lemma_inlink)在二十世紀八十年代為編程語言Smalltalk-80發明的一種軟體設計模式,已被廣泛使用,后來被推薦為Oracle旗下Sun公司[Java EE](https://baike.baidu.com/item/Java EE/2180381?fromModule=lemma_inlink)平臺的設計模式,并且受到越來越多的使用ColdFusion和PHP的開發者的歡迎,模型-視圖-控制器模式是一個有用的工具箱,它有很多好處,但也有一些缺點,

2. MVC設計思想

MVC(Model View Controller)是軟體工程中的一種軟體架構模式,它把軟體系統分為模型視圖控制器三個基本部分,用一種業務邏輯、資料、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶互動的同時,不需要重新撰寫業務邏輯,

img

MVC 主要的核心就是:分層:希望專人干專事,各司其職,職能分工要明確,這樣可以讓代碼耦合度降低,擴展力增強,組件的可復用性增強

MVC 從字面意思我們就可以看到:是分為了三層的,M(Mode 模型),V(View 視圖),C(Controller 控制器)

img

M即model模型:是指模型表示業務規則,在MVC的三個部件中,模型擁有最多的處理任務,被模型回傳的資料是中立的,模型與資料格式無關,這樣一個模型能為多個視圖提供資料,由于應用于模型的代碼只需寫一次就可以被多個視圖重用,所以減少了代碼的重復性,

V即View視圖:是指用戶看到并與之互動的界面,比如由html元素組成的網頁界面,或者軟體的客戶端界面,MVC的好處之一在于它能為應用程式處理很多不同的視圖,在視圖中其實沒有真正的處理發生,它只是作為一種輸出資料并允許用戶操作的方式,

C即controller控制器:是指控制器接受用戶的輸入并呼叫模型和視圖去完成用戶的需求,控制器本身不輸出任何東西和做任何處理,它只是接收請求并決定呼叫哪個模型構件去處理請求,然后再確定用哪個視圖來顯示回傳的資料,

M(Model :資料/業務) V (View :視圖/展示) C (Controller : 控制層)

C(是核心,是控制器,是司令官)

M(處理業務/處理資料的一個秘書)

V(負責頁面展示的一個秘書)

MVC(一個司令官,調度兩個秘書,去做這件事),僅僅只做事務上的調度,而不做其他的操作

在這里插入圖片描述

JavaBean

優點:

  1. 耦合性低,方便維護,可以利于分工協作
  2. 重用性高

缺點:

  1. 使得專案架構變得復雜,對開發人員要求高

3. 三層架構

三層架構(3-tier architecture) 通常意義上的三層架構就是將整個業務應用劃分為:界面層[表示層](User Interface layer)、業務邏輯層(Business Logic Layer)、資料訪問層(Data access layer),

區分層次的目的即為了“高內聚低耦合” 的思想,在軟體體系架構設計中,分層式結構是最常見,也是最重要的一種結構,

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

三層架構每層之間的邏輯關系:

在這里插入圖片描述

三層架構的優點

  1. 開發人員可以只關注整個結構中的其中某一層;
  2. 可維護性高,可擴展性高
  3. 可以降低層與層之間的依賴;
  4. 有利于標準化;
  5. 利于各層邏輯的復用

三層架構的缺點:

  1. 降低了系統的性能,如果不采用分層式結構,很多業務可以直接造訪資料庫,以此獲取相應的資料,如今卻必須通過中間層來完成
  2. 有時會導致級聯的修改,這種修改尤其體現在自上而下的方向,如果在表示層中需要增加一個功能,為保證其設計符合分層式結構,可能需要在相應的業務邏輯層和資料訪問層中都增加相應的代碼
  3. 增加了開發成本

4. MVC 與 三層架構的關系:

MVC的也可以被說成是 MVC三層架構,說白了,它們其實都是一個東西,只是在一些細節上有稍微的不同,大致設計思想都是一樣的:“高內聚,低耦合”,

在這里插入圖片描述

其實,無論是MVC還是三層架構,都是一種規范,都是奔著"高內聚,低耦合"的思想來設計的,三層中的UI和Servlet來分別對應MVC中的View和Controller,業務邏輯層是來組合資料訪問層的原子性功能的,

5. 案例舉例:用戶賬戶轉賬

如下我們,實作一個用戶賬戶轉賬操作的一個案例:

準備作業:創建表,創建資料



CREATE DATABASE mvc;

USE mvc;

SHOW TABLES;

CREATE TABLE t_act (
   id BIGINT PRIMARY KEY AUTO_INCREMENT,
   actno VARCHAR(255) NOT NULL,
   balance DECIMAL(10,2) 
);



INSERT INTO t_act(actno,balance)
VALUES('act001',50000.00),('act002',0.00);

SELECT *
FROM t_act;

5.1 M(Model :資料/業務處理層)

javaBean :Account 封裝資料

賬戶物體類,封裝賬戶資訊的

  • 一般是一張表一個,
  • pojo 物件
  • 有的人也會把這種專門封裝資料的物件,稱為:"bean物件" (javabean物件,咖啡豆)
  • 有的人也會把這種專門封裝資料的物件,稱為領域模型物件,domain物件
  • 不同的程式員不同的習慣
package com.RainbowSea.bank.mvc;

import java.io.Serializable;
import java.util.Objects;


/**
 * 賬戶物體類,封裝賬戶資訊的
 * 一般是一張表一個,
 * pojo 物件
 * 有的人也會把這種專門封裝資料的物件,稱為:"bean物件" (javabean物件,咖啡豆)
 * 有的人也會把這種專門封裝資料的物件,稱為領域模型物件,domain物件
 * 不同的程式員不同的習慣,
 */
public class Account implements Serializable {  // 這種普通的簡單的物件被成為pojo物件
    // 注意我們這里定義的資料型別,使用參考資料型別
    // 因為我們資料庫中可能存在 null 值,而基本資料型別是不可以存盤 null值的

    private Long id = null;  // id
    private String actno;  // 賬號
    private Double balance; // 余額

    // 反序列化
    private static final long serialVersionUID = 1L;

    public Account() {
    }


    public Account(Long id, String actno, Double balance) {
        this.id = id;
        this.actno = actno;
        this.balance = balance;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getActno() {
        return actno;
    }

    public void setActno(String actno) {
        this.actno = actno;
    }

    public Double getBalance() {
        return balance;
    }

    public void setBalance(Double balance) {
        this.balance = balance;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Account)) return false;
        Account account = (Account) o;
        return Objects.equals(getId(), account.getId()) && Objects.equals(getActno(), account.getActno()) && Objects.equals(getBalance(), account.getBalance());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getId(), getActno(), getBalance());
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", actno='" + actno + '\'' +
                ", balance=" + balance +
                '}';
    }
}

DB連接資料庫的工具:

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mvc
user=root
password=MySQL
package com.RainbowSea.bank.utils;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

public class DBUtil {

    // resourceBundle 只能讀取到 properties 后綴的檔案,注意不要加檔案后綴名
    private static ResourceBundle resourceBundle = ResourceBundle.getBundle("resources/jdbc");
    private static String driver = resourceBundle.getString("driver");
    private static String url = resourceBundle.getString("url");
    private static String user = resourceBundle.getString("user");
    private static String password = resourceBundle.getString("password");


    // DBUtil 類加載注冊驅動
    static {
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
           e.printStackTrace();
        }

    }


    // 將構造器私有化,不讓創建物件,因為工具類中的方法都是靜態的,不需要創建物件
    // 為了防止創建物件,故將構造方法私有化
    private DBUtil() {

    }

    /**
     * 這里沒有使用資料庫連接池,直接創建連接物件
     */
    public static Connection getConnection()  {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return  connection;
    }


    /**
     * 資源的關閉
     * 最后使用的最先關閉,逐個關閉,防止存在沒有關閉的
     */
    public static void close(Connection connection , PreparedStatement preparedStatement, ResultSet resultSet) {

        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }


        if (preparedStatement!=null) {
            try {
                preparedStatement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }


        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

對應Account資料表的DAO操作工具類

AccountDao 是負責Account 資料的增上改查

什么是DAO ?

  • Data Access Object (資料訪問物件)
  • DAO實際上是一種設計模式,屬于 JavaEE的設計模式之一,不是 23種設計模式
  • DAO只負責資料庫表的CRUD ,沒有任何業務邏輯在里面
  • 沒有任何業務邏輯,只負責表中資料增上改查的物件,有一個特俗的稱謂:DAO物件

為什么叫做 AccountDao 呢?

  • 這是因為DAO是專門處理t_act 這張表的
  • 如果處理t_act 表的話,可以叫做:UserDao
  • 如果處理t-student表的話,可以叫做 StudentDao

主要定義如下:增刪改查方法()

int insert() ;
int deleteByActno();
int update() ;
Account selectByActno();
List<Account> selectAll();
package com.RainbowSea.bank.mvc;


import com.RainbowSea.bank.utils.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;

/**
 * AccountDao 是負責Account 資料的增上改查
 * <p>
 * 1. 什么是DAO ?
 * Data Access Object (資料訪問物件)
 * 2. DAO實際上是一種設計模式,屬于 JavaEE的設計模式之一,不是 23種設計模式
 * 3.DAO只負責資料庫表的CRUD ,沒有任何業務邏輯在里面
 * 4.沒有任何業務邏輯,只負責表中資料增上改查的物件,有一個特俗的稱謂:DAO物件
 * 5. 為什么叫做 AccountDao 呢?
 * 這是因為DAO是專門處理t_act 這張表的
 * 如果處理t_act 表的話,可以叫做:UserDao
 * 如果處理t-student表的話,可以叫做 StudentDao
 * <p>
 * int insert() ;
 * int deleteByActno();
 * int update() ;
 * Account selectByActno();
 * List<Account> selectAll();
 */
public class AccountDao {


    /**
     * 插入資料
     *
     * @param account
     * @return
     */
    public int insert(Account account) {
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = null;
        int count = 0;
        try {
            String sql = "insert into t_act(actno,balance) values(?,?)";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, account.getActno());
            preparedStatement.setDouble(2, account.getBalance());
            count = preparedStatement.executeUpdate();


        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DBUtil.close(connection, preparedStatement, null);
        }


        return count;

    }


    /**
     * 通過Id洗掉資料
     *
     * @param id
     * @return
     */
    public int deleteById(String id) {
        Connection connection = DBUtil.getConnection();
        int count = 0;
        PreparedStatement preparedStatement = null;
        try {
            String sql = "delete from t_act where id = ?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, id);
            count = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DBUtil.close(connection, preparedStatement, null);
        }

        return count;

    }


    /**
     * 更新資料
     *
     * @param account
     * @return
     */
    public int update(Account account) {
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = null;
        int count = 0;

        try {
            String sql = "update t_act set balance = ?, actno = ? where id = ?";
            preparedStatement = connection.prepareStatement(sql);

            //注意設定的 set型別要保持一致,
            preparedStatement.setDouble(1, account.getBalance());
            preparedStatement.setString(2, account.getActno());
            preparedStatement.setLong(3, account.getId());

            count = preparedStatement.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DBUtil.close(connection, preparedStatement, null);
        }

        return count;
    }


    /**
     * 通過 actno 查找賬戶資訊
     *
     * @param actno
     * @return
     */
    public Account selectByActno(String actno) {
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Account account = new Account();

        try {
            String sql = "select id,actno,balance from t_act where actno = ?";
            preparedStatement = connection.prepareStatement(sql);

            //注意設定的 set型別要保持一致,
            preparedStatement.setString(1, actno);

           resultSet = preparedStatement.executeQuery();

            if (resultSet.next()) {
                Long id = resultSet.getLong("id");
                Double balance = resultSet.getDouble("balance");
                // 將結果集封裝到java 物件中
                account.setActno(actno);
                account.setId(id);
                account.setBalance(balance);

            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DBUtil.close(connection, preparedStatement, resultSet);
        }

        return account;
    }


    /**
     * 查詢所有的賬戶資訊
     *
     * @return
     */
    public List<Account> selectAll() {
        Connection connection = DBUtil.getConnection();
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        List<Account> list = null;

        try {
            String sql = "select id,actno,balance from t_act";
            preparedStatement = connection.prepareStatement(sql);

            resultSet = preparedStatement.executeQuery();

            while (resultSet.next()) {
                String actno = resultSet.getString("actno");
                Long id = resultSet.getLong("id");
                Double balance = resultSet.getDouble("balance");
                // 將結果集封裝到java 物件中
                Account account = new Account(id,actno,balance);

                // 添加到List集合當中
                list.add(account);

            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            DBUtil.close(connection, preparedStatement, resultSet);
        }

        return list;
    }


}

對指定的資料表的資料進行service 業務邏輯處理操作:

service 翻譯為:業務,

  • AccountService 專門處理Account業務的一個類
  • 在該類中應該撰寫純業務代碼,(只專注域業務處理,不寫別的,不和其他代碼混合在一塊)
  • 只希望專注業務,能夠將業務完美實作,少量bug.
  • 業務類一般起名:XXXService,XXXBiz...
package com.RainbowSea.bank.mvc;


/**
 * service 翻譯為:業務,
 * AccountService 專門處理Account業務的一個類
 * 在該類中應該撰寫純業務代碼,(只專注域業務處理,不寫別的,不和其他代碼混合在一塊)
 * 只希望專注業務,能夠將業務完美實作,少量bug.
 * <p>
 * 業務類一般起名:XXXService,XXXBiz...
 */
public class AccountService {

    // 這里的方法起名,一定要體現出,你要處理的是什么業務:
    // 我們要提供一個能夠實作轉賬的業務的方法(一個業務對應一個方法)
    // 比如:UserService StudentService OrderService

    // 處理Account 轉賬業務的增刪改查的Dao
    private AccountDao accountDao = new AccountDao();

    /**
     * 完成轉賬的業務邏輯
     *
     * @param fromActno 轉出賬號
     * @param toActno   轉入賬號
     * @param money     轉賬金額
     */
    public void transfer(String fromActno, String toActno, double money) throws MoneyNotEnoughException, AppException {
        // 查詢余額是否充足
        Account fromAct = accountDao.selectByActno(fromActno);
        if (fromAct.getBalance() < money) {
            throw new MoneyNotEnoughException("對不起,余額不足");
        }

        // 程式到這里說明余額充足
        Account toAct = accountDao.selectByActno(toActno);

        // 修改金額,先從記憶體上修改,再從硬碟上修改
        fromAct.setBalance(fromAct.getBalance() - money);
        toAct.setBalance(toAct.getBalance() + money);


        // 從硬碟資料庫上修改
        int count = accountDao.update(fromAct);
        count += accountDao.update(toAct);

        if(count != 2) {
            throw new AppException("賬戶轉賬例外,請聯系管理員");
        }

    }
}

例外處理類:

package com.RainbowSea.bank.mvc;


/**
 * 余額不足例外
 */
public class AppException extends Exception{

        public AppException() {

        }

        public AppException(String msg) {
            super(msg);
        }

}

package com.RainbowSea.bank.mvc;


/**
 * 余額不足例外
 */
public class MoneyNotEnoughException extends Exception{
    public MoneyNotEnoughException() {

    }

    public MoneyNotEnoughException(String msg) {
        super(msg);
    }
}

5.2 C (Controller : 控制層)

僅僅負責調度 M業務處理層,V視圖顯示層,而不做其他操作,

package com.RainbowSea.bank.mvc;

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

import java.io.IOException;


/**
 * 賬戶小程式
 * AccountServlet 是一個司令官,他負責調度其他組件來完成任務,
 *
 */
@WebServlet("/transfer")
public class AccountServlet extends HttpServlet { // AccountServlet 作為一個 Controller 司令官

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException {

        // 獲取資料
        String fromActno = request.getParameter("fromActno");
        String toActno = request.getParameter("toActno");
        double money = Double.parseDouble(request.getParameter("money"));

        // 呼叫業務方法處理業務(調度Model處理業務,其中是對應資料表的 CRUD操作)
        AccountService accountService = new AccountService();
        try {
            accountService.transfer(fromActno,toActno,money);
            // 執行到這里說明,成功了,
            // 展示處理結束(調度 View 做頁面展示)

            response.sendRedirect(request.getContextPath()+"/success.jsp");
        } catch (MoneyNotEnoughException e) {
            // 執行到種類,說明失敗了,(余額不足
            // 展示處理結束(調度 View 做頁面展示)
            response.sendRedirect(request.getContextPath()+"/error.jsp");

        } catch (AppException e) {
            // 執行到種類,說明失敗了,轉賬例外
            // 展示處理結束(調度 View 做頁面展示)
            response.sendRedirect(request.getContextPath()+"/error.jsp");

        }

        // 頁面的展示 (調度View做頁面展示)


    }
}

5.3 V (View :視圖/展示)

index.jsp 轉賬頁面:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>銀行賬號轉賬</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/transfer" method="post">
  轉出賬戶: <input type="text" name="fromActno" /> <br>
  轉入賬戶: <input type="text" name="toActno" /> <br>
  轉賬金額: <input type="text" name="money" /><br>
  <input type="submit" value="https://www.cnblogs.com/TheMagicalRainbowSea/archive/2023/05/17/轉賬" />
</form>
</body>
</html>

success轉賬成功的頁面顯示:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>轉賬成功</title>
</head>
<body>

<h3>轉賬成功</h3>
</body>
</html>

error 轉賬失敗的頁面顯示:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>轉賬失敗</title>
</head>
<body>
<h3>轉賬失敗</h3>
</body>
</html>

在這里插入圖片描述

雖然上述:代碼成功實作的了用戶轉賬的操作,但是并沒有進行事務的處理,

如下是運用 TreadLocal 進行事務的處理:?????? https://blog.csdn.net/weixin_61635597/article/details/130728394?csdn_share_tail

6. 總結:

  1. MVC 從字面意思我們就可以看到:是分為了三層的,M(Mode 模型),V(View 視圖),C(Controller 控制器)

  2. M(Model :資料/業務) V (View :視圖/展示) C (Controller : 控制層)

    C(是核心,是控制器,是司令官)

    M(處理業務/處理資料的一個秘書)

    V(負責頁面展示的一個秘書)

    MVC(一個司令官,調度兩個秘書,去做這件事),僅僅只做事務上的調度,而不做其他的操作

  3. 三層架構(3-tier architecture) 通常意義上的三層架構就是將整個業務應用劃分為:界面層[表示層](User Interface layer)、業務邏輯層(Business Logic Layer)、資料訪問層(Data access layer),

  4. 無論是MVC還是三層架構,都是一種規范,都是奔著"高內聚,低耦合"的思想

7. 最后:

??????????????? 感謝如下博主的分享: ??????????????

【1】https://blog.csdn.net/weixin_43232955/article/details/104963392?ops_request_misc

【2】https://blog.csdn.net/weixin_42694511/article/details/120690083?ops_request_misc

限于自身水平,其中存在的錯誤,希望大家,給予指教,韓信點兵——多多益善,謝謝大家,江湖再見,后會有期!!!

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552671.html

標籤:其他

上一篇:Python從零到壹丨帶你了解影像直方圖理論知識和繪制實作

下一篇:返回列表

標籤雲
其他(159175) Python(38148) JavaScript(25431) Java(18055) C(15228) 區塊鏈(8267) C#(7972) AI(7469) 爪哇(7425) MySQL(7191) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4572) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1975) 功能(1967) Web開發(1951) HtmlCss(1938) python-3.x(1918) C++(1917) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • MVC 三層架構案例詳細講解

    MVC 三層架構案例詳細講解 @ 每博一文案 多讀書,書中有,你對生活,困難所解不開的答案 比如:《殺死一只是更鳥》中提到的 對應我們:我們努力中考,高考,升本,考研,每天都在努力學習,但是某天突然想到萬一沒有考上的話,那現在的努力又有什么意義呢? 答案:在《殺死一只是更鳥》里有這樣一段話: > 勇 ......

    uj5u.com 2023-05-18 07:40:57 more
  • Python從零到壹丨帶你了解影像直方圖理論知識和繪制實作

    摘要:本文將從OpenCV和Matplotlib兩個方面介紹如何繪制直方圖,這將為影像處理像素對比提供有效支撐。 本文分享自華為云社區《[Python從零到壹] 五十.影像增強及運算篇之影像直方圖理論知識和繪制實作》,作者:eastmount。 一.影像直方圖理論知識 灰度直方圖是灰度級的函式,描述 ......

    uj5u.com 2023-05-18 07:40:23 more
  • java設計模式【抽象工廠模式】

    java設計模式【抽象工廠模式】 抽象工廠模式 抽象工廠模式是對簡單工廠模式的一個變種,它允許通過一個統一的介面來創建不同的產品實體,而無需指定具體的子類。在這個模式中,我們只關心產品的抽象介面,而將具體的產品實作留給子類去實作。這樣,我們可以通過創建不同的工廠物件來創建不同的產品實體,而無需關心它 ......

    uj5u.com 2023-05-18 07:40:11 more
  • web應用模式、API介面、介面測驗工具postman、如何在瀏覽器中測

    一、web應用模式 Django框架就是一種web框架,專門用來寫web專案,之前學的,寫的BBS專案,圖書管理系統,用的都是前后端混合開發 -后端人員,寫后端,也要寫【模板語法】 》xx.html的python代碼 -全堆疊開發-->前后端混合時代,比較多 從今天開始,學的是前后端分離 -后端人員, ......

    uj5u.com 2023-05-18 07:39:52 more
  • Django authenticate() 函式查找不到與提交的用戶名和密碼匹配的

    在你的user APP下面添加一個utils.py檔案 class UsernameMobileBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): """ 重寫 ......

    uj5u.com 2023-05-18 07:39:40 more
  • 檔案館庫房環境溫濕度一體化建設平臺之10款八防硬體設備詳細介紹

    檔案八防十防常用的十款設備 序號 名稱 1 溫濕度傳感器 2 空氣質量云測儀 3 恒濕凈化一體機 4 健康防護一體機 5 綜合智能觸摸一體化區域控制器 6 空調紅外學習控制模塊 7 漏水檢測控制器及感應線 8 數字煙霧傳感器 9 紅外防盜傳感器 10 系統軟體平臺 附件 檔案十防要求 1.溫濕度傳感 ......

    uj5u.com 2023-05-18 07:39:20 more
  • < Python全景系列-3 > Python控制流程盤點及高級用法、神秘技巧

    全面深入地介紹 Python 的控制流程,包括條件陳述句、回圈結構和例外處理等關鍵部分,尤其會將串列決議、生成器、裝飾器等高級用法一網打盡。此外,我還將分享一些獨特的見解和研究發現,希望能給你帶來新的啟發。文章的結尾,我們將有一個 "One More Thing" 環節,我會分享一個很特別但又很少人知... ......

    uj5u.com 2023-05-18 07:38:49 more
  • 實驗一 Java編程環境使用

    ###第1關 String類的常用方法 package step1; public class StringExample { public static void main(String args[]) { /********* Begin *********/ String s1 = new S ......

    uj5u.com 2023-05-18 07:38:46 more
  • 多執行緒基礎知識點梳理

    基礎概念 行程(process):行程是計算機中的一個任務,比如打開瀏覽器、IntelliJ IDEA。 執行緒(thread):行程內部有多個子任務,叫執行緒。比如IDEA在敲代碼的同時還能自動保存、自動導包,都是子執行緒做的。 行程和執行緒的關系就是一個行程包含一個或多個執行緒。 執行緒是作業系統調度的最小 ......

    uj5u.com 2023-05-18 07:38:34 more
  • Java中synchronized的優化

    為了實作高效并發,虛擬機對 synchronized 做的一系列的鎖優化措施。包括:適應性自旋、鎖消除、鎖粗化、輕量級鎖、偏向鎖。 ......

    uj5u.com 2023-05-18 07:37:46 more