了解MVC模式
MVC 是一種使用MVC Model View Controller模型-視圖-控制器設計創建Web 應用程序的模式[1]
大一時的筆記:現在寫成博客,有些知識點看到想笑哈哈,給剛學的看看吧!
Model 模型 表示應用程序核心 比如數據庫記錄列表
View 視圖 顯示數據 數據庫記錄
Controller 控制器 處理輸入 寫入數據庫記錄
MVC 模式同時提供了對HTMLCSS 和JavaScript 的完全控制
Model 模型是應用程序中用於處理應用程序數據邏輯的部分通常模型對象負責在數據庫中存取數據
View 視圖是應用程序中處理數據顯示的部分 通常視圖是依據模型數據創建的
Controller 控制器是應用程序中處理用戶交互的部分 通常控制器負責從視圖讀取數據控制用戶輸入並向模型發送數據
MVC 分層有助於管理復雜的應用程序因為您可以在一個時間內專門關注一個方面例如您可以在不依賴業務邏輯的情況下專注於視圖設計同時也讓應用程序的測試更加容易
MVC 分層同時也簡化了分組開發不同的開發人員可同時開發視圖控制器邏輯和業務邏輯
視圖
視圖是用戶看到並與之交互的界面對老式的Web應用程序來說視圖就是由HTML元素組成的界面在新式的Web應用程序中HTML依舊在視圖中扮演着重要的角色但一些新的技術已層出不窮它們包括Adobe Flash和像XHTMLXML/XSL,WML等一些標識語言和Web services.
MVC好處是它能為應用程序處理很多不同的視圖在視圖中其實沒有真正的處理發生不管這些數據是聯機存儲的還是一個雇員列表作為視圖來講它只是作為一種輸出數據並允許用戶操縱的方式
模型
模型表示企業數據和業務規則在MVC的三個部件中模型擁有最多的處理任務例如它可能用像EJBs和ColdFusion Components這樣的構件對象來處理數據庫被模型返回的數據是中立的就是說模型與數據格式無關這樣一個模型能為多個視圖提供數據由於應用於模型的代碼只需寫一次就可以被多個視圖重用所以減少了代碼的重復性
控制器
控制器接受用戶的輸入並調用模型和視圖去完成用戶的需求所以當單擊Web頁面中的超鏈接和發送HTML表單時控制器本身不輸出任何東西和做任何處理它只是接收請求並決定調用哪個模型構件去處理請求然后再確定用哪個視圖來顯示返回的數據
簡單總結MVC的概念:
V:處理簡單的jsp頁面(視圖)
M:后台的一些Model,處理客戶端發送的請求
C:各種各樣的action,由C來控制V和M之間的通訊,然后把Model和View的耦合度解開來!(“誰來控制我到哪個視圖去”)
百度舉例子:
通常一般寫jsp程序都是jsp請求 servlet 然后servlet返回數據給jsp,對吧?這樣的話 servlet中要查詢數據庫和處理業務邏輯了...
但是呢,這樣的話servlet就會亂七八糟的什么代碼都有了,對吧?
這個時候,我又想起來MVC模式了 ...jsp 就是天生的展示數據和輸入數據用的 ...可以看做MVC的 V。。。。。。。。。。。
servlet呢,這個時候我把在servlet中連接數據庫的代碼獨立出來放到一個java類里面去,servlet只要要調用這個類就直接拿到結果顯示給jsp。這樣,servlet就變成MVC的 C了,而那個處理數據庫的java類就變成MVC的 M了。。。。。。
控制反轉與依賴注入
關於控制反轉和依賴注入的文章和書籍很多,對其定義也解釋的也仁者見仁,這里就不贅述了,這是本人(只代表個人觀點)理解之后用通俗的例子和平淡的話詞為您解釋,希望對您有所幫助:
控制反轉(IoC/Inverse Of Control): 調用者不再創建被調用者的實例,由spring框架實現(容器創建)所以稱為控制反轉。
依賴注入(DI/Dependence injection) : 容器創建好實例后再注入調用者稱為依賴注入。
當某個角色(可能是一個Java實例,調用者)需要另一個角色(另一個Java實例,被調用者)的協助時,在傳統的程序設計過程中,通常由調用者來創建被調用者的實例,。如果創建被調用者實例的工作不再由調用者來完成,而是由外部容器完成,因此稱為控制反轉; 創建被調用者 實例的工作通常由外部容器來完成,然后注入調用者,因此也稱為依賴注入。下面一個小實例:
定義一個接口
public interface Person { void sayHello(); }
第一個實現類:
public class Chinese implements Person { public void sayHello() { System.out.println("您好 !"); } }
第二個實現類:
public class American implements Person { public void sayHello() { System.out.println("How do you do ."); } }
注意這個類與傳統設計有什么區別:該類調用Person子類的方法,傳統設計在本類中創造實例,而在此類里並沒有創造實例
public class User {
Person p;
public Person getP() {
return p;
}
//使用setter注入
public void setP(Person p) {
this.p = p;
}
//調用person子類重寫的sayHello方法,這里的p並沒有實例化
public void function(){
p.sayHello();
}
}
外部‘容器’
public class Container{
public static User getBean(){
Person p=new Chinese();
User user = new User();
//由容器‘注入’實例
user.setP(p);
return user;
}
}
測試類:
public class Test{
public static void main(String[] args){
User user = Container.getBean();
user.function();
}
}
//后台輸出‘您好’
通過這個例子應該看懂了控制反轉,和依賴注入了吧,這個是不是與傳統設計相‘反了’。
相關知識
依賴和耦合(Dependency and Coupling)
如果模塊A調用模塊B提供的方法,或訪問模塊B中的某些數據成員(當然,在面向對象開發中一般不提倡這樣做),我們就認為模塊A依賴於模塊B,模塊A和模塊B之間發生了耦合。那么,依賴對於我們來說究竟是好事還是壞事呢?由於人類的理解力有限,大多數人難以理解和把握過於復雜的系統。把軟件系統划分成多個模塊,可以有效控制模塊的復雜度,使每個模塊都易於理解和維護。但在這種情況下,模塊之間就必須以某種方式交換信息,也就是必然要發生某種耦合關系。如果某個模塊和其它模塊沒有任何關聯(哪怕只是潛在的或隱含的依賴關系),我們就幾乎可以斷定,該模塊不屬於此軟件系統,應該從系統中剔除。如果所有模塊之間都沒有任何耦合關系,其結果必然是:整個軟件不過是多個互不相干的系統的簡單堆積,對每個系統而言,所有功能還是要在一個模塊中實現,這等於沒有做任何模塊的分解。
因此,模塊之間必定會有這樣或那樣的依賴關系,永遠不要幻想消除所有依賴。但是,過強的耦合關系(如一個模塊的變化會造成一個或多個其他模塊也同時發生變化的依賴關系)會對軟件系統的質量造成很大的危害。特別是當需求發生變化時,代碼的維護成本將非常高。所以,我們必須想盡辦法來控制和消解不必要的耦合,特別是那種會導致其它模塊發生不可控變化的依賴關系。依賴倒置、控制反轉、依賴注入等原則就是人們在和依賴關系進行艱苦卓絕的斗爭過程中不斷產生和發展起來的。
Struts2標簽知識:
Include標簽:包含的意思。
默認Action(default_Action): <default-action-ref name="index"></default-action-ref>
默認action的作用:項目后面鏈接輸入不正確會鏈接到指定的默認action里面。
Action的轉發
全局標簽<global-results></global-results>
全局標簽的作用:把共同或者相同部分抽取出來共享,減少配置的繁雜。(圖片實例為抽取出共同的返回結果頁面)
extends標簽
extends標簽的作用:繼承公共的特性,減少配置的繁雜。(例如:權限模塊、收銀模塊、管理員模塊都需要一個404頁面,用extends繼承指定的package(包名)減少配置。)
動態的結果(result)
redirect 重定向
redirect:action處理完后重定向到一個視圖資源(如:jsp頁面),請求參數全部丟失,action處理結果也全部丟失。可以通過返回結果后面帶參數,如下:
<a href=“”></a>超鏈接帶參傳值
如下:
Jsp頁面:

