Welcome to Yumao′s Blog.
序
1)為什麼需要Struts框架
企業需求,利用Struts框架可以簡化開發
2)如何學習Struts
先學習如何使用,有餘力再了解一些實現原理.
1.MVC設計思想在JavaWeb開發當中的使用
1)什麼是MVC?
是一種設計思想,非常優秀的設計思想.根據職責不同將應用程序的組件分成三部分.
Model模型:負責業務數據和業務處理.
View視圖:負責顯示和接收用戶輸入.
Controller控制器:協調模型和視圖
2)MVC在JavaWeb中的體現
Model:DAO,Entity,Util
View:JSP
Controller:Servlet
示例程序:ShoppingCart,控制器過於複雜,包含大量的if...else,
不適合大型複雜程序的開發.
採用XML+Servlet+Action結構改造控制實現
*3)MVC工作的基本流程
a.客戶端發請求,請求交給前端控制器處理
b.前端控制器維護一個XML配置文件
(XML定義了請求和Action之間的對應關係)
c.前端控制根據請求調用相應的Action組件,執行請求處理
d.Action處理完畢,可以將處理結果存放到Request
e.控制器調用相應的視圖JSP,進行響應處理
4)Struts框架封裝了上述主要流程和結構
2.Struts2入門示例 HelloWorld
1)Struts2發展史
Struts1.2 WebWork-->xwork(命令模式實現) Struts2
2)入門示例
a.引入框架開發包(5個核心包) 2.1.8版本
struts2-core-2.1.8.jar
xwork-core-2.1.6.jar
commons-fileupload-1.2.1.jar
freemarker-2.3.15.jar(模板視圖技術,等價於JSP功能)
ognl-2.7.3.jar(與EL相似,但是功能強大)
b.在web.xml中添加控制器配置
strutsfilter
org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter
strutsfilter
//*
c.創建Action
創建WelcomeAction類,添加默認execute方法
d.添加XML配置,在src下添加struts.xml文件
/welcome.jsp
執行流程如下:
welcome.action-->web.xml(filter控制器)-->struts.xml(Action配置)
-->WelcomeAction-->execute-->"success"-->struts.xml(result配置)
3)action配置
a.元素:作用是將Action分組管理,內部可以定義多個Action.
*name屬性:包名稱.
*extends屬性:繼承哪個package,一般情況下繼承自struts-default.
namespace屬性:用於限定action請求名,默認值是"/"
當namespace="/"時,當前package中的所有action對應的請求格式:
http://localhost:8080/struts2/action請求名.action
如果namespace="/day01"時,action對應的請求格式:
http://localhost:8080/struts2/day01/action請求名.action
b.元素:作用是定義請求和Action組件之間的對應關係
*name屬性:action組件對應的請求名
*class屬性:指定action組件的實現類,包名.類名格式
method屬性:指定要調用action類中哪個方法.默認值是execute
c.元素:作用是定義響應視圖
*name屬性:響應視圖標識符,該標識符與action組件方法返回值對應.
type屬性:指定響應視圖類型,默認值是dispatcher,請求轉發
1.練習問題
1)Action中利用DAO可以獲取出數據庫數據,但是JSP獲取不到.
原因:1.檢查Action屬性及getter方法
2.檢查struts.xml中元素的配置,不能使用type="redirect"
3.檢查execute中接收集合的變量是否為局部變量
2) 工程啟動出現錯誤
由於web.xml或struts.xml配置有誤.可以根據異常信息尋找.
2.補充問題
1)Action屬性及setter和getter方法的問題
Action屬性在接收和傳出數據時,setter和getter方法是關鍵.
a.接收時,表單組件name="user" ,action要有setUser方法才可以接收.
b.傳出數據時,JSP使用${user},action要有getUser方法對應才可以獲取.
public class Action{
private String name;//成員變量name
//有一個屬性,名字是user
public String getUser(){
return name;
}
public void setUser(String user){
name = user;
}
}
3.OGNL技術
Object Graphics Navigation Language(對象圖導航語言)
OGNL是一種表達式語言技術,封裝在ognl.jar開發包中.
可以很方便的對對象的屬性進行獲取和設置.
1)什麼是EL,有什麼用
屬於表達式語言,可以訪pageContext,request,session,application存儲範圍的數據.可以簡化JSP程序.
2)OGNL表達式,有什麼用
屬於表達式語言,需要ognl.jar提供支持.可以完成以下操作
a.可以訪問對象屬性(獲取和設置)
基本類型屬性:"id","name"
數組類型屬性:"love[0]","love[1]"
List類型屬性:"city[0]","city[1]"
Map類型屬性:"books.key","books['key']"
b.可以訪問對象的方法
"city.size()","name.toUpperCase()"
c.可以訪問靜態常量和方法
"@java.lang.Math@PI"
d.可以訪問集合中的數據,進行集合過濾等操作
"persons.{?#this.age>20}" : 返回persons集合中,滿足age>20的所有元素.
?指的是返回所有滿足條件的元素
^指的是返回第一滿足條件的元素
$指的是最後一個滿足條件的元素
e.支持Java中的運算符和表達式
""name"+name","id+10"
f.定義一個List和Map類型的常量
List常量:"{1,2,3}"
Map常量:"#{'age':20,'name':"tom"}"
3)OGNL標準結構
OGNL有3個重要組成部分,一個OGNL引擎,一個是root對象,另一個是context對象.
訪問context區域需要使用"#key"格式.
沒有"#",例如"name",意思是訪問root對象的name屬性
4.OGNL技術在Struts2中應用
1)OGNL在xwork中進行了改造
xwork將OGNL中的root對象進行了改造,將其改造成了一個棧結構,類型是CompountRoot繼承自ArrayList.在訪問root屬性時,從棧頂對象向下依次查找,找到屬性值返回.
2)ValueStack結構
ValueStack是Struts2中非常重要的數據對象,當客戶發送一個請求後,控制器會根據當前請求創建一個ValueStack,並將請求處理相關的數據進行填充.
root棧:存放當前請求對應的Action對象(棧頂)
context(Map):存放request,session,application,parameters等信息
3)JSP獲取業務數據,需要使用Struts標籤+OGNL表達式技術組合
1.課程回顧(理解)
1)ValueStack結構和數據存儲狀態
ValueStack包含3個組成
a. OGNL引擎:負責解析OGNL表達式
b. root對象:CompountRoot(棧結構)
存放了當前請求的Action對象(處於棧頂位置)
c. context對象:Map結構
存放了其他象.
request:Object
session:Object
application:Object
2) ValueStack原理
a.當客戶發送一個請求後,控制器會創建一個ValueStack對象
b.控制器創建請求對應的Action對象,並壓入到ValueStack的root棧中
c.將request,session等對象的引用,存入到ValueStack的context中
d.將ValueStack再存入到request對象中,struts.valueStack
e.客戶再發新請求,重複以上操作.
*2.重構列表顯示示例
3.EL表達式在Struts2中的使用(理解)
EL為什麼可以獲取Action對象的屬性?
可以訪問pageContext,request,action,session,application範圍數據
在原有的JavaWeb程序中,JSP如果使用${username},會調用如下方法查找.
HttpServletRequest接口
request.getAttribute("username")
session.getAttribute("username")
application.getAttribute("username")
在Struts2中,將request對象進行了封裝,類型為StrutsRequestWapper.
public class StrutsRequestWapper
extends HttpServletRequestWrapper{
//重寫了getAttribute
public Object getAttribute(String expression){
//首先去原始的request中查找
Object val = super.getAttribute(expression));
//如果找不到,去valuestack查找
if(val == null){
val = ValueStack.findValue(expression);
}
return val;
}
}
JSP使用 ${"username"} -->先去原有request中查找
找不到調用ValueStack.findValue("username");
觸發Ognl.getValue("username")//獲取root中棧頂action的username屬性
4. Struts2中Action組件的核心應用
1)Action組件原理
a.當客戶發生一個請求,控制器會創建一個Action對象
不必擔心線程並發,不安全問題.
b.Action對象創建後會放入ValueStack中,當root對象的棧頂
c.Action對象提供一個業務方法,默認是execute
d.Action對象在請求處理完畢後銷毀
2)Action如何使用request,session,application
a.利用工具類ActionContext,ServletActionContext
如何將HttpServletRequest,HttpSession等對象轉換成Map結構
public class SessionMap extends AbstractMap{
private HttpSession session;
public SessionMap(HttpSession session){
this.session = session;
}
public void put(Object key,Object value){
session.setAttribute(key.toString(),value);
}
public Object get(Object key){
return session.getAttribute(key.toString());
}
}
b.要Action實現以下Aware接口,利用接口約定的方法注入.(推薦)
原因:減少了Struts2框架API對Action類的侵入,提高Action的靈活性.
RequestAware
SessionAware
ApplicationAware
ServletRequestAware
ServletResponseAware
ServletContextAware
3)Action屬性注入技術
Action類中定義的屬性,可以通過配置注入數據.
3
4)在配置Action時,通配符*的使用
在元素的name屬性中可以使用*號,可以使用若干個.
可以在method,class,引用*號所代表的信息.引用方式{1},{2},{3}
5)動態方法調用
可以在發送請求時,指定要執行的Action的業務方法名.
請求格式: "請求名!方法名.action"
6)在配置中可以使用EL表達式獲取Action屬性值
/${viewName}.jsp
-------第一天---------
1.熟悉Struts2工作的主要流程
2.熟悉Struts2開發步驟
-------第二天---------
1.Struts標籤+OGNL表達式
a.了解OGNL作用及其語法
b.了解ValueStack結構和數據存儲
c., , , ,,
2.EL在Struts2環境中的使用
pageContext,request,action,session,application
-------第三天----------
1.Struts2中Action組件的核心應用
a.Action如何使用request,session,application對象
b.Action屬性注入技術
c.如何用一個Action處理多個請求
方法一:元素配置時,利用通配符*
方法二:利用動態方法調用
d.result元素配置,使用EL獲取Action屬性
/${viewName}.jsp
/a.jsp?id=${id}
---------第四天---------
1.綜合案例的實現
課後練習(必須完成)
2.Struts2中Result組件的使用
Result組件主要是負責生成響應視圖.響應結果有多種類型,比如jsp,stream,json,freemarker等.Struts2這對這些視圖,提供了相應Result組件.
1)了解Result規則
a.Result組件必須實現Result接口,實現execute()方法.
在execute方法中,實現生成響應視圖的邏輯.
b.Result配置聲明
c.如何使用result
注意:type引用的result類型,可以從當前package或父package中找到定義
2)常用類型的result
--JSP響應:
dispatcher:以請求轉發方式調用JSP響應
redirect:以請求重定向方式調用JSP響應
使用示例:
JSP的URL
JSP的URL
--Action響應:
redirectAction:以請求重定向方式調用一個Action
chain:以請求轉發方式調用一個Action.
如果下一個Action需要獲取前面請求的數據,需要使用chain;不需要則使用redirectAction
使用示例:
a.調用同一個package中的另一個Action
的name名
b.調用不同package,不同namespace下的Action
action元素的name名
package元素的namespace值
--stream響應:
stream:將Action某個InputStream屬性為客戶端輸出
使用示例:
action屬性
--json響應:
json:需要引入擴展包,可以將Action屬性以JSON格式輸出
struts2-json-plugin-2.1.8.jar,
ok
1.Struts2 UI標籤
*form
*textfield
password
hidden
textarea
*checkbox
checkboxlist
radio
*select--option
2.Intercetpor攔截器組件的使用
Struts框架提供很多的內置攔截器,開發者也可以自定義.
攔截器封裝的功能具有:通用性強,可以多次重複利用.
params:將請求攜帶的數據給Action屬性設置
fileUpload:調用commons-fileupload.jar組件將客戶端文件上傳到服務器
1)了解攔截器組件的規範
攔截器組件實現類必須實現Interceptor接口,實現interceptor方法
2)攔截器組件的聲明配置
3)攔截器組件的使用
a.為Action顯示引用
b.為Action設置默認引用,(如果沒有給action指定攔截器,調用默認)
如果元素繼承struts-default,默認調用defaultStack
注意:defaultStack是在元素沒有指定攔截器的情況下執行,
如果為元素指定了攔截器,defaultStack不再執行.
4)攔截器使用示例
a.自定義一個登錄檢查的攔截器
1.編寫LoginInterceptor攔截器組件
2.在聲明LoginInterceptor組件
3.在元素中使用
b.利用內置的fileUpload攔截器實現文件上傳
-----fileUpload攔截器實現的主要邏輯如下------
fileUpload首先調用commons-fileupload.jar組件,將文件上傳到服務器臨時目錄下.然後將臨時文件給Action的屬性賦值.
接着通過ActionInvocation.invoke()調用UploadAction的execute方法,Result組件方法
最後fileUpload將臨時文件清除.
1.引入commons-io.jar,添加upload.jsp頁面
2.編寫UploadAction,根據需要可以添加3個屬性.
File xxx;//獲取臨時文件對象
String xxxFileName;//獲取原文件名
String xxxContentType;//獲取原文件類型
注意:xxx是jsp表單中file組件的name屬性
3.在UploadAction的execute方法中,將xxx臨時文件複製到目標目錄中.
4.添加元素配置
5.測試