A:爲何用struts
Q:
1.創建在MVC模式上,MVC都有涉及,但它主要是提供一個好的控制器和一套定製的標籤庫上,也就是說它的着力點在C和V上,有MVC一系列有點,如:結構井井有條,高可衝永興,增長了程序的健壯性和可伸縮性,便於開發與設計分工,提供集中校驗國際化、日誌等等;
2.開源項目,獲得了程序大師和高手持續而細心的呵護,而且經受了實戰的檢驗,使其功能愈來愈強大,體系也日臻完善;
3.其餘技術和框架具備良好的融合性。如與spring、hibernate等框架的整合
4.大大提升了開發速度。
A:Framework的概念:
Q:人們用於解決相同或者類似類型問題的方案。
1.特色:可重用性、可擴展性、可收縮性。基於請求響應(request-response)模式的應用Framework的邏輯結構:
控制器(controller)業務邏輯層(business logic)數據邏輯層(data logic)
A:Struts的概念和體系結構
Q:
1.struts是Apache組織的一個開源項目,主要是採用servlet和jsp技術來實現的。
2.struts是一個基於sun java ee平臺的mvc框架,它採用mvc模式,將mvc模式「分離顯示邏輯和業務邏輯」的能力發揮的淋漓盡致。
A:struts的做用
Q:將請求和視圖分開
A:some notice
Q:
1.web.xml裏面的Filter要寫/*
2.action名稱通常用小寫
3.dtd是xml提示所用的文件
4.namespace決定action的訪問路徑,默認""
5.package用來解決action重名的問題
6.凡是名爲success的result均可以不寫name,默認即爲success
7.namespace不寫時,即爲"",只要輸入action的名字(例如index),無論有多少層路徑,只要名字符合,均可以用(例如xxx/xx/index,xx/x/xx/x/index均可以訪問index)。
不寫時,當有其餘package處理不了的action(namespace不一樣),即交給到沒有寫namespace的package去處理。
8.若是copy項目,重命名後,須要在項目右鍵properties,在彈出的對話框左側選擇web,修改右側的web Context-root爲/重命名後的項目名稱,而後從新部署,就能夠訪問重命名後的項目。
==============================
action:
1.具體視圖的返回能夠由用戶本身定義的action來決定
2.具體的手段是根據返回的字符串找到對應的配置項,來決定視圖的美容
3.具體action的實現能夠是一個普通的java類,裏面有public String execute方法便可,或者實現action接口,不過最經常使用的是繼承ActionSupport,好處在於能夠直接使用struts2封裝好的方法。
==============================
自定義action的三種方法:1.繼承ActionSupport(推薦),2實現action接口,重寫execute(@Override)3寫public String execute()方法。
-----------------------------
public class indexAction1{
public String execute(){
return "success";
}
}
-------------------------------
public class indexAction2 implements Action{
@Override
public String execute(){
return "success";
}
}
-------------------------------
推薦
public class indexAction2 extends ActionSupport{
@Override
public String execute(){
return "success";
}
}
--------------------------------
由於:
ActionSupport已經封裝了一系列能夠直接調用的特別方便的方法。包括validate、input....
實現Action,用不了方法
第一種忘記寫execute,就沒辦法調用了。
============================
若是一個普通類裏有execute方法而且返回值爲String類型,就能夠被struts看作是一個action
==============================
A:struts1和struts2對actin建立方式的不一樣
Q:
1.struts2是每次訪問,一定new一個action對象
struts1每次訪問,頗有可能用的是同一個
2.Struts1 Action 是單例的模式而且必須是線程安全的,由於僅有 Action 的一個實例來處理全部的請求.單例的策略限制了Struts1 Action 能作的事情,而且要在開發的時候特別的當心. Action 資源必須是線程安全或者同步的
Struts2 Action 對象爲每個請求產生一個實例,所以沒有線程安全的問題
A:若是action沒有些class將會執行什麼?
Q:默認執行ActionSupport的execute方法,只返回success。
==========================================
路徑問題說明:
直接訪問項目路徑,會直接到web.xml,到對應的struts的filter,而後會找對應的namespace,若是沒有的話,會返回到web.xml裏交給tomcat去處理,會去web.xml裏面找<welcome-file-list>下的<welcome-file>節點,訪問裏面的頁面。
A:struts2中的路徑問題是根據action的路徑而不是jsp路徑來肯定,因此儘可能不要用相對路徑。雖然能夠用redirect方式解決,單redirect方式並不是必要(redirect沒用)。
Q:贊成使用絕對路徑(在jsp中用request.getContextRoot方式來拿到webapp的路徑)或者使用myeclipse常常用的,指定basePath。
若是在jsp的head里加<base href="<%=basePath%>"/>之後,頁面上全部連接地方則不用寫絕對路徑,默認採用basePath再追加鏈接自己的路徑。
================================
2014.8.21週四 13
Action執行的時候並不必定要執行execute方法
能夠在配置文件中配置action的時候用method=來指定執行哪些方法(由於會產生太多action,因此不推薦使用),也能夠用url地址中動態指定(動態方法調用DMI)(推薦)例子:userAction!add
================================
通配符匹配:調用StudentAddAction。 配置裏面寫的action那麼爲‘Student*’當沒有匹配的action時,則會調用通配符action。method ={1}配置爲,若是action的name有八個星號,則會排個順序,1表明第一個星號。
例子:調用studentAdd。 配置action名字爲student*,method{1}。Add則爲method名字。ps:也能夠配置result,例子: <result>/studnet{1}_success.jsp。 必定要遵照「約定優於配置」。例如都是add,delete
<action name="*_*" class="com.xx.Strtus2.action.{1}Action" method={2}>
<result>/{1}_{2}_success.jsp</result>
</action>PS:大小寫必定要相同!!!
注:若是有兩個action均可以匹配,則取最精確的爲準。
例:Student_add、和 *_*
若是有倆星和仨星的均可以匹配,則按前後順序取。只要包括星號都屬於同一等級。
===============================
用屬性接收參數的時候,若是action裏面有name字段和age字段。則頁面傳值時
應調用的是修改字段值得set方法,而不是直接修改屬性。因此,字段名改了不要緊,可是set方法後面的值,必定要和頁面傳來的值同樣!
==================
使用域模型,提取字段屬性和getter、setter方法。在調用實體的action裏生命一個私有變量,private 類型 名字; 寫對象的get和set方法。
vo:value object
do:data object
dto:data transfer object
==========================
20140824
域模型:不要去在action裏面new對象,由於struts2會自動new。
中文問題:有中文就不要用get,全用post。
<form action=user/user!add" method="post">
i18n==internationalization 正好18個字母,因此叫i18n,國際化
struts2.1.6,若是在常亮裏設置了i18n編碼爲gbk後,中文是亂碼,這是2.1.6.的bug。2.1.7則會修復此bug。
若是在2.1.6.狀況下,在struts的filter以前配置一個filter,解決中文問題。或者把struts的filter改成2.0配置的filterDispatcher。 若是以後學習了spring,則能夠用spring的filter解決此問題.
<s:property>專門取valueStack和context裏面的值。按照值棧的名字就能夠取到對應的值棧的值。
<s:debug>能夠顯示出value stack context的信息。
struts會把全部屬性放在struts valueStack裏面去,以後用<s:property>標籤取出屬性值。
struts會幫咱們把action的屬性放在值棧裏面去,咱們取屬性的時候就直接用<s:property>標籤。
值棧內容裏面的property name其實是一個map,例子:用<s:property value="error"/>取error獲得的是值是{name=[name is error]},裏面的name是map的key,後面[]裏的內容是value.若是想取map裏面的某一個key的內容,則用<s:property value="error.name"/>獲得value是[name is error],這個value是數組,若是想取數組的第一項,則用<s:property value="error.name[0]"/>。
像error.name[0]這種表達式叫作ognl表達式。
actionErrors是actin自己出問題的信息。
fieldErrors是表示校驗屬性時的信息。
兩個綜合在一塊兒就是errors。
=========================
訪問web元素request、session、application:
1.不訪問response是由於結果是經過result去返回回去的,因此不用管response的事兒。
2.取得Map類型的request、session、application、真實類型的HttpSerletRequest、HttpSession、ServletContext的引用:
前三者:依賴於容器、IOC(只用這種)
後三者:依賴於容器、IOC
Map request=(Map)ActionContext.getContext.get("request");
===========================
思考題:ActionContext.getContext()是否爲單例模式?
答:不是單例,由於每一個人的請求是不同的,每一個request裏面放的值不同,若是是單例,只能放一個request,那值就不對了。是Tread Local對象,每一個線程的名字和對應的值。在這個線程裏面是單例。
筆記:
單例模式:單例模式是一種經常使用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例類的特殊類。經過單例模式能夠保證系統中一個類只有一個實例並且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。若是但願在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
要點:一是單例模式的類只提供私有的構造函數,二是類定義中含有一個該類的靜態私有對象,三是該類提供了一個靜態的共有的函數用於建立或獲取它自己的靜態私有對象。
優勢:1.實例控制、2靈活性
缺點:1.開銷(靜態初始化解決此問題)、2可能的開發混淆(必須記住本身不能使用new實例化對象)、3對象生存期(不能解決刪除單個對象的問題。在提供內存管理的取消分配,由於它包含對該實例的私有引用。在某些語言中(如 C++),其餘類能夠刪除對象實例,但這樣會致使單例類中出現懸浮引用。)
================================
20140825
value stack context裏的attr會逐個搜索request、session、application裏面的值。不過不多用,由於要很精確的知道你想要的值在哪裏,不然遇到重名的問題很難肯定究竟獲取的是哪個值。(應該忘掉!)
----------------------
IoC:inverse of control:原本本身控制,結果給別人控制了,就叫控制反轉。最先是spring推廣出來(不是spring提出來的)
DI:dependency injection:若是沒有容器(外界的環境)把這個值注入過來,則拿不到這個值。
request不多用,由於value stack自己就在request裏。application不多用,全局能夠放在數據庫裏,也能夠本身定義一個類,放在裏面就行了。比較經常使用的是session。
---------默認Action----------
在配置actin的xml裏,在package下方配置節點<default-action-ref name="默認action的名字"></default-action-ref>就會訪問配置的action。
-----------action總結------------------
1.實現一個action最經常使用的方式:從ActionSupport繼承;
2.DMI動態方法調用
3.通配符配置*{1}{2}
4.接收參數的方法(通常用屬性或者DomainModel來接收)
5.簡單參數驗證addFieldError(通常不使用Struts2的UI標籤
6.訪問Web元素(1.MAP類型a.Ioc、b依賴struts2。2原始類型a、Ioc,b依賴Struts2)
7.包含文件配置
8.默認actin處理
--------------------常見問題----------------------
1.若是用(Map)ActionContext.getContext.get("request");取不到action,有多是web.xml裏面,配置爲struts2.0,必須用struts2.1的配置,這是bug!
------resutl的type屬性(dispatch、redirect、chain、redirectAction,freemarker、httpheader、stream、v elocity、xslt、plaintext、tiles)-------------------------
1.若是不配置,則默認爲dispatcher,運用服務器跳轉,也就是jsp forward到一個頁面去,只能跳轉到頁面,不能是action。
2.redirect:只能跳轉到視圖
3.chain:forward到一個action
4.redirectAction:客戶端跳轉到action
/*前四個比較經常使用,重點是一、2,後幾個瞭解不瞭解無所謂*/
5.freemarker
6.httpheader:發送一個http的頭信息
7.stream:下載(和上傳沒什麼關係)
8.velocity(模板框架,如今已經幹不過freemarker了):
9.xslt:和xml相關的修飾
10.plaintext:顯示網站源碼(不是html),作教學網站可能會用到,其餘狀況用到的很少
11.tiles:用的不多,把頁面分紅幾塊,每塊能夠從新指定,如今幾乎不用。
===========================
2014.9.2
1.global result:假若有許多action,它們都有一個共同的結果,與其在每個action中配置,不如配置一個全局的result。在package裏面,全部的action能夠公用一個result。
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
2.若是另一個package想用此包的global-result,就extends繼承含有global-result的包。
3.若是一個包含有abstract屬性,那此包專門用來繼承。
4.interceptor和filter的原理如出一轍。
5.動態result(用的並很少,瞭解就能夠):<result>${r}</result>,r爲action中的屬性,在返回時前設置r值,在配置文件裏,讀取r值。 $用來在配置文件裏讀取valueStack裏的值的OGNL表達式。
6.一次request只有一個值棧,那麼服務器端的forward對於客戶端來講就是一次request,因此他們兩個公用一個request。
7.若是result類型是redirect,須要傳valuestack參數,就須要在result裏寫
<result type="redirect">/x.jsp?參數名=${參數值對象}
8.用forward時不須要傳參數,在用redirect的時候,傳參數須要用#parameters.參數名
=============================
result總結:
一、經常使用四種類型(經常使用爲上面兩種,下面兩種瞭解就能夠):
a.dispatcher(默認)
b.redirect
c.chain
d.redirectAction
二、全局結果集
global-results,若是想用別的包的全局結果集,就extends那個包
三、動態結果(瞭解)
在action裏保存一個屬性,存儲具體的結果location,須要用${}(不是el)取值
四、傳遞參數
a.客戶端跳轉才須要傳遞
b.s{}從valuestack取值,不是el
==================================
先看文檔,再看gogle,最後問身邊人。
==================================
Action
1.實現一個action的最經常使用的方式:從ActionSupport繼承
2.DMI動態方法調用:Action!Method
3.通配符配置*{1}{2}
4.接收參數的方法(通常用屬性或者DomainModel來接收)
5.簡單參數驗證addFieldError,通常不使用Struts2的UI標籤
6.訪問web元素 a、Map(IoC、依賴struts2);b、原始類型(IoC、依賴struts2)
7.包含文件配置:include
8.默認action處理defaultActionReferents(瞭解便可)
Result
1.經常使用四種類型:dispatcher(默認)、redirect、chain、redirectAction
2.全局結果集global-results extends
3.動態結果(瞭解):在action中保存一個屬性,存儲具體的結果location
4.傳遞參數:a、客戶端跳轉才須要傳遞;b、s{}表達式(不是el)
=================================
OGNL
1.在OGNL表達式裏,傳參時,若是沒有手動new對象,必需要傳對象的屬性,框架纔會自動構造對象,不然對象爲空。
2.domain model通常都要提供默認無參構造方法,由於若是框架自動實例化對象,會調用無參構造方法,若是有8個構造都須要傳參,沒有無參構造方法,這樣的狀況下,框架是不會自動實例化對象成功的(框架不知道選擇哪一個有參構造,不知道這些參數該如何傳遞)。
=====================================
ognl
Object Graph Navigation Language對象圖導航語言
=====================================
struts標籤(程序設計正常時,基本不用struts標籤)
一.通用標籤
1.property
2.set
a.默認爲actionscope,會將值放入request和ActionContext中
b.page、request、session、application
3.bean
4.include(對中文支持有問題,不建議使用,如需包含,改用jsp包含)
5.param
6.debug
二.控制標籤
1.if elseif else
2.iterator
a.collections map enumeration iterator array
3.subset
三.UI標籤
1.theme
a simple xhtml(默認) css xhtmlajax
四.AJAX標籤
1.補充
五.$#%的區別
1.$用戶i18n和struts配置文件
2.#取得ActionContext的值
3.%將本來的文本屬性解struts2析爲ognl,對於原本就是ognl的屬性不起做用
-------------------------------
重要標籤:
1:property、set、bean、param、debug
2.if elseif、iterator
ajax用最原始的便可,
其餘瞭解便可。
-------------------------------
20140924:
1、聲明式異常處理
1.在Action中進行異常映射
2.在package中進行全局異常映射
3.使用繼承公用異常映射
4.struts2中異常處理由攔截器實現(觀察struts-default.xml,實際上struts2的大多數功能都由攔截器實現)
二I18N(國際化大網站)
1.原理:
a.ResourceBundle和Locale的概念
b.資源文件
c.native2ascii
2.struts的資源文件
a.Action-Package-App級
b.PropertiesEditor插件(解壓,features plugin覆蓋到myeclipse中的eclipse目錄裏)
---------------------------
包級別的I18N資源文件必須以package_開頭(這種方式不多用(太麻煩,設置太多),通常用整個應用級別的I18N,開頭隨便起,必須放在項目根路徑下,而後在struts.xml裏配置constant:struts.custome.i18n.resources=資源文件開頭名稱)
---------------------------
資源文件中的參數,在資源文件裏寫佔位符,例如:welcome.msg=wel:{0}
<s:text name="welcome.msg">
<s:parame value="usernmae"></s:param>
</s:text>
取不到的時候就會顯示welcome.msg
---------------------------
動態語言切換
url加參數:?request_locale=en_US,提交過去後,整個網站都是英文。
============================
Struts攔截器以及源碼解析
1.struts架構圖(見桌面,struts流程)
2.struts執行過程分析
3.Interceptor攔截器過程模擬
4.定義本身的攔截器(不多用,用到就是設計思路不對了,由於大多數的攔截器struts已經設計完了,若是自定義struts的攔截器,就至關於與struts框架綁定在一塊兒了,想切換到別的框架,就完了……)
a.如權限判斷,acegi(原名)-spring security(更名後):例如在類方法、或者url裏面判斷權限
5.使用token攔截器控制重複提交(不多用)
6.日期處理
7.類型轉換
a.寫本身的攔截器(繼承DefaultTypeConverter,重寫方法convertValue)
b.三種註冊方式
ba.局部:XXXAction-conversion.properties(要和action放在同一包下)
p(屬性名)=converter
bb.全局:xwork-conversion.properties
com.xx.xx(類型)=converter
bc.Annotation(@element)
若是遇到很是麻煩的映射轉換request.setAttribute();
=====================================
Struts2總結
--------------------------------------
1.Action:namespace(掌握)、path(掌握)、DMI,動態方法調用,action!method(掌握)、wildcard通配符(掌握)、接收參數(掌握前兩種action屬性和domain model)、訪問 request等(掌握MAP IOC方式)、簡單數據驗證(掌握addFieldError和<s:fieldError>)
--------------------------------------
2.Result:結果類型(redirect,dispatcher掌握四種,重點兩種)、全局結果(掌握)、動態結果(瞭解)
--------------------------------
3.OGNL表達式(精通):#%$
-------------------------------
4.struts標籤(掌握經常使用)
4.聲明式異常處理(瞭解)
5.I18(瞭解)
6.CRUD的過程(最重要是設計與規劃)精通
7.Interceptor的原理(掌握)
8.類型轉換(默認掌握,瞭解自定義)
css