weixinAPI微信對接 Struts標籤庫 Xml的地址:http://blog.csdn.net/xiazdong/article/details/7293177 Struts注入優先考慮modelDirven中找,其次纔是setter方法 Value注入值,ref注入對象 Jsp實時編譯的,freemarker是預編譯的 EL表達式只能取session、application、request的值 將String[]轉換爲List<String> Arrays.<String>alist(數組對象) Struts中上傳文件大小不得大於2mb Struts中xml有繼承的概念 攔截器方法在action執行前或以後執行,動態代理的原理,ref引用對象 Struts中沒有404錯誤,通常爲struts的異常模板,除非轉發頁面時沒有找到頁面 實現struts中action的方法: 1.繼承actionsupport 2.實現action接口,重寫String excute()方法 Struts2執行順序: Struts-default---struts-plugin--struts.xml 使用Struts 2 開發程序的基本步驟 加載Struts2 類庫 配置web.xml文件 開發視圖層頁面 開發控制層Action 配置struts.xml文件 部署、運行項目 struts2 動做配置 <package name=」惟一的包」 namespace=」/」 extends=」struts-default」> 定義動做 <action name=」虛擬地址」 class=」交給哪一個類來處理」 method=」哪一個方法」> <result name=」哪一個方法返回的字符串」 type=」轉發dispatcher,重定向urlredirect,重定向action (redirectAction)」 > 哪一個頁面顯示 </result> </action> </package> 1、實現struts中的action有幾種方法? 1)、 繼承ActionSupport 2)、 實現Action 接口 -->重寫 String execute() 2、動態調用 做用:減小action數量 使用:actionName!methodName.action 禁用:將屬性struts.enable.DynamicMethodInvocation設置爲false 若是使用動態調用就不能使用通配符 public class UserAction implements Action{//user!login.action,調用UserAction的login()方法 …… public String login(){…..} public String register(){…..} } <action name="user" class="com.xxxx.web.UserAction" > <result name="login">/page/manage.jsp</result> ………… </action> 3、設定默認action,用來顯示用戶輸入錯誤action地址 配置默認Action 沒有Action匹配請求時,默認Action將被執行 經過<default-action-ref…../>元素配置默認action <struts> <default-action-ref name=」defaultAction」/> <package name=」default」 extends=」struts-default」> <action name=」defaultAction」> <result>error.jsp</result> </action> </package > <struts> 4、配置全局的結果集 全局結果 實現同一個包中多個action共享一個結果 <struts> <default-action-ref name=」defaultAction」/> <package name=」default」 extends=」struts-default」> <global-results> <result name=」 error」>/error.jsp</result> <result name=」login」 type=」redirect」>/login.jsp</result> </global-results> …..省了action的配置 </package > <struts> 5、struts2原型圖 用戶請求-->ActionMapper(Action映射)-->FilterDispatcher(轉發)-->ActionProxy(Action代理) -->讀取配置文件-->比對struts.xml中配置 -->ActionInvocation(Action核心調度器) -->通過層層的(Interceptor)過濾-->執行Action中的method方法-->方法執行完後返回Result結果-->根據返回結果讀取頁面(Template)-->再一次通過層層(Interceptor)過濾-響應給用戶 6、攔截器和攔截器棧 攔截器,只能有一個功能 <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/> 攔截器棧, 是由一個或者多個攔截器組成的一個集合 <interceptor-stack name="basicStack"> <interceptor-ref name="exception"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="deprecation"/> </interceptor-stack> 7、自定義攔截器 1)、繼承 AbstractInterceptor 2)、重寫 intercept 方法 Invocation.invoke(); 執行你定義的action中的方法 3)、在struts.xml中去配置 <!-- 配製全局的包,讓其它packet繼承這個包 --> <package name="commonPackage" namespace="/" extends="json-default" abstract="true"> <!-- 定義攔截器 --> <interceptors> <interceptor name="timeSpeend" class="com.wisezone.interceptor.TimeSpeedInterceptor"></interceptor> <!-- 定義攔截器棧,重寫系統strtus-default.xml中默認的 --> <interceptor-stack name="myDefaultStack"> <!-- 系統默認的 --> <interceptor-ref name="defaultStack"></interceptor-ref> <!-- 我本身的 --> <interceptor-ref name="timeSpeend"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 更新全局的攔截器 --> <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref> </package> <!--約定大於配置 --> <packagename="FlinkTypePackage" namespace="/admin" extends="commonPackage"> </package> 8、文件上傳命名規則 private File upload; private String uploadContentType; private String uploadFileName; 頁面:<input type=」file」 name=」upload」/> 9、自定義類型轉換 public class DateConverter extends DefaultTypeConverter ArrayConverter ListConverter DateConverter NumberConverter StringConverter 10、strtus2值棧 要訪問ValueStack就必需要與struts中的標籤一塊兒用,它不能單獨使用 User (userName,password) -->存在值棧中 private User user; //getter/setter方法 <s:property value=」user.userName」 /> <s:textfield name="user.userName" id="userName"></s:textfield> <s:password name="user.password" id="password"></s:password > 日期標籤: 語法: <s:date format=」format」 nice =」true|false」 name=」name」 id=」id」> ………. </s:date> Formate屬性:指定格式進行日期格式化 Nice屬性:該屬性只有true和false兩個值用於指定是否輸出指定日期與當前時間的時差,默認爲false Name屬性:表示當前須要格式化的日期 Id屬性:表示引用該元素的id值 11、struts2驗證規則 void validate方法名() 對某一個動做進行驗證 void validate() 全部的動做進行驗證 ( 不會重寫) public void saveInfo(){} public void validateSaveInfo(){ if(StringUtil.isEmpty(this.flinkType.getTypeName)){ super.addFiledError(「typeName」,」分類名稱不能爲空」); } } 12、國際化 13、保證新增和修改保存 惟一,不容許 重複提交 重複提交發生時機: 1)、網絡慢的時候 2)、提交失敗了報錯, 按返回上一步,再一次提交 token 令牌機制 <package name="filePackage" namespace="/admin" extends="commonPackage"> <!-- 定義一個通配查詢動做 admin/admin_angular1.action --> <action name="file_upload" class="fileUploadTestAction" method="upload"> <!-- 重複提交,開始token機制 --> <interceptor-ref name="myDefaultStack"></interceptor-ref> <interceptor-ref name="token"></interceptor-ref> <result name="success">/admin/flinktype/file.jsp</result> <result name="invalid.token">/admin/重複提交.jsp</result> </action> </package> 14、struts2類型轉換器 struts2 TypeConvertor 博客園 15、freemarker 模板 框架 模板 頁面:純html ${name} 中間:Freemarker:velocity 後臺:name=」張三」 16、Freemarker的使用方法 第一步:把freemarker的jar包添加到工程中 第二步:freemarker的運行不依賴web容器,能夠在java工程中運行。建立一個測試方法進行測試。 第三步:建立一個Configration對象,該對象負責管理Freemarker的模板加載路徑,負責生成模板實例 第四步:告訴config對象模板文件存放的路徑。 第五步:設置config的默認字符集。通常是utf-8 第六步:從config對象中得到模板對象。須要制定一個模板文件的名字。 第七步:建立模板須要的數據集。能夠是一個map對象也能夠是一個pojo,把模板須要的數據都放入數據集。數據模型就是一個MAP集合 第八步:建立一個Writer對象,指定生成的文件保存的路徑及文件名。 第九步:調用模板對象的process方法生成靜態文件。須要兩個參數數據集和writer對象。 第十步:關閉writer對象。 17、 FreeMarker的模板文件並不比HTML頁面複雜多少,FreeMarker模板文件主要由以下4個部分組成: 1,文本:直接輸出的部分 2,註釋:<#-- ... -->格式部分,不會輸出 3,插值:即${...}或#{...}格式的部分,將使用數據模型中的部分替代輸出 4,FTL指令:FreeMarker指定,和HTML標記相似,名字前加#予以區分,不會輸出 18、freemarker通用插值: FreeMarker的插值有以下兩種類型:1,通用插值${expr};2,數字格式化插值:#{expr}或#{expr;format} 1、通用插值 對於FreeMarker的通用插值,又能夠分爲如下4種狀況: 1. FreeMarker插值結果爲字符串值:直接輸出表達式結果 2. FreeMarker插值結果爲數字值:根據默認格式(由#setting指令設置)將表達式結果轉換成文本輸出.可使用內建的字符串函數格式化單個插值,以下面的例子: <#settion number_format="currency"/> <#assign answer=42/> ${answer} ${answer?string} <#-- the same as ${answer} --> ${answer?string.number} ${answer?string.currency} ${answer?string.percent} ${answer} 輸出結果是: $42.00 $42.00 42 $42.00 4,200% 3. FreeMarker插值結果爲日期值:根據默認格式(由#setting指令設置)將表達式結果轉換成文本輸出.可使用內建的字符串函數格式化單個插值,以下面的例子: ${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")} ${lastUpdated?string("EEE, MMM d, ''yy")} ${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} 輸出結果是: 2008-04-08 08:08:08 Pacific Daylight Time Tue, Apr 8, '03 Tuesday, April 08, 2003, 08:08:08 PM (PDT) 4. FreeMarker插值結果爲布爾值:根據默認格式(由#setting指令設置)將表達式結果轉換成文本輸出.可使用內建的字符串函數格式化單個插值,以下面的例子: <#assign foo=true/> ${foo?string("yes", "no")} 輸出結果是: yes 2、數字格式化插值 關於FreeMarker數字格式化插值可採用#{expr;format}形式來格式化數字,其中format能夠是: mX:小數部分最小X位 MX:小數部分最大X位 以下面的例子: <#assign x=2.582/> <#assign y=4/> #{x; M2} <#-- 輸出2.58 --> #{y; M2} <#-- 輸出4 --> #{x; m2} <#-- 輸出2.6 --> #{y; m2} <#-- 輸出4.0 --> #{x; m1M2} <#-- 輸出2.58 --> #{x; m1M2} <#-- 輸出4.0 --> 3、集合 集合以方括號包括,各集合元素之間以英文逗號","分隔,看以下的例子: <#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as x> ${x} </#list> 輸出結果是: 星期一 星期二 星期三 星期四 星期五 星期六 星期天 4、If指令 這是一個典型的分支控制指令,該指令的做用徹底相似於Java語言中的if,if指令的語法格式以下: <#if condition>... <#elseif condition>... <#elseif condition>... <#else> ... </#if> 例子以下: <#assign age=23> <#if (age>60)>老年人 <#elseif (age>40)>中年人 <#elseif (age>20)>青年人 <#else> 少年人 </#if> 輸出結果是:青年人 4.2 switch , case , default , break指令 這些指令顯然是分支指令,做用相似於Java的switch語句,switch指令的語法結構以下: <#switch value> <#case refValue>...<#break> <#case refValue>...<#break> <#default>... </#switch> 5、字符串使用的內建函數: html : 字符串中全部的特殊 HTML 字符都須要用實體引用來代替(好比 < 代替 < ) cap_first :字符串的第一個字母變爲大寫形式 lower_case :字符串的小寫形式 upper_case :字符串的大寫形式 trim :去掉字符串首尾的空格 6、Struts2解析FreeMarker模板中變量的順序以下: 1,FreeMarker模板內建的變量; 2,ValueStack中的變量; 3,ActionContext中的變量; 4,HttpServletRequest中的屬性; 5,HttpSession中的屬性; 6,ServletContext範圍的屬性. type 全部類型:(在struts2-core.jar/struts-default.xml中) Type 類型值 做用說明 chain 用來處理Action 鏈 dispatcher(默認值) 用來轉向頁面,一般處理JSP redirect 重定向到一個URL redirectAction 重定向到一個 Action plainText 顯示源文件內容,如文件源碼 freemarker 處理 FreeMarker 模板 httpheader 控制特殊 http 行爲的結果類型 stream 向瀏覽器發送 InputSream 對象, 一般用來處理文件下載,還可用於返回 AJAX 數據 velocity 處理 Velocity 模板 xslt 處理 XML/XLST 模板 Struts在值棧: <action name="paymentmanagement/*_*" class="{1}Action" method="{2}"> <interceptor-ref name="modelDriven"> <param name="refreshModelBeforeResult">true</param> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="{2}" type="freemarker">/WEB-INF/admin/paymentmanagement/{1}_{2}.html</result> </action>