1. 程式人生 > >javaweb:常用的web設計模式(Model1,Model2,javaweb三層架構和mvc)和三層結構案例展示

javaweb:常用的web設計模式(Model1,Model2,javaweb三層架構和mvc)和三層結構案例展示

Jsp模式介紹:

SUN公司推出JSP技術後,同時也推薦了兩種web應用程式的開發模式,一種是JSP+JavaBean模式,一種是Servlet+JSP+JavaBean模式。

JSP+JavaBean模式適合開發業務邏輯不太複雜的web應用程式,這種模式下,JavaBean用於封裝業務資料,JSP即負責處理使用者請求,又顯示資料。

Servlet+JSP+JavaBean(MVC)模式適合開發複雜的web應用,在這種模式下,servlet負責處理使用者請求,jsp負責資料顯示,javabean負責封裝資料。 Servlet+JSPJavaBean模式程式各個模組之間層次清晰,web

開發推薦採用此種模式。

Model1 設計模型(不常用):

JSP+JavaBean模式適合開發業務邏輯不太複雜的web應用程式,這種模式下,JavaBean用於封裝業務資料,JSP即負責處理使用者請求,又顯示資料

 

Model2 設計模型:

Model2分為三部分

Servlet  控制顯示哪個JSP頁面給使用者、呼叫哪個Javabean

JSP  響應使用者請求,把結果資料展現給使用者

JavaBean 對資料庫的資料的存取,複雜的業務功能和邏輯處理

JavaBean介紹:

使用javabean的主要目的是為了封裝資料。

https://blog.csdn.net/weixin_42442713/article/details/84199873(請移步到在這篇文章閱讀有更詳細分析)

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

在servlet中使用,將請求引數封裝到javaBean

populate(Object bean,Map) 引數1就是我們的javaBean,引數2是所有請求引數的Map集合,我們得到所有請求引數的map集合可以使用request.getParameterMap()方法。注意:這種方式也要求表單請求引數的名稱必須與javaBean的bean屬性一致。

BeanUtils工具介紹:

Apache組織開發了一套用於操作JavaBeanAPI,這套API考慮到了很多實際開發中的應用場景,因此在實際開發中很多程式設計師使用這套API操作JavaBean,以簡化程式程式碼的編寫.

BeanUtils工具使用步驟

 1.匯入jar

  commons-logging-1.1.1.jar

 commons-beanutils-1.8.3.jar 

2.使用

BeanUtils.populate(javaBean物件, request.getParameterMap());

Beanutils自定義型別轉換器步驟:

在開發中,有很多情況下,資料型別的轉換使用BeanUtils工具可能不完全夠用,這時我們就可以通過自定義型別轉換器來完成操作。

自定義型別轉換器步驟:

1.建立一個類,實現這個介面  org.apache.commons.beanutils.Converter

 這個介面就是BeanUtils中所有型別轉換器的根介面.

2.重寫方法  public Object convert(Class type, Object value)

在這個方法中完成型別轉換

 這個方法的返回值就是賦值給javaBean中對應的屬性.

type:要轉換的型別 

 value:表單傳遞過來的屬性值 

3.註冊型別轉換器

 ConvertUtils.register(javaBean物件,要轉換的型別.class);

 

MVC設計模式:

MVC全名是Model View Controller,是模型(model)-檢視(view)-控制器(controller)的縮寫,是一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個部件裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於對映傳統的輸入、處理和輸出功能在一個邏輯的圖形化使用者介面的結構中。MVC模式最早被Trygve Reenskaug提出,成為施樂帕羅奧多研究中心(Xerox PARC)的Smalltalk語言發明的一種軟體設計模式。MVC可對程式的後期維護和擴充套件提供了方便,並且使程式某些部分的重用提供了方便。而且MVC也使程式簡化,更加直觀。

javaweb中的mvc:

JSP Model2模式已經可以清晰的看到MVC完整的結構了,在JSP Model2中層次劃分的很清晰,如下所示:

JSP:檢視層,用來與使用者打交道,負責接收用來的資料,以及顯示資料給使用者;

Servlet:控制層,負責找到合適的模型物件來處理業務邏輯,轉發到合適的檢視;

JavaBean:模型層,完成具體的業務工作,例如:開啟、轉賬等

MVC各部分功能:

Mmodel層,即模型層,用來維護資料以及提供資料訪問方法;

Vview層,即檢視層,通常由jsp充當,用於展示模型的部分資料或所有資料的視覺化檢視;

Ccontroller層,即控制層,用於對處理請求。

MVC模式職責分工:

Web容器處理請求:

MVC程式設計思路: 

                 

MVC的目的 :

 

Java反射

在編譯時不確定哪個類被載入,而在程式執行時才載入、探知、使用

反射常用的Java 型別

Class可獲取類和類的成員資訊

Field可訪問類的屬性 

Method可呼叫類的方法

Constructor可呼叫類的構造方法

使用反射的基本步驟

匯入java.lang.reflect.*

獲得需要操作的類的Java.lang.Class物件

呼叫Class的方法獲取FieldMethod等物件

使用反射API進行操作 (設定屬性呼叫方法)

反射應用:

獲取Class物件

    //Class.forName()得到物件

  Class  clazz=Class.forName("java.lang.String");

                  Class  clazz=Class.forName("java.util.Date"); 

獲取物件的結構資訊

Field fields[ ] = clazz.getDeclaredFields();

Method methods[] = clazz.getDeclaredMethods();

Constructor constructors[ ] = clazz.getDeclaredConstructors();

javaweb三層架構介紹:

所謂的三層架構是由web層,業務層及資料層組成的,它們分別完成各自的工作,如下所示:

Web層:包含jspServlet等與web相關的內容;