Java代碼:

Struts.xml配置:

Struts2動態方法的訪問
(下面給出的3個例子注意不同之處和區別在哪)
該屬性設置Struts2 是否支持動態方法調用,該屬性的默認值是true。如果需要關閉動態方法調用,則可設置該屬性為false。以下設置參數值可以在struts2-core.jar中org.apache.struts下的default.properties文件中查到
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
例子1:<a href="login!add"></a>
Jsp頁面:

Java代碼:

Struts.xml配置

例子2:<a href="loginadd"></a>
Jsp頁面:
Java代碼:

struts.xml配置:

例子3:<a href="Login_add"></a>
(此種鏈接要注意大小寫)
Jsp頁面:

Java代碼:

struts.xml配置:

DomainModel(域模型)
使用DomainModel(域模型)接收參數
a.定義:定義Model類,在Action中定義Model類的對象(不需要new),創建該對象的get和set方法;
b.接收:通過對象的屬性接收參數,如:user.getUserName();
c.發送:使用對象的屬性傳遞參數,如:user2!add?user.userName=MGC;
例子:
Jsp頁面:
發送:使用對象的屬性傳遞參數,如:user2!add?user.userName=MGC;

Java代碼:

接收:通過對象的屬性接收參數,如:user.getUserName();不需要new)

