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+JSP、JavaBean模式程式各個模組之間層次清晰,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組織開發了一套用於操作JavaBean的API,這套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各部分功能:
M:model層,即模型層,用來維護資料以及提供資料訪問方法;
V:view層,即檢視層,通常由jsp充當,用於展示模型的部分資料或所有資料的視覺化檢視;
C:controller層,即控制層,用於對處理請求。
MVC模式職責分工:
Web容器處理請求:
MVC程式設計思路:
MVC的目的 :
Java反射
在編譯時不確定哪個類被載入,而在程式執行時才載入、探知、使用
反射常用的Java 型別
Class類—可獲取類和類的成員資訊
Field類—可訪問類的屬性
Method類—可呼叫類的方法
Constructor類—可呼叫類的構造方法
使用反射的基本步驟
匯入java.lang.reflect.*
獲得需要操作的類的Java.lang.Class物件
呼叫Class的方法獲取Field、Method等物件
使用反射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層:包含jsp和Servlet等與web相關的內容;
•業務層:也稱Service層,業務層中不包含JavaWeb的API,它只關心業務邏輯;
資料層:有時候也稱為是持久層,其功能主要是負責資料庫的訪問,簡單的說法就是實現對資料表的Select,Insert,Update,Delete的操作。
其中,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工具(在這裡就不提供啦,自行上網找)
下面開始分塊處理
註冊操作
註冊分析:
基本流程:
- register.jsp頁面將註冊資訊提交到RegisterServlet中。
- RegisterServlet中使用BeanUtils將資料封裝到User物件,呼叫UserService中的regist方法
- 在UserService中呼叫了UserDao中的addUser方法
- 在addUser方法中使用jdbc將資料insert到user表中。
- 關於註冊成功與失敗的處理
在開發中我們可以使用異常來處理無返回值問題.
在dao中通過丟擲一個UserException這個自定義異常來描述新增失敗問題。
在service層中我們捕獲UserException,還捕獲其它異常,對於其它異常我們進行異常轉型,將問題全部反饋到servlet中。
關於驗證碼問題:
- 在ImageCodeServlet中要將生成的驗證碼的資訊儲存到session中。
- 在RegisterServlet中要對驗證碼進行判斷
關於校驗問題
我們在開發中,一般是做雙層校驗,一個是在瀏覽器端使用js校驗,另一個是在伺服器端使用java校驗。
- 客戶端的js校驗
2.伺服器端校驗
- 在表單上新增 onsubmit=”return checkForm()”
- 在User類中建立一個validate方法,返回值是Map<String,String>
- 在RegisterServlet中呼叫了validate方法
- 如果校驗出現了問題,會跳轉到register.jsp頁面,在頁面上顯示錯誤資訊
關於登入時記住使用者名稱操作
- 當LoginServlet中完成登入操作(登入成功)
2.判斷是否勾選了記住使用者名稱,將使用者名稱持久化儲存到cookie中
3.在登入頁面上獲取cookie中的使用者名稱資訊
原始碼已上傳到github:https://github.com/LazyTraveller/register-login