操作手冊_MyEclipse前言假如你的人生有理想,那么就一定要去追,不管你現在的理想在別人看來是多么的可笑,你也不用在乎,人生蹉跎幾十年,如果年輕的時候計較得失前怕狼就后怕虎而不去追逐,等到了40,50歲的時候,你唯一能做的就是感嘆歲月的消逝和無情…
實驗軟件下載- 下載struts2.1.6http://struts.apache.org/download.cgi#struts217(選擇下載fulldistribution)
- 下載myeclipse,http://www.myeclipseide.com
- 下載tomcat,http://tomcat.apache.org
- 下載xwork,http://www.opensymphony.com/xwork(要注意的是下載與struts2.1.6的對應版本,即2.1.2)
安裝與設置- 解壓struts2.1.6,假設解壓后位于d:/struts2目錄
- 安裝MyEclipse,任何版本都可以
- 假設你已經安裝好jdk和tomcat了,如d:/tomcat
HelloWorld- 建立項目
- 打開eclipse
- 新建項目
- 選擇myeclipse-javaenterPRiseprojects-webproject
- 項目名稱:struts2_0100_introduction
- 選擇javaee5.0
- 設定server
- window–preferences–myeclipse–servers–tomcat–6.x
- 選擇tomcathomedirectory
- 選擇enable
- finish
- 設定jdk環境
- window–preferences–java–installedjres
- 如果沒有對應的JDK(不是JRE),選擇add
- 選擇standardVM->next
- 選擇JDK對應的Directory
- 將剛剛設定的JDK設為默認
- 建立第一個struts2.1的程序
- 找到struts目錄下對應的apps目錄
- 解壓struts2-blank-2.1.6.war
- Copy對應的lib的jar文件,需要除junit和spring-test之外的所有文件,其中commons-io的jar包會在文件上傳和下載時需要,其他為必須
- Copy對應的struts.xml到src目錄,在packageexplorer視圖進行操作
- 注釋掉struts.xml的多余內容
- 建立HelloStruts2_1.jsp文件
- *修改jsp文件的默認編碼屬性window-preferences-web-jspfiles-設為Chinese,NationalStandard
- 在struts.xml中照原配置進行對應的配置
- 修改對應的web.xml,建立struts2的filter(參考struts自帶的項目)
- 運行項目
- 可以首先部署到tomcat上項目
- 也可以項目右鍵debugas–myeclipseserverapp,選擇剛剛建立好的server
- 其他
- 學習建立struts的dev-mode,好處在于我們修改了配置文件的時候能夠自動熱替換
- 建立jar文件對應的源碼D:/share/tools/struts-2.1.6/src/core/src/main/java,以及xwork對應的源碼,以及對應的javadoclocation,(更好的方式是建立自己的user-library)
- 瀏覽struts的目錄
- 認識eclipsejee的項目部署目錄,認識如何修改webapp的context-root,項目copy改名后可能會出現的問題
- packageexplorer–建立jar的源文件和目標關聯,navigator–觀察所有的內容
- 認識Action的后綴名,在struts2默認中,帶不帶action都可以
常見問題:- struts.xml不自動提示
- window–preferences–搜索catalog–add
- 選擇keytype為URI
- key:http://struts.apache.org/dtds/struts-2.0.dtd
- location:對應的dtd文件,位于struts-core包中,解壓開,指定相應位置,如:D:/share/0750_Struts2.1.6/soft/struts-2.1.6/lib/struts2-core-2.1.6/struts-2.0.dtd
- 導入示例項目
- 注意JDK的版本,應該是JDK6,否則會出classversion的問題
- 如果總是項目出問題,可以重建項目,單獨拷文件
- 還有一種情況是項目右鍵,properties–java–compiler選擇6.0
- 另外,在tomcat配置中也要使用jdk6
- devMode設為true就會出問題空指針問題
- tomcat路徑帶了空格
- 在使用ActionContext.getContext().get(“request”)取不到對象,為null值
- web.xml不要使用2.0的filter,用新的
- 在action的試驗中,遇到一個奇怪的bug
- 用default-action-ref指定一個action
- 用*_*映射
- 在地址欄中訪問一個不存在的action,如adfsdfsfs
- 結果居然會映射到*_*上
- 如果換成*__*就沒問題了
- 靠,只能認為是bug
- 下次用*-*,不用*_*
學習方法說明- 先閱讀老師的代碼
- 再建立自己的項目進行動手學習
Action- 實現一個Action的最常用方式:從ActionSupport繼承
- DMI動態方法調用!
- 通配符配置*{1}{2}…
- *_*
- 接收參數的方法(一般用屬性或者DomainModel來接收)
- 簡單參數驗證addFieldError
- 一般不使用Struts2的UI標簽
- 訪問Web元素
- Map類型
- IoC
- 依賴Struts2
- 原始類型
- IoC
- 依賴Struts2
- 包含文件配置
- 默認action處理
Result- 常用四種類型:
- dispatcher(默認)
- redirect
- chain
- redirectAction
- 全局結果集
- global-results|extends
- 動態結果(了解)
- 在action中保存一個屬性,存儲具體的結果location
- 傳遞參數
- 客戶端跳轉才需要傳遞
- ${}表達式(不是EL)
OGNL- ObjectGraphNavigationLanguage
- 想初始化domainmodel,可以自己new,也可以傳參數值,但這時候需要保持參數為空的構造方法
- 其他參考ognl.jsp
- 什么時候在stack中會有兩個Action?chain
Struts-Tags- 通用標簽:
- property
- set
- 默認為actionscope,會將值放入request和ActionContext中
- page、request、session、application
- bean
- include(對中文文件支持有問題,不建議使用,如需包含,改用jsp包含)
- param
- debug
- 控制標簽
- ifelseifelse
- iterator
- collectionsmapenumerationiteratorarray
- subset
- UI標簽
- theme
- simplexhtml(默認)CSS_xhtmlAjax
- AJAX標簽
- 補充
- $#%的區別
- $用于i18n和struts配置文件
- #取得ActionContext的值
- %將原本的文本屬性解析為ognl,對于本來就是ognl的屬性不起作用
- 參考<s:property和<s:include
定義自己的theme- css(覆蓋struts2原來的css)
- 覆蓋單個文件
- 定義自己的theme
- 實戰:
- 把所有主題定義為simple
- fielderror特殊處理
- 自己控制其他標簽的展現
作業- 讀doc文檔:struts-tags
- 設計約定(編碼規定)
- 原則:簡單就是美
- 庫名:項目名
- 表的命名:_Model名
- 字段:保持和屬性名一致(盡量不要起名和數據庫命名沖突)
- 用層來劃分包com.bjsxt.bbs.actionmodel(bean)servicedto(vo)
- ActionXXXXAction
- *-*
- /
- /admin
- package“action”adminAction
項目開發順序-以BBS2009的名義- 建立界面原型
- 建立Struts.xml
- 確定namespace
- 確定package
- 確定Action的名稱,空的方法
- 確定Result
- 將界面原型頁面進行修改,匹配現有設置
- 測試
- 做好規劃!!!!!
- 建立數據庫(或者實體類)
- 建立Model層
- 建立Service層(后面講了Hibernate后再完善)
- 此時可以使用JUnit進行單元測試了
- 著手開發
聲明式異常處理- 在Actoin中進行異常映射
- 在package中進行全局異常映射
- 使用繼承共用異常映射
- Struts2中異常處理由攔截器實現(觀察struts-default.xml)
- 實際上Struts2的大多數功能都由攔截器實現
I18N- I18N原理
- ResourceBundle和Locale的概念
- 資源文件
- native2ascii
- Struts的資源文件
- Action–Package–App級
- 一般只用APP
- struts.xmlcustom.i18n
- PropertiesEditor插件
- 解壓
- featuresplugin覆蓋到myeclipse中的eclipse目錄里
- 動態語言切換
- request_locale=en_US
Struts攔截器以及源碼解析- Struts架構圖
- 見文檔
- Struts執行過程分析
- Interceptor攔截器過程模擬
- 定義自己的攔截器
- acegi–springsecurity
- 使用token攔截器控制重復提交(很少用)
- 類型轉換
- 默認轉換
- 日期處理
- 寫自己的轉換器:
publicclassMyPointConverterextendsDefaultTypeConverter{
@Override
publicObjectconvertValue(Objectvalue,ClasstoType){
if(toType==Point.class){
Pointp=newPoint();
String[]strs=(String[])value;
String[]xy=strs[0].split(",");
p.x=Integer.parseInt(xy[0]);
p.y=Integer.parseInt(xy[1]);
returnp;
}
if(toType==String.class){
returnvalue.toString();
}
returnsuper.convertValue(value,toType);
}
}
publicclassMyPointConverterextendsStrutsTypeConverter{
@Override
publicObjectconvertFromString(Mapcontext,String[]values,ClasstoClass){
Pointp=newPoint();
String[]strs=(String[])values;
String[]xy=strs[0].split(",");
p.x=Integer.parseInt(xy[0]);
p.y=Integer.parseInt(xy[1]);
returnp;
}
@Override
publicStringconvertToString(Mapcontext,Objecto){
//TODOAuto-generatedmethodstub
returno.toString();
}
}
- 三種注冊方式:
- 局部:XXXAction-conversion.properties
- p(屬性名稱)=converter
- 全局:xwork-conversion.properties
- com.xxx.XXX(類名)=converter
- Annotation
- 如果遇到非常麻煩的映射轉換
- request.setAttribute();
- session
補充視頻中講解的內容- Lambda表達式
- 驗證框架
- UI標簽
- 類型轉換中的異常處理
- 上傳與下載文件
- Struts2注解
Struts2總結- Action
- namespace(掌握)
- path(掌握)
- DMI(掌握)
- wildcard(掌握)
- 接收參數(掌握前兩種)
- 訪問request等(掌握MapIOC方式)
- 簡單數據驗證(掌握addFieldError和<s:fieldError)
- Result
- 結果類型(掌握四種,重點兩種)
- 全局結果(掌握)
- 動態結果(了解)
- OGNL表達式(精通)
- #%$
- Struts標簽
- 掌握常用的
- 聲明式異常處理(了解)
- I18N(了解)
- CRUD的過程(最重要是設計與規劃)(精通)
- Interceptor的原理(掌握)
- 類型轉換(掌握默認,了解自定義)