struts.xm配置

例圖:

DomainModel作用:
這種方法是我們開發項目時最為常用的,對於一個屬性相對比較對的時候,如果把屬性都寫到Action中,那會把Acton類弄的很亂,所以屬性較多的時候最好選擇第二種方式來接收用戶輸入參數。
ModelDriven(模型驅動)
ModelDriven定義:
在頁面中,這個模型對象中的屬性可以直接通過屬性名來訪問(如username),而不需要使用形如“user.username”這種格式的表達式。
ModelDriven作用:
這種方法是我們開發項目時最為常用的,對於一個屬性相對比較對的時候,如果把屬性都寫到Action中,那會把Acton類弄的很亂,所以屬性較多的時候最好選擇此方式來接收用戶輸入參數。
ModelDriven注意要點:
在action中也不需要為這個模型對象提供JavaBean風格的getter和setter方法。但是必須要在action中進行new操作和實現getModel方法並返回給泛型對象,ModelDriven要使用泛型哦!
例子:
Jsp頁面:

Java代碼:


struts.xml配置

例圖:

Struts2與數據庫連接交互
類:
User.java ------封裝User的信息(如:private、setXxx、getXxx)。
UserDAO.java-----User管理類,含有調用連接數據庫進行增刪改查等功能操作類。
DBConn.java-----連接數據庫的類。
UserLoginAction.java-----封裝獲取頁面請求信息的Action類。
整個請求到返回的流程:
首先UserLoginAction類獲取客戶端用戶發過來的請求信息(name,password。在本類對與客戶端交互的某些信息進行封裝、setXxx和geXtxx方法),接着UserLoginAction類會調用UserDAO類的checkUser(name,password)方法進行數據庫的查找(checkUser方法里會調用DBConn類的getConn()方法進行數據庫的加載和連接操作,倘若連接成功,UserDAO.preparedStatement..executeQuery()方法進行語句查找)。把找到匹配的信息賦值給new User(而User里可以通過User.setName(rs.getString(“name”))方法把拿到的信息放到setName方法里。),最后,checkUser方法返回一個User,UserLoginAction類里的execute()方法定義一個User來獲取checkUser(name,password)方法返回的User。