業務層:也稱Service層,業務層中不包含JavaWebAPI,它只關心業務邏輯;

資料層:有時候也稱為是持久層,其功能主要是負責資料庫的訪問,簡單的說法就是實現對資料表的SelectInsertUpdateDelete的操作。

其中,web層是與web相關的內容,包括jsp和servlet,以及request、response、session、ServletContext等,這些物件只能出現在web層,不能出現在業務層;同樣,業務層只關心業務邏輯,例如登入,註冊功能,其中註冊就是向資料庫中插入一條資料,這樣在資料層就對應一個方法,因此業務層依賴於資料層,可以這樣理解:業務層的一個功能是由資料層的若干個對資料庫的操作組成的。而web層將使用者輸入的資料傳遞給業務層,業務層處理之後將結果返回給web層,由web層再展示給使用者。也就是說web層依賴於業務層。由於業務層和資料層沒有出現javaweb的API,因此業務層和資料層是可重用的,甚至可以應用在非web環境中。

javaweb三層架構介紹:

javaweb三層架構與mvc區別分析:

 三層架構是一個分層式的軟體體系架構設計,它可適用於任何一個專案。

MVC是一個設計模式,它是根據專案的具體需求來決定是否適用於該專案。

那麼架構跟設計模式有什麼區別呢?

我們從接手一個專案開始,首先,我們需要進行架構設計,一般我們採用的就是分層式的架構設計,即我們的三層架構。

然後,在確定了架構以後,我們再根據專案的具體需求去考慮是否需要應用一些設計模式,比如是否應用我們的MVC模式,抽象工廠模式等等。

註冊案例展示:

環境準備

配置maven依賴或者手動新增servlet和jstl的jar包,最好就全部新增進來,至於詳細的步驟在這裡就不展示啦,請自行百度谷歌。

1.新建web工程,檔案架構如下

2.在MySQL中建立儲存註冊資訊的資料庫,名稱隨意。注意:使用MySQL前需要新增驅動,驅動下載地址:連結:https://pan.baidu.com/s/1c2mTUm9dBzl6Jl4WxVVWKw 
提取碼:q56c 

CREATE DATABASE day14;
USE day14

CREATE TABLE USER(
	id INT PRIMARY KEY AUTO_INCREMENT,
	email VARCHAR(50),
	username VARCHAR(20),
	PASSWORD VARCHAR(20),
    sex VARCHAR(20),
	telephone VARCHAR(20),
	introduce VARCHAR(100)
)

3.在domain包中建立User類(javaBean    域模型),完成如下變數宣告,並生成set,get和toString方法.   注意:需要先把beanutils和logging的jar包新增到WEN-INF的lib目錄下。

public class User {
private String id;
private String email;
private String username;
private String password;
private String sex;
private String telephone;
private String introduce;
@Override
public String toString() {
	return "User [id=" + id + ", email=" + email + ", username=" + username
			+ ", password=" + password + ", sex=" + sex + ", telephone="
			+ telephone + ", introduce=" + introduce + "]";
}
public String getId() {
	return id;
}
public void setId(String i) {
	this.id = i;
}
public String getEmail() {
	return email;
}
public void setEmail(String email) {
	this.email = email;
}
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 String getSex() {
	return sex;
}
public void setSex(String sex) {
	this.sex = sex;
}
public String getTelephone() {
	return telephone;
}
public void setTelephone(String telephone) {
	this.telephone = telephone;
}
public String getIntroduce() {
	return introduce;
}
public void setIntroduce(String introduce) {
	this.introduce = introduce;
}
}

4.在src的根目錄下建立jdbc.properties檔案,並對jdbc.properties檔案進行如下配置,注意URL的名字要改成你建立的資料庫名稱

5.在WEB-INF的lib中匯入相關的jar包,如mysql驅動和beanutils工具(在這裡就不提供啦,自行上網找)

 

下面開始分塊處理

註冊操作

註冊分析:

基本流程:

  1. register.jsp頁面將註冊資訊提交到RegisterServlet中。
  2. RegisterServlet中使用BeanUtils將資料封裝到User物件,呼叫UserService中的regist方法
  3. 在UserService中呼叫了UserDao中的addUser方法
  4. 在addUser方法中使用jdbc將資料insert到user表中。

 

  1. 關於註冊成功與失敗的處理

在開發中我們可以使用異常來處理無返回值問題.

在dao中通過丟擲一個UserException這個自定義異常來描述新增失敗問題。

在service層中我們捕獲UserException,還捕獲其它異常,對於其它異常我們進行異常轉型,將問題全部反饋到servlet中。

                

關於驗證碼問題:

  1. 在ImageCodeServlet中要將生成的驗證碼的資訊儲存到session中。

                   

  1. 在RegisterServlet中要對驗證碼進行判斷
  2.             

關於校驗問題

我們在開發中,一般是做雙層校驗,一個是在瀏覽器端使用js校驗,另一個是在伺服器端使用java校驗。

  1. 客戶端的js校驗

          

     2.伺服器端校驗

    1. 在表單上新增  onsubmit=”return checkForm()”   
  1. 在User類中建立一個validate方法,返回值是Map<String,String>

                                 

                                

  1. 在RegisterServlet中呼叫了validate方法

 

  1. 如果校驗出現了問題,會跳轉到register.jsp頁面,在頁面上顯示錯誤資訊
  2.   

關於登入時記住使用者名稱操作

  1. 當LoginServlet中完成登入操作(登入成功)

      2.判斷是否勾選了記住使用者名稱,將使用者名稱持久化儲存到cookie中

                                 

3.在登入頁面上獲取cookie中的使用者名稱資訊

 

 原始碼已上傳到github:https://github.com/LazyTraveller/register-login