今天分享的是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高級架構的朋友可以關注我博客,知識在於分享。