java中的mvc設計模式(個人心得)


今天分享的是javaweb中的MVC設計模式,如果你還沒開始學java,不要緊,只要通過本文的閱讀,按照我說的做,就可以創建一個自己的網站,同時還能帶你熟悉MVC這種設計模設計;

廢話不多說進入正題:

MVC :模型+視圖+控制器

很多領域都用到這種設計模式,不僅僅是在web端,而在javaweb中模型對應Bean,視圖對應service,控制器對應servlet;

我更願意把其理解為分層設計模式,從用戶開始請求的html/jsp主頁面開始,

請求會從主頁面發出===》》servlet進行分配任務==》》業務層service==》》數據層(dao)==》》Bean(模型穿插於各個層中,用來傳遞數據)

如果到這里你還處於迷糊狀態不要緊,建站離你只有讀完這篇文章的距離;

javaweb中有三大組件:servlet(控制器)、Filter(過濾器)、Listener(監聽器)

他們都需要在web.xml中進行配置,具體配置可以百度,很簡單;

servlet生命周期:(接口、實現類)

init(ServletConfig sconfig);當開啟服務器時,這個方法就會被服務器調用,可以理解為servlet出生了;用來給servlet初始化,基本不用;

service(ServletRequest req,ServletResponse res);每個請求都要經過這個方法的處理分配;后期演化出doGet()doPost()等,最后還是由      service來調用這些演化來的方法,萬變不離其中;(我會提供一個BaseServlet類來給學習者建站)

destroy();當服務器即將關閉時,這個方法會被服務器調用,用來做一些收尾工作,但是我們一般不會在這里寫代碼,所以基本不用;

Filter生命周期:(接口)

方法基本同servlet只是用doFilter(ServletRequest request,ServletResponse response,FilterChain chain);替換了service方法;

過濾器作用:可以過濾請求,當過濾器加到用戶請求的頁面或者servlet上時,請求就會先到過濾器,過濾器只有調用了FilterChain中的doFilter(request,response);請求才會到達所要請求的資源上,也就是說過濾器可以攔截請求;注意跟servlet一樣每次請求都會調用doFilter方法;當然過濾器不光能做攔截,還可以用來進行對全站的配置,比如全站編碼問題只要是全站設置就要想到用它因為servlet做不到;過濾器還可以做很多事,比如ip統計,頁面靜態化,粗粒度權限過濾等,其實都體現在對用戶發送來的數據、請求頭的特殊處理,或者是服務器響應給客戶端數據、響應頭的特殊處理,一旦需要這種操作,就可以考慮使用過濾器

Listener生命周期:(接口)

以ServletContextListener舉例:contextInitialized(ServletContextEvent event);contextDestroyed(ServletContextEvent event);

這兩個方法前一個用來給ServletContext域的創建監聽,后一個是用來給ServletContext銷毀時監聽;其它監聽器都是這個原理;

八大監聽器接口,六個是對Servlet中的三大域對象進行監聽已經與對象屬性的監聽,其中對ServletContext域進行監聽的最有用,因為ServletContext是由服務器創建的,可以用來給項目來做初始化,event.getServletContext()是一個很重要的方法;

剩下兩個負責監聽javaBean,但是他們都跟HttpSession相關,涉及到session的鈍化、活化、序列化這里不做深入研究,這兩個傾聽器我一直都不知道是干什么用的,知道的人告訴我下,所以我認為基本沒什么用;

記住:拿到需求,首先分析你負責的這部分功能需要使用哪些組件來完成,完成的步驟,流程圖;


 

基於MVC模型開始創建我們的項目我這里用注冊來做講解,比較簡單,其實多復雜的業務,也就那么回事,把注冊弄會了,其它都會了;

代碼我習慣從數據層開始寫,每寫完一個功能就進行測試,代碼注釋一定要有;

需求分析:

獲取用戶從表單傳遞來的數據,把數據進行bean封裝(我提供工具類不用擔心,一鍵封裝),將數據傳遞給業務層(用戶名+密碼),

業務層中處理登錄業務第一步:調用數據層方法從數據庫中查詢是否有這個用戶(findByUserName(String username))

業務層第二步:if()判斷用戶名是否已經存在,存在就給它拋個異常,帶上異常信息讓servlet處理;

不存在調用數據層方法(addUser(User user);)將以上邏輯封裝到regist(User user);注冊方法中,在servlet中調用此方法,並將信息頁面轉發給用戶。

數據層:數據層主要是JDBC技術(提供我自己的Jdbcutils),用其對數據庫進行增刪改查,我的工具類基本把能封裝的都封裝了,兩三行代碼就能完成增刪改查,如果是多條件查詢,可能需要拼接sql語句,字符串拼接應該難不住你吧。(服務器端驗證無非就是if判斷,把各種情況想到,就不會出錯)

依賴關系 數據層依賴Bean 業務層依賴數據層  servlet依賴業務層  請求依賴servlet(動態頁面)

(只要學會我的所有工具類使用,輕松建站,但是每個工具類后面都跟着各種技術、設計模式,要想完全弄明白,就需要你去研究se知識了,來個三萬行代碼入個門先吧,少年,以上就是所謂的碼農每天干的工作,增刪改查+業務,要想擺脫碼農成為大牛,不是會用框架就可以了,其實你會發現越用框架,離底層代碼就越遠,好處是帶來方便更面向對象,成為大牛第一步,把你用的框架從頭寫一遍,萬變不離其中的道理,全部寫一遍離成為架構師就進一步,如果你還有時間可以學習activiti,Redis,JVM原理優化,storm集群,如果你還有時間可以學習下node.js,分布式,大數據.......我只能打等等,我這個小菜鳥就知道這么多了,下次分享ssh框架使用經驗以及收獲)

 

package cn.wyx.dao;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import com.mchange.v2.c3p0.impl.NewPooledConnection;

import cn.wyx.TxQueryRunner.TxQueryRunner;
import cn.wyx.domain.Java_Book;

public class BookDao {
    private QueryRunner qr = new TxQueryRunner();
    public List<Java_Book> findAll(){
        String sql="select * from Book";
        List<Java_Book> books=null;
        try {
            books = qr.query(sql,new BeanListHandler<Java_Book>(Java_Book.class));
            return books;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    public List<Java_Book> findById(String id){
        String sql="select * from Book where id=?";
        try {
            List<Java_Book> books = qr.query(sql, new BeanListHandler<Java_Book>(Java_Book.class), id);
            return books;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

 

以上是數據層兩個方法演示使用,除了異常處理,就是兩三行代碼,當然這是因為我的業務比較簡單。你要是玩個分頁,就需要個大幾行了,不過也不難;

需要資源的給評價;另出售python全棧學習資料,想學python人工智能、java高級架構的朋友可以關注我博客,知識在於分享。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM