seasun  
          在不斷模仿、思考、總結中一步一步進步!
          公告
          •     我的blog中的部分資源是來自于網絡上,如果您認為侵犯了您的權利,請及時聯系我,我會盡快刪除!E-MAIL:shiwenfeng@aliyun.com和QQ:281340916,歡迎交流。

          日歷
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導航

          常用鏈接

          隨筆分類

          good blog author

          積分與排名

          • 積分 - 81792
          • 排名 - 699

          最新評論

          閱讀排行榜

           

          Display Tag Lib是一個標簽庫,用來處理jsp網頁上的Table,功能非常強,可以對的Table進行分頁、數據導出、分組、對列排序等等,反正我在做項目時需要的功能它都給我提供了,而且使用起來非常的方便。能夠大大減少代碼量。
              介個是Display Tag的官方網站

              首先當然是要下載它的jar包了,這里可以下載到最新的版本。將jar包放到WEB-INF的lib文件夾下。另外還需要兩個輔助包:apache的commons-lang和standard包,更多的輔助包可以在這里下載。

              在web.xml下添加一個filter
              <filter>
                  <filter-name>exportFilter</filter-name>
                  <filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
              </filter>

              在jsp頁面做一個引用:
          <%@ taglib uri="http://displaytag.sf.net/el" prefix="display" %>

              首先我們定義一個list
          <%
           List test = new ArrayList( 6 );
           test.add( "Test String 1" );
           test.add( "Test String 2" );
           test.add( "Test String 3" );
           test.add( "Test String 4" );
           test.add( "Test String 5" );
           test.add( "Test String 6" );
           request.setAttribute( "test", test );
          %>

              當我們想在jsp頁面上顯示這個list時,我們只需要寫一句話
              <display:table name="test" />
              display tag會自動生成一個table

              如果list是從控制層拋出來的,name可使用EL表達式表示
              <display:table name="$" />

              這是最簡單的display tag的使用,我們可以給它加上樣式等,也可以定義顯示的列,下面的table顯示復雜一些
          <display:table name="test" styleClass="list" cellspacing="0" cellpadding="0">
            <display:column property="id" title="ID" class="idcol"/>
            <display:column property="name" />
            <display:column property="email" />
            <display:column property="description" title="Comments"/>
          </display:table>

              如果想要給它加個鏈接也很簡單,下面的代碼給name加了連接,并附帶id參數,email也自動連接到mailto:XXX
          <display:table name="test" styleClass="list" cellspacing="0" cellpadding="0">
            <display:column property="id" title="ID" class="idcol"/>
            <display:column property="name" url="detail.jsp" paramId="id" paramProperty="id"/>
            <display:column property="email" autolink="true"/>
            <display:column property="description" title="Comments"/>
          </display:table>

          下面介紹幾個Display最常用的功能,更多功能請參考http://displaytag.homeip.net/displaytag-examples-1.1/
          1. 分頁
              如果想對代碼分頁,只需在display:table標簽中添加一項pagesize="每頁顯示行數",如
          <display:table name="test" pagesize="10"/>

          2. 對列排序
              display tag可對列進行排序,就是點擊列名,對該列的數據進行排序。你只需對想要排序的列添加 sort="true" 就OK,如下面的代碼可對前三列進行排序。在display:table中添加defaultsort="列數",可默認對指定的列排序。
          <display:table name="test" styleClass="list" cellspacing="0" cellpadding="0" defaultsort="1">
            <display:column property="id" title="ID" class="idcol" sort="true"/>
            <display:column property="name" url="detail.jsp" paramId="id" paramProperty="id" sort="true"/>
            <display:column property="email" autolink="true" sort="true"/>
            <display:column property="description" title="Comments"/>
          </display:table>
             如果table有分頁,Display Tag默認只對當前頁進行排序,如果想對整個list排序,可以在display:table之間添加一段代碼:
          <display:setProperty name="sort.amount" value="list"/>

          3. 導出數據
              在display:table中添加export="true",看看會出現什么!Display Tag默認會提供三種數據導出方式:CSV、Excel、XML 。
              另外Display Tag還可以導出為PDF格式,在http://prdownloads.sourceforge.net/itext/下載一個輔助包iText.jar,copy到lib目錄下,然后在display:table之間添加一段代碼:
          <display:setProperty name="export.pdf" value="true"/>,大功告成。

          4. Display Tag的屬性設置
              前面所說的display:setProperty 是一種改變Display Tag屬性的方法,但是在每個jsp中都要寫太麻煩了。
              Display Tag中設置了很多默認的屬性,它有一個專門的屬性文件,是在它的jar包中的displaytag/properties/TableTag.properties
              想要改變它的默認屬性,我們可以在WEB-INFclasses下新建一個文件displaytag.properties,仿照TableTag.properties中屬性的格式設置需要修改的屬性。
              TableTag.properties中的# messages中設置的是顯示在頁面上的提示信息。默認是英文的,我們可以把它改為中文的。不過這里只能使用unicode,就是說中文字符必須轉換為unicode碼,這個可以使用jdk自帶的native2ascii.exe進行轉換。

          5. 其它功能
              DisplayTag還有一些很實用的小功能,這里提兩個。一個是對數據的Format,這是1.1版本添加的新功能,可以使用標簽的方式格式化時間、數字、字符串。比如日期,在需要格式化的column標簽中添加format="",第一個參數為格式化的數據序號,第二個參數是數據類型,數字為number,第三個參數為數據格式。
              另外一個功能是對table數據的合計功能。在table標簽中添加 decorator="org.displaytag.decorator.TotalTableDecorator",然后在想要進行合計的數據列的column標簽中添加 total="true",該列就可以被計算總數了。但這個功能有個缺點,不能用在有分頁的時候,它只能合計第一頁的數據。

          DisplayTag的不足
              初次使用DisplayTag的人可能會覺得驚喜,但是用久了會發現很多問題,最大的問題是對中文的支持不好,比如如果查詢條件中有中文,就無法翻頁,無法對中文排序,將中文導出為指定文件時出現亂碼等等。這些問題有時候會讓人很郁悶,有時候逼得你要去修改它的源代碼。下面是對以上幾個問題的解決方法:
              1. 對于中文無法翻頁、排序,最簡單的辦法是修改Tomcat下的server.xml文件。找到HTTP的Connector標簽,在里面添加一項URIEncoding="...",引號里面的內容取決于你的頁面編碼,比如可以是GBK,UTF8等。這樣上面兩個問題就可以解決了。
              2. 導出為文件:其實這個功能除了中文支持外還有很多其它問題,比如它會將Html標簽一起導出、只導出顯示的內容,但如果對table進行了decorator,decorator后的內容無法導出。如果想要將中文正確導出,需要修改DisplayTag源代碼。
              下載相同版本的源代碼,在org.displaytag.export.ExcelView.java文件中找到getMimeType()方法,將此方法修改為 return "application/vnd.ms-excel;charset=GB2312";,修改后導出數據的速度會慢很多,不過將就吧。
              3. 新版的DisplayTag1.1添加了對一次取部分數據的支持,相關的標簽包括partialList和size,需要設置partialList="true"和size的大小。具體怎么用偶還沒研究。

          posted @ 2009-10-30 11:25 shiwf 閱讀(731) | 評論 (0)編輯 收藏
           
          轉載 :http://www.javaeye.com/wiki/Java_Newbie/945-java-programmers-recommendation-books

          作為Java程序員來說,最痛苦的事情莫過于可以選擇的范圍太廣,可以讀的書太多,往往容易無所適從。我想就我自己讀過的技術書籍中挑選出來一些,按照學習的先后順序,推薦給大家,特別是那些想不斷提高自己技術水平的Java程序員們。

          在這份推薦閱讀書籍的名單中,我沒有列舉流行的軟件框架類學習書籍,例如Struts,Hibernate,Spring之類,也沒有列舉AJAX方面的書籍。是因為這類書籍容易過時,而上述的大半書籍的生命周期都足夠長,值得你去購買和收藏。

          Java編程入門類 Top

          對于沒有Java編程經驗的程序員要入門,隨便讀什么入門書籍都一樣,這個階段需要你快速的掌握Java基礎語法和基本用法,宗旨就是“囫圇吞棗不求甚解”,先對Java熟悉起來再說。用很短的時間快速過一遍Java語法,連懵帶猜多寫寫代碼,要“知其然”。

          1、《Java編程思想》


          在有了一定的Java編程經驗之后,你需要“知其所以然”了。這個時候《Java編程思想》是一本讓你知其所以然的好書,它對于基本的面向對象知識有比較清楚的交待,對Java基本語法,基本類庫有比較清楚的講解,可以幫你打一個良好的Java編程基礎。這本書的缺點是實在太厚,也比較羅嗦,不適合現代人快節奏學習,因此看這本書要懂得取舍,不是每章每節都值得一看的,挑重點的深入看就可以了。

          2、《Agile Java》中文版


          這本書是出版社送給我的,我一拿到就束之高閣,放在書柜一頁都沒有翻過,但是前兩天整理書柜的時候,拿出來一翻,竟然發現這絕對是一本好書!這本書一大特點是以單元測試和TDD來貫穿全書的,在教你Java各種重要的基礎知識的過程中,潛移默化的影響你的編程思維走向敏捷,走向TDD。另外這本書成書很新,以JDK5.0的語法為基礎講解,要學習JDK5.0的新語法也不錯。還有這本書對于內容取舍也非常得當,Java語言畢竟類庫龐大,可以講的內容太多,這本書選擇的內容以及內容的多寡都很得當,可以讓你以最少的時間掌握Java最重要的知識,順便培養出來優秀的編程思路,真是一本不可多得的好書。

          雖然作者自己把這本書定位在入門級別,但我不確定這本書用來入門是不是稍微深了點。

          Java編程進階類 Top

          打下一個良好的Java基礎,還需要更多的實踐經驗積累,我想沒有什么捷徑。有兩本書值得你在編程生涯的這個階段閱讀,培養良好的編程習慣,提高你的代碼質量。

          1、《重構 改善既有代碼的設計》


          這本書名氣很大,不用多介紹,可以在閑暇的時候多翻翻,多和自己的實踐相互印證。這本書對你產生影響是潛移默化的。

          2、《測試驅動開發 by Example》


          本書最大特點是很薄,看起來沒有什么負擔。你可以找一個周末的下午,一邊看,一邊照做,一個下午就把書看完,這本書的所有例子跑完了。這本書的作用是通過實戰讓你培養TDD的思路。

          Java架構師之路 Top

          到這個階段,你應該已經非常嫻熟的運用Java編程,而且有了一個良好的編程思路和習慣了,但是你可能還缺乏對應用軟件整體架構的把握,現在就是你邁向架構師的第一步。

          1、《Expert One-on-One J2EE Design and Development》


          這本書是Rod Johnson的成名著作,非常經典,從這本書中的代碼誕生了springframework。但是好像這本書沒有中譯本。

          2、《Expert One-on-One J2EE Development without EJB》


          這本書由gigix組織翻譯,多位業界專家參與,雖然署名譯者是JavaEye,其實JavaEye出力不多,實在是忝居譯者之名。

          以上兩本書都是Rod Johnson的經典名著,Java架構師的必讀書籍。在我所推薦的這些書籍當中,是我看過的最仔細,最認真的書,我當時讀這本書幾乎是廢寢忘食的一氣讀完的,有小時候挑燈夜讀金庸武俠小說的勁頭,書中所講內容和自己的經驗知識一一印證,又被無比精辟的總結出來,讀完這本書以后,我有種被打通經脈,功力爆增的感覺。

          但是后來我看過一些其他人的評價,似乎閱讀體驗并沒有我那么high,也許是因為每個人的知識積累和經驗不同導致的。我那個時候剛好是經驗知識積累已經足夠豐富,但是還沒有系統的整理成型,讓這本書一梳理,立刻形成完整的知識體系了。

          3、《企業應用架構模式》


          Martin的又一本名著,但這本書我只是泛泛的看了一遍,并沒有仔細看。這本書似乎更適合做框架的人去看,例如如果你打算自己寫一個ORM的話,這本書是一定要看的。但是做應用的人,不看貌似也無所謂,但是如果有空,我還是推薦認真看看,會讓你知道框架為什么要這樣設計,這樣你的層次可以晉升到框架設計者的角度去思考問題。Martin的書我向來都是推崇,但是從來都沒有像Rod Johnson的書那樣非常認真去看。

          4、《敏捷軟件開發 原則、模式與實踐》


          Uncle Bob的名著,敏捷的經典名著,這本書比較特別,與其說是講軟件開發過程的書,不如說講軟件架構的書,本書用了很大篇幅講各種面向對象軟件開發的各種模式,個人以為看了這本書,就不必看GoF的《設計模式》了。


          軟件開發過程 Top

          了解軟件開發過程不單純是提高程序員個人的良好編程習慣,也是增強團隊協作的基礎。

          1、《UML精粹》


          UML其實和軟件開發過程沒有什么必然聯系,卻是軟件團隊協作溝通,撰寫軟件文檔需要的工具。但是UML真正實用的圖不多,看看這本書已經足夠了,完全沒有必要去啃《UML用戶指南》之類的東西。要提醒大家的是,這本書的中譯本翻譯的非常之爛,建議有條件的看英文原版。

          2、《解析極限編程 擁抱變化》XP


          這是Kent Beck名著的第二版,中英文對照。沒什么好說的,必讀書籍。

          3、《統一軟件開發過程》UP


          其實UP和敏捷并不一定沖突,UP也非常強調迭代,測試,但是UP強調的文檔和過程驅動卻是敏捷所不取的。不管怎么說,UP值得你去讀,畢竟在中國真正接受敏捷的企業很少,你還是需要用UP來武裝一下自己的,哪怕是披著UP的XP。

          4、《敏捷建模》AM


          Scott Ambler的名著,這本書非常的progmatic,告訴你怎么既敏捷又UP,把敏捷和UP統一起來了,又提出了很多progmatic的建議和做法。你可以把《解析極限編程 擁抱變化》、《統一軟件開發過程》和《敏捷建?!愤@三本書放在一起讀,看XP和UP的不同點,再看AM是怎么統一XP和UP的,把這三種理論融為一爐,形成自己的理論體系,那么你也可以去寫書了。


          軟件項目管理 Top

          如果你突然被領導提拔為項目經理,而你完全沒有項目管理經驗,你肯定會心里沒底;如果你覺得自己管理項目不善,很想改善你的項目管理能力,那么去考PMP肯定是遠水不解近渴的。

          1、《快速軟件開發》


          這也是一本名著。可以這樣說,有本書在手,你就有了一個項目管理的高級參謀給你出謀劃策,再也不必擔心自己不能勝任的問題了。這本書不是講管理的理論的,在實際的項目管理中,講這些理論是不解決問題的,這本書有點類似于“軟件項目點子大全”之類的東西,列舉了種種軟件項目當中面臨的各種問題,以及應該如何解決問題的點子,你只需要稍加變通,找方抓藥就行了。




          posted @ 2009-10-30 10:25 shiwf 閱讀(204) | 評論 (0)編輯 收藏
           

          <?xml version="1.0" encoding="GBK"?>
          <!-- 配置Web應用配置文件的根元素,并指定配置文件的Schema信息 -->
          <web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
           http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
           <!-- 定義ActionContextCleanUp過濾器 -->
           <filter>
            <filter-name>struts-cleanup</filter-name>
            <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
           </filter>
           <!-- 定義SiteMesh的核心過濾器 -->
           <filter>
            <filter-name>sitemesh</filter-name>
            <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
           </filter>
           <!-- 定義Struts 2的核心過濾器 -->
           <filter>
            <filter-name>struts</filter-name>
            <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
           </filter>

           <!-- 定義過濾器鏈 -->
           <!-- 排在第一位的過濾器是:ActionContextCleanUp過濾器 -->
           <filter-mapping>
            <filter-name>struts-cleanup</filter-name>
            <url-pattern>/*</url-pattern>
           </filter-mapping>
           <!-- 排在第二位的過濾器是:SiteMesh的核心過濾器 -->
           <filter-mapping>
            <filter-name>sitemesh</filter-name>
            <url-pattern>/*</url-pattern>
           </filter-mapping>
           <!-- 排在第三位的過濾器是:FilterDispatcher過濾器 -->
           <filter-mapping>
            <filter-name>struts</filter-name>
            <url-pattern>/*</url-pattern>
           </filter-mapping>

           <!-- 定義一個Listener,該Listener在應用啟動時創建Spring容器 -->
           <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener
            </listener-class>
           </listener>
           <!-- 定義一個Listener,該Listener在應用啟動時加載MyFaces的Context -->
           <listener>
            <listener-class>org.apache.myfaces.webapp.StartupServletContextListener
            </listener-class>
           </listener>
           <!-- 配置JSF的FacesServlet,讓其在應用啟動時加載 -->
           <servlet>
            <servlet-name>faces</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
           </servlet>
           <!-- 讓FacesServlet攔截所有以*.action結尾的請求 -->
           <servlet-mapping>
            <servlet-name>faces</servlet-name>
            <url-pattern>*.action</url-pattern>
           </servlet-mapping>
          </web-app>

          posted @ 2009-10-28 17:11 shiwf 閱讀(1394) | 評論 (0)編輯 收藏
           
          一、基本概念
          1、Sitemesh是一種頁面裝飾技術 :
          1  :它通過過濾器(filter)來攔截頁面訪問
          2  :根據被訪問頁面的URL找到合適的裝飾模板
          3  :提取被訪問頁面的內容,放到裝飾模板中合適的位置
          4  :最終將裝飾后的頁面發送給客戶端。
          2、在sitemesh中,頁面分為兩種:裝飾模板和普通頁面。
          1)裝飾模板,是指用于修飾其它頁面的頁面。
          2)普通頁面,一般指各種應用頁面。
          二、模板修飾網頁的原理







          通過Sitemesh的注冊機制,告訴Sitemesh,當訪問該路徑時使用XXX模板(假定使用前面那個模板)來修飾被訪問頁面。



          當用戶在左邊導航欄點擊“戲說長城”( /ShowGreatWall.do)時,右邊的“戲說長城”頁面將會被指定的模板修飾



          總結上面過程,Sitemesh修飾網頁的基本原理,可以通過下面來說明:



          三、Sitemesh的配置與使用
          1)WEB-INF/web.xml中加入filter定義與sitemesh的taglib定義
               <filter>
                    
          <filter-name>sitemesh</filter-name>
                    
          <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
               
          </filter>
               
          <filter-mapping>
                    
          <filter-name>sitemesh</filter-name>
                    
          <url-pattern>/*</url-pattern>
               </filter-mapping>

               <taglib>
                    <taglib-uri>sitemesh-decorator</taglib-uri>
                    <taglib-location>/WEB-INF/sitemesh-decorator.tld</taglib-location>
               </taglib>
               <taglib>
                    <taglib-uri>sitemesh-page</taglib-uri>
                    <taglib-location>/WEB-INF/sitemesh-page.tld</taglib-location>
               </taglib> 
          2)創建WEB-INF/decorators.xml,在該文件中配置有哪些模板,以及每個模板具體修飾哪些URL,另外也可以配置哪些URL不需要模板控制 , decorators.xml的一個例子如下:
          <excludes>
          <pattern>/Login*</pattern>
          </excludes>

          <decorators defaultdir="/decorators">
              
          <decorator name="main" page=“DecoratorMainPage.jsp">
                  
          <pattern>/*</pattern> 
              
          </decorator>

              
          <decorator name=“pop" page=“PopPage.jsp">
                  
          <pattern>/showinfo.jsp*</pattern>
                  
          <pattern>
                        /myModule/GreatWallDetailAction.do*
                  
          </pattern>
              
          </decorator>
          </decorators>
          3)我們看一個修飾模板的例子
          <%@page contentType="text/html;?charset=GBK"%>
          <%@taglib uri="sitemesh-decorator"?prefix="decorator" %>

          <html>
              
          <head>
                   
          <title> <decorator:title/> </title>
                   
          <decorator:head/>
              
          </head>

              
          <body>
                  Hello World  
          <hr/>
                  
          <decorator:body/>
              
          </body>
          </html> 
          4)我們看一個被修飾的頁面的例子:
          <%@ page contentType="text/html;?charset=GBK"%>
          <html>
              
          <head>
                  
          <title>Hello World</title>
              
          </head>

              
          <body>
                  
          <p>Decorated page goes here.</p
              </body
          >
          </html> 
          5)我們看一下裝飾模板中可以使用的Sitemesh標簽 
          <decorator:head />
           取出被裝飾頁面的head標簽中的內容。
          <decorator:body />
          取出被裝飾頁面的body標簽中的內容。
          <decorator:title default=""  />
          取出被裝飾頁面的title標簽中的內容。default為默認值
          <decorator:getProperty property="" default=""  writeEntireProperty=""/>
          取出被裝飾頁面相關標簽的屬性值。
          writeEntireProperty表明,是顯示屬性的值還是顯示“屬性=值”
          Html標簽的屬性
          Body標簽的屬性
          Meta標簽的屬性
          注意如果其content值中包含“>或<”會報錯,需轉碼,例如&lt;等等
          default是默認值
          <decorator:usePage id="" />
           將被裝飾頁面構造為一個對象,可以在裝飾頁面的JSP中直接引用。
          6)看一個在裝飾模板中使用標簽的例子
          <html lang=“ <decorator:getProperty property=‘lang’/> ”>
              
          <head>
                  
          <title> <decorator:title default=“你好” /> </title>
                  
          <decorator:head />
              
          </head>
              
              
          <body <decorator:getProperty property=“body.onload" writeEntireProperty=“1"/> >
                   
          從meta中獲取變量company的名稱:
                       <decorator:getProperty property
          =“meta.company”/>

                      
          下面是被修飾頁面的body中的內容:
                       <decorator:body 
          />

                   
          <decorator:usePage id=“myPage" />

                   
          <%=myPage.getRequest().getAttribute(“username”)%>
              
          </body>
          </html>
          7)看一下相應的在被修飾頁面中的代碼:
          <html lang=“en”>
              
          <head>
                  
          <title>我的sitemesh</title>
                  
          <meta name=“company” content=“smartdot”/>
                  
          <meta name=“Author” content=“zhangsan”/>
                  
          <script>
                       function count(){return 10;}
                  
          </script>
              
          </head>

              
          <body onload=“count()”>
                   
          <p>這是一個被修飾頁面</p>
              
          </body>
          </html>
          四、總結

          1,Sitemesh最為重要的就是做用于修飾的模板,并在decorators.xml中配置這些模板用于修飾哪些頁面。因此使用Sitemesh的主要過程就是:做裝飾模板,然后在decorators.xml中配置URL Pattern

          2,分析整個工程,看哪些頁面需要抽象成模板,例如二級頁面、三級頁面、彈出窗口等等可能都需要做成相應的模板,一般來說,一個大型的OA系統,模板不會超過8個。

          如果某個特殊的需求請求路徑在過濾器的范圍內,但又不想使用模板怎么辦?
          你總不能這么不講道理吧!
                  大家放心吧,SiteMesh早就考慮到這一點了,上面第5步說道的decorators.xml這個時候就起到作用了!
          下面是我的decorators.xml:
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <decorators defaultdir="/decorators">
              <!-- Any urls that are excluded will never be decorated by Sitemesh -->
              <excludes>
                  <pattern>/index.jsp*</pattern>
                    <pattern>/login/*</pattern>
              </excludes>
              <decorator name="main" page="main.jsp">
                  <pattern>/*</pattern>
              </decorator>
          </decorators>
           decorators.xml有兩個主要的結點:
                decorator結點指定了模板的位置和文件名,通過pattern來指定哪些路徑引用哪個模板
                excludes結點則指定了哪些路徑的請求不使用任何模板
          如上面代碼,/index.jsp和凡是以/login/開頭的請求路徑一律不使用模板;
          另外還有一點要注意的是:decorators結點的defaultdir屬性指定了模板文件存放的目錄;
          posted @ 2009-10-28 13:47 shiwf 閱讀(806) | 評論 (0)編輯 收藏
           
          轉至:http://www.aygfsteel.com/hadeslee/archive/2008/12/03/244199.html

          struts.action.extension
                    The URL extension to use to determine if the request is meant for a Struts action
                     用URL擴展名來確定是否這個請求是被用作Struts action,其實也就是設置 action的后綴,例如login.do的'do'字。

          struts.configuration
                    The org.apache.struts2.config.Configuration implementation class
                      org.apache.struts2.config.Configuration接口名

          struts.configuration.files
                    A list of configuration files automatically loaded by Struts
                     struts自動加載的一個配置文件列表

          struts.configuration.xml.reload
                    Whether to reload the XML configuration or not
                     是否加載xml配置(true,false)

          struts.continuations.package
                     The package containing actions that use Rife continuations
                     含有actions的完整連續的package名稱

          struts.custom.i18n.resources
                    Location of additional localization properties files to load
                     加載附加的國際化屬性文件(不包含.properties后綴)

          struts.custom.properties
                    Location of additional configuration properties files to load
                     加載附加的配置文件的位置


          struts.devMode
                    Whether Struts is in development mode or not
                     是否為struts開發模式

          struts.dispatcher.parametersWorkaround
                    Whether to use a Servlet request parameter workaround necessary for some versions of WebLogic
                      (某些版本的weblogic專用)是否使用一個servlet請求參數工作區(PARAMETERSWORKAROUND)

          struts.enable.DynamicMethodInvocation
                    Allows one to disable dynamic method invocation from the URL
                      允許動態方法調用

          struts.freemarker.manager.classname
                    The org.apache.struts2.views.freemarker.FreemarkerManager implementation class
                     org.apache.struts2.views.freemarker.FreemarkerManager接口名

          struts.i18n.encoding
                    The encoding to use for localization messages
                     國際化信息內碼

          struts.i18n.reload
                    Whether the localization messages should automatically be reloaded
                     是否國際化信息自動加載

          struts.locale
                    The default locale for the Struts application
                     默認的國際化地區信息

          struts.mapper.class
                    The org.apache.struts2.dispatcher.mapper.ActionMapper implementation class
                      org.apache.struts2.dispatcher.mapper.ActionMapper接口

          struts.multipart.maxSize
                    The maximize size of a multipart request (file upload)
                     multipart請求信息的最大尺寸(文件上傳用)

          struts.multipart.parser
                    The org.apache.struts2.dispatcher.multipart.MultiPartRequest parser implementation for a multipart request (file upload)
                    專為multipart請求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口(文件上傳用)


          struts.multipart.saveDir
                    The directory to use for storing uploaded files
                     設置存儲上傳文件的目錄夾

          struts.objectFactory
                    The com.opensymphony.xwork2.ObjectFactory implementation class
                     com.opensymphony.xwork2.ObjectFactory接口(spring)

          struts.objectFactory.spring.autoWire
                    Whether Spring should autoWire or not
                     是否自動綁定Spring

          struts.objectFactory.spring.useClassCache
                    Whether Spring should use its class cache or not
                     是否spring應該使用自身的cache

          struts.objectTypeDeterminer
                    The com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation class
                      com.opensymphony.xwork2.util.ObjectTypeDeterminer接口

          struts.serve.static.browserCache
                    If static content served by the Struts filter should set browser caching header properties or not
                     是否struts過濾器中提供的靜態內容應該被瀏覽器緩存在頭部屬性中

          struts.serve.static
                    Whether the Struts filter should serve static content or not
                     是否struts過濾器應該提供靜態內容

          struts.tag.altSyntax
                    Whether to use the alterative syntax for the tags or not
                     是否可以用替代的語法替代tags

          struts.ui.templateDir
                    The directory containing UI templates
                     UI templates的目錄夾

          struts.ui.theme
                    The default UI template theme
                     默認的UI template主題

          struts.url.http.port
                    The HTTP port used by Struts URLs
                     設置http端口

          struts.url.https.port
                    The HTTPS port used by Struts URLs
                     設置https端口

          struts.url.includeParams
                    The default includeParams method to generate Struts URLs
                    在url中產生 默認的includeParams


          struts.velocity.configfile
                    The Velocity configuration file path
                     velocity配置文件路徑

          struts.velocity.contexts
                    List of Velocity context names
                     velocity的context列表


          struts.velocity.manager.classname
                    org.apache.struts2.views.velocity.VelocityManager implementation class
                     org.apache.struts2.views.velocity.VelocityManager接口名

          struts.velocity.toolboxlocation
                    The location of the Velocity toolbox
                     velocity工具盒的位置
          struts.xslt.nocache
                    Whether or not XSLT templates should not be cached
                     是否XSLT模版應該被緩存

          struts.serve.static.browserCache 該屬性設置瀏覽器是否緩存靜態內容。當應用處于開發階段時,我們希望每次請求都獲得服務器的最新響應,則可設置該屬性為false。

          struts.enable.DynamicMethodInvocation 該屬性設置Struts 2是否支持動態方法調用,該屬性的默認值是true。如果需要關閉動態方法調用,則可設置該屬性為false。

          struts.enable.SlashesInActionNames 該屬性設置Struts 2是否允許在Action名中使用斜線,該屬性的默認值是false。如果開發者希望允許在Action名中使用斜線,則可設置該屬性為true。

          struts.tag.altSyntax 該屬性指定是否允許在Struts 2標簽中使用表達式語法,因為通常都需要在標簽中使用表達式語法,故此屬性應該設置為true,該屬性的默認值是true。

          struts.devMode該屬性設置Struts 2應用是否使用開發模式。如果設置該屬性為true,則可以在應用出錯時顯示更多、更友好的出錯提示。該屬性只接受true和flase兩個值,該屬性的默認值是false。通常,應用在開發階段,將該屬性設置為true,當進入產品發布階段后,則該屬性設置為false。

          struts.i18n.reload該屬性設置是否每次HTTP請求到達時,系統都重新加載資源文件。該屬性默認值是false。在開發階段將該屬性設置為true會更有利于開發,但在產品發布階段應將該屬性設置為false。

          提示 開發階段將該屬性設置了true,將可以在每次請求時都重新加載國際化資源文件,從而可以讓開發者看到實時開發效果;產品發布階段應該將該屬性設置為false,是為了提供響應性能,每次請求都需要重新加載資源文件會大大降低應用的性能。

          struts.ui.theme該屬性指定視圖標簽默認的視圖主題,該屬性的默認值是xhtml。

          struts.ui.templateDir該屬性指定視圖主題所需要模板文件的位置,該屬性的默認值是template,即默認加載template路徑下的模板文件。

          struts.ui.templateSuffix該屬性指定模板文件的后綴,該屬性的默認屬性值是ftl。該屬性還允許使用ftl、vm或jsp,分別對應FreeMarker、Velocity和JSP模板。

          struts.configuration.xml.reload該屬性設置當struts.xml文件改變后,系統是否自動重新加載該文件。該屬性的默認值是false。

          struts.velocity.configfile該屬性指定Velocity框架所需的velocity.properties文件的位置。該屬性的默認值為velocity.properties。

          struts.velocity.contexts該屬性指定Velocity框架的Context位置,如果該框架有多個Context,則多個Context之間以英文逗號(,)隔開。

          struts.velocity.toolboxlocation該屬性指定Velocity框架的toolbox的位置。

          struts.url.http.port該屬性指定Web應用所在的監聽端口。該屬性通常沒有太大的用戶,只是當Struts 2需要生成URL時(例如Url標簽),該屬性才提供Web應用的默認端口。

          struts.url.https.port該屬性類似于struts.url.http.port屬性的作用,區別是該屬性指定的是Web應用的加密服務端口。

          struts.url.includeParams該屬性指定Struts 2生成URL時是否包含請求參數。該屬性接受none、get和all三個屬性值,分別對應于不包含、僅包含GET類型請求參數和包含全部請求參數。


          struts.custom.i18n.resources該屬性指定Struts 2應用所需要的國際化資源文件,如果有多份國際化資源文件,則多個資源文件的文件名以英文逗號(,)隔開。


          struts.dispatcher.parametersWorkaround 對于某些Java EE服務器,不支持HttpServlet Request調用getParameterMap()方法,此時可以設置該屬性值為true來解決該問題。該屬性的默認值是false。對于 WebLogic、Orion和OC4J服務器,通常應該設置該屬性為true。

          struts.freemarker.manager.classname 該屬性指定Struts 2使用的FreeMarker管理器。該屬性的默認值是 org.apache.struts2.views.freemarker.FreemarkerManager,這是Struts 2內建的FreeMarker管理器。

          struts.freemarker.wrapper.altMap該屬性只支持true和false兩個屬性值,默認值是true。通常無需修改該屬性值。

          struts.xslt.nocache 該屬性指定XSLT Result是否使用樣式表緩存。當應用處于開發階段時,該屬性通常被設置為true;當應用處于產品使用階段時,該屬性通常被設置為false。

          struts.configuration.files 該屬性指定Struts 2框架默認加載的配置文件,如果需要指定默認加載多個配置文件,則多個配置文件的文件名之間以英文逗號(,)隔開。該屬性的默認值為struts- default.xml,struts-plugin.xml,struts.xml,看到該屬性值,讀者應該明白為什么Struts 2框架默認加載struts.xml文件了。
          posted @ 2009-10-28 12:42 shiwf 閱讀(246) | 評論 (0)編輯 收藏
           

          用過struts1.x的人都知道,標簽庫有html、bean、logic、tiles,
          而struts2.0里的標簽卻沒有分類,只用在jsp頭文件加上
          <%@ taglib prefix="s" uri="/struts-tags" %>
          就能使用struts2.0的標簽庫

          下面就介紹下每個標簽的用法(有錯請指正):

          A:
          <s:a href=""></s:a>-----超鏈接,類似于html里的<a></a>
          <s:action name=""></s:action>-----執行一個view里面的一個action
          <s:actionerror/>-----如果action的errors有值那么顯示出來
          <s:actionmessage/>-----如果action的message有值那么顯示出來
          <s:append></s:append>-----添加一個值到list,類似于list.add();
          <s:autocompleter></s:autocompleter>-----自動完成<s:combobox>標簽的內容,這個是ajax

          B:
          <s:bean name=""></s:bean>-----類似于struts1.x中的,JavaBean的值

          C:
          <s:checkbox></s:checkbox>-----復選框
          <s:checkboxlist list=""></s:checkboxlist>-----多選框
          <s:combobox list=""></s:combobox>-----下拉框
          <s:component></s:component>-----圖像符號

          D:
          <s:date/>-----獲取日期格式
          <s:datetimepicker></s:datetimepicker>-----日期輸入框
          <s:debug></s:debug>-----顯示錯誤信息
          <s:div></s:div>-----表示一個塊,類似于html的<div></div>
          <s:doubleselect list="" doubleName="" doubleList=""></s:doubleselect>-----雙下拉框

          E:
          <s:if test=""></s:if>
          <s:elseif test=""></s:elseif>
          <s:else></s:else>-----這3個標簽一起使用,表示條件判斷

          F:
          <s:fielderror></s:fielderror>-----顯示文件錯誤信息
          <s:file></s:file>-----文件上傳
          <s:form action=""></s:form>-----獲取相應form的值

          G:
          <s:generator separator="" val=""></s:generator>----和<s:iterator>標簽一起使用

          H:
          <s:head/>-----在<head></head>里使用,表示頭文件結束
          <s:hidden></s:hidden>-----隱藏值

          I:
          <s:i18n name=""></s:i18n>-----加載資源包到值堆棧
          <s:include value=""></s:include>-----包含一個輸出,servlet或jsp頁面
          <s:inputtransferselect list=""></s:inputtransferselect>-----獲取form的一個輸入
          <s:iterator></s:iterator>-----用于遍歷集合

          L:
          <s:label></s:label>-----只讀的標簽

          M:
          <s:merge></s:merge>-----合并遍歷集合出來的值

          O:
          <s:optgroup></s:optgroup>-----獲取標簽組
          <s:optiontransferselect doubleList="" list="" doubleName=""></s:optiontransferselect>-----左右選擇框

          P:
          <s:param></s:param>-----為其他標簽提供參數
          <s:password></s:password>-----密碼輸入框
          <s:property/>-----得到'value'的屬性
          <s:push value=""></s:push>-----value的值push到棧中,從而使property標簽的能夠獲取value的屬性

          R:
          <s:radio list=""></s:radio>-----單選按鈕
          <s:reset></s:reset>-----重置按鈕


          S:
          <s:select list=""></s:select>-----單選框
          <s:set name=""></s:set>-----賦予變量一個特定范圍內的值
          <s:sort comparator=""></s:sort>-----通過屬性給list分類
          <s:submit></s:submit>-----提交按鈕
          <s:subset></s:subset>-----為遍歷集合輸出子集

          T:
          <s:tabbedPanel id=""></s:tabbedPanel>-----表格框
          <s:table></s:table>-----表格
          <s:text name=""></s:text>-----I18n文本信息
          <s:textarea></s:textarea>-----文本域輸入框
          <s:textfield></s:textfield>-----文本輸入框
          <s:token></s:token>-----攔截器
          <s:tree></s:tree>-----樹
          <s:treenode label=""></s:treenode>-----樹的結構

          U:
          <s:updownselect list=""></s:updownselect>-----多選擇框
          <s:url></s:url>-----創建url
          posted @ 2009-10-28 12:03 shiwf 閱讀(288) | 評論 (0)編輯 收藏
           
          一、簡介
          1.1、概述
          隨著WEB2.0及ajax思想在互聯網上的快速發展傳播,陸續出現了一些優秀的Js框架,其中比較著名的有Prototype、YUI、jQuery、mootools、Bindows以及國內的JSVM框架等,通過將這些JS框架應用到我們的項目中能夠使程序員從設計和書寫繁雜的JS應用中解脫出來,將關注點轉向功能需求而非實現細節上,從而提高項目的開發速度。
          jQuery是繼prototype之后的又一個優秀的Javascript框架。它是由 John Resig 于 2006 年初創建的,它有助于簡化 JavaScript™ 以及Ajax 編程。有人使用這樣的一比喻來比較prototype和jQuery:prototype就像Java,而jQuery就像ruby. 它是一個簡潔快速靈活的JavaScript框架,它能讓你在你的網頁上簡單的操作文檔、處理事件、實現特效并為Web頁面添加Ajax交互。

          它具有如下一些特點:
          1、代碼簡練、語義易懂、學習快速、文檔豐富。
          2、jQuery是一個輕量級的腳本,其代碼非常小巧,最新版的JavaScript包只有20K左右。
          3、jQuery支持CSS1-CSS3,以及基本的xPath。
          4、jQuery是跨瀏覽器的,它支持的瀏覽器包括IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+。
          5、可以很容易的為jQuery擴展其他功能。
          6、能將JS代碼和HTML代碼完全分離,便于代碼和維護和修改。
          7、插件豐富,除了jQuery本身帶有的一些特效外,可以通過插件實現更多功能,如表單驗證、tab導航、拖放效果、表格排序、DataGrid,樹形菜單、圖像特效以及ajax上傳等。

          jQuery的設計會改變你寫JavaScript代碼的方式,降低你學習使用JS操作網頁的復雜度,提高網頁JS開發效率,無論對于js初學者還是資深專家,jQuery都將是您的首選。
          jQuery適合于設計師、開發者以及那些還好者,同樣適合用于商業開發,可以說jQuery適合任何JavaScript應用的地方,可用于不同的Web應用程序中。
          官方站點:http://jquery.com/  中文站點:http://jquery.org.cn/

          1.2、目的
          通過學習本文檔,能夠對jQuery有一個簡單的認識了解,清楚JQuery與其他JS框架的不同,掌握jQuery的常用語法、使用技巧及注意事項。

          二、使用方法
          在需要使用JQuery的頁面中引入JQuery的js文件即可。
          例如:<script type="text/javascript" src="js/jquery.js"></script>
          引入之后便可在頁面的任意地方使用jQuery提供的語法。

          三、學習教程及參考資料
          請參照《jQuery中文API手冊》和http://jquery.org.cn/visual/cn/index.xml
          推薦兩篇不錯的jquery教程:《jQuery的起點教程》和《使用 jQuery 簡化 Ajax 開發》
          (說明:以上文檔都放在了【附件】中)

          四、語法總結和注意事項
          1、關于頁面元素的引用
          通過jquery的$()引用元素包括通過id、class、元素名以及元素的層級關系及dom或者xpath條件等方法,且返回的對象為jquery對象(集合對象),不能直接調用dom定義的方法。

          2、jQuery對象與dom對象的轉換
          只有jquery對象才能使用jquery定義的方法。注意dom對象和jquery對象是有區別的,調用方法時要注意操作的是dom對象還是jquery對象。
          普通的dom對象一般可以通過$()轉換成jquery對象。
          如:$(document.getElementById("msg"))則為jquery對象,可以使用jquery的方法。
          由于jquery對象本身是一個集合。所以如果jquery對象要轉換為dom對象則必須取出其中的某一項,一般可通過索引取出。
          如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]這些都是dom對象,可以使用dom中的方法,但不能再使用Jquery的方法。
          以下幾種寫法都是正確的:
          $("#msg").html();
          $("#msg")[0].innerHTML;
          $("#msg").eq(0)[0].innerHTML;
          $("#msg").get(0).innerHTML;

          3、如何獲取jQuery集合的某一項
          對于獲取的元素集合,獲取其中的某一項(通過索引指定)可以使用eq或get(n)方法或者索引號獲取,要注意,eq返回的是jquery對象,而get (n)和索引返回的是dom元素對象。對于jquery對象只能使用jquery的方法,而dom對象只能使用dom的方法,如要獲取第三個< div>元素的內容。有如下兩種方法:
          $("div").eq(2).html();              //調用jquery對象的方法
          $("div").get(2).innerHTML;       //調用dom的方法屬性

          4、同一函數實現set和get
          Jquery中的很多方法都是如此,主要包括如下幾個:
          $("#msg").html();              //返回id為msg的元素節點的html內容。
          $("#msg").html("<b>new content</b>");      
          //將“<b>new content</b>” 作為html串寫入id為msg的元素節點內容中,頁面顯示粗體的new content

          $("#msg").text();              //返回id為msg的元素節點的文本內容。
          $("#msg").text("<b>new content</b>");      
          //將“<b>new content</b>” 作為普通文本串寫入id為msg的元素節點內容中,頁面顯示粗體的<b>new content</b>

          $("#msg").height();              //返回id為msg的元素的高度
          $("#msg").height("300");       //將id為msg的元素的高度設為300
          $("#msg").width();              //返回id為msg的元素的寬度
          $("#msg").width("300");       //將id為msg的元素的寬度設為300

          $("input").val(");       //返回表單輸入框的value值
          $("input").val("test");       //將表單輸入框的value值設為test

          $("#msg").click();       //觸發id為msg的元素的單擊事件
          $("#msg").click(fn);       //為id為msg的元素單擊事件添加函數
          同樣blur,focus,select,submit事件都可以有著兩種調用方法

          5、集合處理功能
          對于jquery返回的集合內容無需我們自己循環遍歷并對每個對象分別做處理,jquery已經為我們提供的很方便的方法進行集合的處理。
          包括兩種形式:
          $("p").each(function(i){this.style.color=['#f00','#0f0','#00f']})      
          //為索引分別為0,1,2的p元素分別設定不同的字體顏色。

          $("tr").each(function(i){this.style.backgroundColor=['#ccc','#fff'][i%2]})      
          //實現表格的隔行換色效果

          $("p").click(function(){.html())})              
          //為每個p元素增加了click事件,單擊某個p元素則彈出其內容

          6、擴展我們需要的功能
          $.extend({
                 min: function(a, b){return a < b?a:b; },
                 max: function(a, b){return a > b?a:b; }
          });       //為jquery擴展了min,max兩個方法
          使用擴展的方法(通過“$.方法名”調用):
          +",min="+$.min(10,20));

          7、支持方法的連寫
          所謂連寫,即可以對一個jquery對象連續調用各種不同的方法。
          例如:
          $("p").click(function(){.html())})
          .mouseover(function(){})
          .each(function(i){this.style.color=['#f00','#0f0','#00f']});

          8、操作元素的樣式
          主要包括以下幾種方式:
          $("#msg").css("background");              //返回元素的背景顏色
          $("#msg").css("background","#ccc")       //設定元素背景為灰色
          $("#msg").height(300); $("#msg").width("200");       //設定寬高
          $("#msg").css({ color: "red", background: "blue" });//以名值對的形式設定樣式
          $("#msg").addClass("select");       //為元素增加名稱為select的class
          $("#msg").removeClass("select");       //刪除元素名稱為select的class
          $("#msg").toggleClass("select");       //如果存在(不存在)就刪除(添加)名稱為select的class

          9、完善的事件處理功能
          Jquery已經為我們提供了各種事件處理方法,我們無需在html元素上直接寫事件,而可以直接為通過jquery獲取的對象添加事件。
          如:
          $("#msg").click(function(){})       //為元素添加了單擊事件
          $("p").click(function(i){this.style.color=['#f00','#0f0','#00f']})
          //為三個不同的p元素單擊事件分別設定不同的處理
          jQuery中幾個自定義的事件:
          (1)hover(fn1,fn2):一個模仿懸停事件(鼠標移動到一個對象上面及移出這個對象)的方法。當鼠標移動到一個匹配的元素上面時,會觸發指定的第一個函數。當鼠標移出這個元素時,會觸發指定的第二個函數。
          //當鼠標放在表格的某行上時將class置為over,離開時置為out。
          $("tr").hover(function(){
          $(this).addClass("over");
          },
                 function(){
                 $(this).addClass("out");
          });
          (2)ready(fn):當DOM載入就緒可以查詢及操縱時綁定一個要執行的函數。
          $(document).ready(function(){})
          //頁面加載完畢提示“Load Success”,相當于onload事件。與$(fn)等價
          (3)toggle(evenFn,oddFn): 每次點擊時切換要調用的函數。如果點擊了一個匹配的元素,則觸發指定的第一個函數,當再次點擊同一元素時,則觸發指定的第二個函數。隨后的每次點擊都重復對這兩個函數的輪番調用。
                 //每次點擊時輪換添加和刪除名為selected的class。
                 $("p").toggle(function(){
                        $(this).addClass("selected");   
                 },function(){
                        $(this).removeClass("selected");
                 });
          (4)trigger(eventtype): 在每一個匹配的元素上觸發某類事件。
          例如:
                 $("p").trigger("click");              //觸發所有p元素的click事件
          (5)bind(eventtype,fn),unbind(eventtype): 事件的綁定與反綁定
          從每一個匹配的元素中(添加)刪除綁定的事件。
          例如:
          $("p").bind("click", function(){.text());});       //為每個p元素添加單擊事件
          $("p").unbind();       //刪除所有p元素上的所有事件
          $("p").unbind("click")       //刪除所有p元素上的單擊事件

          10、幾個實用特效功能
          其中toggle()和slidetoggle()方法提供了狀態切換功能。
          如toggle()方法包括了hide()和show()方法。
          slideToggle()方法包括了slideDown()和slideUp方法。

          11、幾個有用的jQuery方法
          $.browser.瀏覽器類型:檢測瀏覽器類型。有效參數:safari, opera, msie, mozilla。如檢測是否ie:$.browser.isie,是ie瀏覽器則返回true。
          $.each(obj, fn):通用的迭代函數??捎糜诮频氐鷮ο蠛蛿到M(代替循環)。

          $.each( [0,1,2], function(i, n){ ; });
          等價于:
          var tempArr=[0,1,2];
          for(var i=0;i<tempArr.length;i++){
                 ;
          }
          也可以處理json數據,如
          $.each( { name: "John", lang: "JS" }, function(i, n){ ; });
          結果為:
          Name:name, Value:John
          Name:lang, Value:JS
          $.extend(target,prop1,propN):用一個或多個其他對象來擴展一個對象,返回這個被擴展的對象。這是jquery實現的繼承方式。
          如:
          $.extend(settings, options);      
          //合并settings和options,并將合并結果返回settings中,相當于options繼承setting并將繼承結果保存在setting中。
          var settings = $.extend({}, defaults, options);
          //合并defaults和options,并將合并結果返回到setting中而不覆蓋default內容。
          可以有多個參數(合并多項并返回)
          $.map(array, fn):數組映射。把一個數組中的項目(處理轉換后)保存到到另一個新數組中,并返回生成的新數組。
          如:
          var tempArr=$.map( [0,1,2], function(i){ return i + 4; });
          tempArr內容為:[4,5,6]
          var tempArr=$.map( [0,1,2], function(i){ return i > 0 ? i + 1 : null; });
          tempArr內容為:[2,3]
          $.merge(arr1,arr2):合并兩個數組并刪除其中重復的項目。
          如:$.merge( [0,1,2], [2,3,4] )       //返回[0,1,2,3,4]
          $.trim(str):刪除字符串兩端的空白字符。
          如:$.trim("  hello, how are you?   ");        //返回"hello,how are you? "

          12、解決自定義方法或其他類庫與jQuery的沖突
          很多時候我們自己定義了$(id)方法來獲取一個元素,或者其他的一些js類庫如prototype也都定義了$方法,如果同時把這些內容放在一起就會引起變量方法定義沖突,Jquery對此專門提供了方法用于解決此問題。
          使用jquery中的jQuery.noConflict();方法即可把變量$的控制權讓渡給第一個實現它的那個庫或之前自定義的$方法。之后應用 Jquery的時候只要將所有的$換成jQuery即可,如原來引用對象方法$("#msg")改為jQuery("#msg")。
          如:
          jQuery.noConflict();
          // 開始使用jQuery
          jQuery("div   p").hide();
          // 使用其他庫的 $()
          $("content").style.display = 'none';
          posted @ 2009-10-28 10:40 shiwf 閱讀(237) | 評論 (0)編輯 收藏
           

          一、SiteMesh項目簡介 (http://www.opensymphony.com/sitemesh/
                OS(OpenSymphony)的SiteMesh是一個用來在JSP中實現頁面布局和裝飾(layout and decoration)的框架組件,能夠幫助網站開發人員較容易實現頁面中動態內容和靜態裝飾外觀的分離。

                 Sitemesh是由一個基于Web頁面布局、裝飾以及與現存Web應用整合的框架。它能幫助我們在由大
          量頁面構成的項目中創建一致的頁面布局和外觀,如一致的導航條,一致的banner,一致的版權,等等。
          它不僅僅能處理動態的內容,如jsp,php,asp等產生的內容,它也能處理靜態的內容,如htm的內容,
          使得它的內容也符合你的頁面結構的要求。甚至于它能將HTML文件象include那樣將該文件作為一個面板
          的形式嵌入到別的文件中去。所有的這些,都是GOF的Decorator模式的最生動的實現。盡管它是由java語言來實現的,但它能與其他Web應用很好地集成。 
                官方:
          http://www.opensymphony.com/sitemesh/ 
                下載地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3;

          二、為什么要使用SiteMesh? 
              我們的團隊開發J2EE應用的時候,經常會碰到一個比較頭疼的問題:由于Web頁面是由不同的人所開發,所以開發出來的界面通常是千奇百怪,通常讓項目管理人員苦笑不得。而實際上,任何一個項目都會要求界面的統一風格和美觀,既然風格統一,那就說明UI層肯定有很多可以抽出來共用的靜態或動態部分;如何整合這些通用的靜態或動態UI呢?Apache Tiles框架站了出來很好的解決了這一問題,再加上他與struts的完美集成,導致大小項目都把他作為UI層的首選框架,但是:Tiles確實有著它很多的不足之處,下文我會介紹,本文想說的是,除了Apache Tiles框架,其實我們還有更好的解 決方案,那就是:SiteMesh;
              本文介紹了一個基于Web頁面的布局、裝飾以及應用整合的框架Sitemesh,它能幫助你為你的應用創建一致的外觀,很好的取代Apache Tiles;

          三、SiteMesh VS Apache Tiles 
               用過struts的朋友應該對Apache Tiles的不會陌生,我曾經有一篇文章介紹過struts中tiles框架的組合與繼承,現在怎么看怎么覺得復雜
                 從使用角度來看,Tiles似乎是Sitemesh標簽<page:applyDecorator>的一個翻版。其實sitemesh最強的一個特性是sitemesh將decorator模式用在過濾器上。任何需要被裝飾的頁面都不知道它要被誰裝飾,所以它就可以用來裝璜來自php、asp、CGI等產生的頁面了。你可以定義若干個裝飾器,根據參數動態地選擇裝飾器,產生動態的外觀以滿足你的需求。它也有一套功能強大的屬性體系,它能幫助你構建功能強大而靈活的裝飾器。相比較而言,在這方面Tiles就遜色許多。 
               個人覺得在團隊開發里面,Apache Tiles框架會導致所有人不僅僅要了解并且清楚Apache Tiles的存在,并且要特別熟悉每一個Tiles layout模板的作用,否則就可能出現用錯模板的情況;除此之外,每個人涉及到的所有WEB頁面都需要去配置文件里面逐個配置,不僅麻煩出錯的幾率還高;而以上所有的不足都是SiteMesh所不存在的。

          四、SiteMesh的基本原理 
                一個請求到服務器后,如果該請求需要sitemesh裝飾,服務器先解釋被請求的資源,然后根據配置文件
          獲得用于該請求的裝飾器,最后用裝飾器裝飾被請求資源,將結果一同返回給客戶端瀏覽器。

          五、如何使用SiteMesh 
                 這里以struts2+spring2+hibernate3構架的系統為例 
                    1、下載SiteMesh 
                        下載地址:http://www.opensymphony.com/sitemesh/download.action 目前的最新版本是Version 2.3;       
                     2、在工程中引入SiteMesh的必要jar包,和struts2-sitemesh-plugin-2.0.8.jar;       
                     3、修改你的web.xml,在里面加入sitemesh的過濾器,示例代碼如下:
                  
          <!-- sitemesh配置 -->
              <filter>
                  <filter-name>sitemesh</filter-name>
                  <filter-class>
                       com.opensymphony.module.sitemesh.filter.PageFilter
                  </filter-class>
              </filter>
              <filter-mapping>
                  <filter-name>sitemesh</filter-name>
                  <url-pattern>/*</url-pattern>
              </filter-mapping> 
                   注意過濾器的位置:應該在struts2的org.apache.struts2.dispatcher.FilterDispatcher過濾器之前org.apache.struts2.dispatcher.ActionContextCleanUp過濾器之后,否則會有問題;

                 4、在下載的SiteMesh包中找到sitemesh.xml,(\sitemesh-2.3\src\example-webapp\WEB-INF目錄下就有)
                  將其拷貝到/WEB-INF目錄下;

                 5、在sitemesh.xml文件中有一個property結點(如下),該結點指定了decorators.xml在工程中的位置,讓sitemesh.xml能找到他; 按照此路徑新建decorators.xml文件,當然這個路徑你可以任意改變,只要property結點的value值與其匹配就行; 
              <property name="decorators-file" value="/WEB-INF/sitemesh/decorators.xml"/> 
              
                6、在WebRoot目錄下新建decorators目錄,并在該目錄下新建一個模板jsp,根據具體項目風格編輯該模板,
                      如下示例:我的模板:main.jsp

          <%@ page language="java" pageEncoding="UTF-8"%>
          <%@taglib prefix="decorator"
               uri="http://www.opensymphony.com/sitemesh/decorator"%>
          <%@taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page"%>
          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <%
               response.setHeader("Pragma", "no-cache");
               response.setHeader("Cache-Control", "no-cache");
               response.setDateHeader("Expires", 0);
          %>
          <html>
              <head>
                  <title><decorator:title default="kangxm test" />
                  </title>
                  <!-- 頁面Head由引用模板的子頁面來替換 -->
                  <decorator:head />
              </head>
              <body id="page-home">
                  <div id="page-total">
                      <div id="page-header">
                          <table width="100%" border="0" cellspacing="0" cellpadding="0">
                              <tr>
                                  <td>
                                      <div class="topFunc">
                                           我的賬戶
                                           |
                                           退出
                                      </div>
                                  </td>
                              </tr>
                          </table>
                      </div>
                  </div>
                  <!-- end header -->
                  <!--   Menu Tag begin -->
                  <div id="page-menu" style="margin-top: 8px; margin-bottom: 8px;">
                      <div>
                           這里放菜單
                      </div>
                  </div>
                  <!--   Menu Tag end -->
                  <div id="page-content" class="clearfix">
                      <center>
                          <table width="100%" border="0" cellpadding="0" cellspacing="0">
                              <tr>
                                  <td>
                                      <decorator:body /><!-- 這里的內容由引用模板的子頁面來替換 -->
                                  </td>
                              </tr>
                          </table>
                      </center>
                  </div>
                  <!-- end content -->
                  <div id="page-footer" class="clearfix">

                       這里放頁面底部
                      <!-- end footer -->
                  </div>
                  <!-- end page -->
              </body>
          </html>


          這就是個簡單的模板,頁面的頭和腳都由模板里的靜態HTML決定了,主頁面區域用的是<decorator:body />標簽;也就是說凡是能進入過濾器的請求生成的頁面都會默認加上模板上的頭和腳,然后頁面自身的內容將自動放到<decorator:body />標簽所在位置;
          <decorator:title default="Welcome to test sitemesh!" />:讀取被裝飾頁面的標題,并給出了默認標題。
          <decorator:head />:讀取被裝飾頁面的<head>中的內容;
          <decorator:body />:讀取被裝飾頁面的<body>中的內容;

                7、說到這里大家就要想了,那如果某個特殊的需求請求路徑在過濾器的范圍內,但又不想使用模板怎么辦? 你總不能這么不講道理吧!大家放心吧,SiteMesh早就考慮到這一點了,上面第5步說道的decorators.xml這個時候就起到作用了!
                 
          下面是我的decorators.xml:
          <?xml version="1.0" encoding="ISO-8859-1"?>
          <decorators defaultdir="/decorators">
              <!-- Any urls that are excluded will never be decorated by Sitemesh -->
              <excludes>
                  <pattern>/index.jsp*</pattern>
                    <pattern>/login/*</pattern>
              </excludes>
              <decorator name="main" page="main.jsp">
                  <pattern>/*</pattern>
              </decorator>
          </decorators>

          decorators.xml有兩個主要的結點:
                 decorator結點指定了模板的位置和文件名,通過pattern來指定哪些路徑引用哪個模板
                 excludes結點則指定了哪些路徑的請求不使用任何模板
          如上面代碼,/index.jsp和凡是以/login/開頭的請求路徑一律不使用模板;
          另外還有一點要注意的是:decorators結點的defaultdir屬性指定了模板文件存放的目錄;

          六、實戰感受 
                剛剛做完一個用到sitemesh的項目,跟以前用tiles框架相比,最大的感受就是簡單,系統設計階段
          就把模板文件和sitemesh框架搭好了!哪些頁面使用框架哪些不使用,全部都通過UI Demo很快就定義出來了;
          在接下來的開發中所有成員幾乎感受不到sitemesh的存在,各自僅僅關心自己的模塊功能實現;

          七、總結 
              使用sitemesh給我們帶來的是不僅僅是頁面結構問題,它的出現讓我們有更多的時間去關注底層業務
          邏輯,而不是整個頁面的風格和結構。它讓我們擺脫了大量用include方式復用頁面尷尬局面,也避免了tiles
          框架在團隊開發中的復雜度,它還提供了很大的靈活性以及給我們提供了整合異構Web系統頁面的一種方案


          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/it_man/archive/2009/01/17/3817347.aspx

          posted @ 2009-10-27 15:47 shiwf 閱讀(1323) | 評論 (0)編輯 收藏
           
          1.什么是模式?
              模式,即pattern。其實就是解決某一類問題的方法論。你把解決某類問題的方法總結歸納到理論高度,那就是模式。

              Alexander給出的經典定義是:每個模式都描述了一個在我們的環境中不斷出現的問題,然后描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重復相同的工作。

              模式有不同的領域,建筑領域有建筑模式,軟件設計領域也有設計模式。當一個領域逐漸成熟的時候,自然會出現很多模式。

          2.什么是框架?
          框架,即framework。其實就是某種應用的半成品,就是一組組件,供你選用完成你自己的系統。簡單說就是使用別人搭好的舞臺,你來做表演。而且,框架一般是成熟的,不斷升級的軟件。

          3.為什么要用模式?
          因為模式是一種指導,在一個良好的指導下,有助于你完成任務,有助于你作出一個優良的設計方案,達到事半功倍的效果。而且會得到解決問題的最佳辦法。

          4.為什么要用框架?
          因為軟件系統發展到今天已經很復雜了,特別是服務器端軟件,設計到的知識,內容,問題太多。在某些方面使用別人成熟的框架,就相當于讓別人幫你完成一些基礎工作,你只需要集中精力完成系統的業務邏輯設計。而且框架一般是成熟,穩健的,他可以處理系統很多細節問題,比如,事物處理,安全性,數據流控制等問題。還有框架一般都經過很多人使用,所以結構很好,所以擴展性也很好,而且它是不斷升級的,你可以直接享受別人升級代碼帶來的好處。
          框架一般處在低層應用平臺(如J2EE)和高層業務邏輯之間的中間層。

          軟件為什么要分層?
          為了實現“高內聚、低耦合”。把問題劃分開來各個解決,易于控制,易于延展,易于分配資源…總之好處很多啦:)。

          5.以下所述主要是JAVA,J2EE方面的模式和框架:
          常見的設計模式有什么?
          首先,你要了解的是GOF的《設計模式--可復用面向對象軟件的基礎》一書(這個可以說是程序員必備的了),注意:GOF不是一個人,而是指四個人。它的原意是Gangs Of Four,就是“四人幫”,就是指此書的四個作者:Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides。這本書講了23種主要的模式,包括:抽象工廠、適配器、外觀模式等。
          還有其他的很多模式,估計有100多種。

          軟件設計模式太多,就我的理解簡單說一下最常見的MVC模式。
          MVC模式是1996年由Buschmann提出的:
          模型(Model):就是封裝數據和所有基于對這些數據的操作。
          視圖(View):就是封裝的是對數據顯示,即用戶界面。
          控制器(Control):就是封裝外界作用于模型的操作和對數據流向的控制等。

              另外:
          RUP(Rational Unified Process)軟件統一過程,XP(Extreme Programming)極端編程,這些通常被叫做“過程方法”,是一種軟件項目實施過程的方法論,它是針對軟件項目的實施過程提出的方法策略。也是另一個角度的模式。

          posted @ 2009-10-27 11:22 shiwf 閱讀(196) | 評論 (0)編輯 收藏
           
          一. UML簡介( http://www.aygfsteel.com/jelver/articles/35894.html
                 
            UML(統一建模語言,Unified Modeling Language)是一種定義良好、易于表達、功能強大且普遍適用的可視化建模語言。它融入了軟件工程領域的新思想、新方法和新技術。它的作用域不限于支持面向對象的分析與設計,還支持從需求分析開始的軟件開發的全過程。在系統分析階段,我們一般用UML來畫很多圖,主要包括用例圖、狀態圖、類圖、活動圖、序列圖、協作圖、構建圖、配置圖等等,要畫哪些圖要根據具體情況而定。其實簡單的理解,也是個人的理解,UML的作用就是用很多圖從靜態和動態方面來全面描述我們將要開發的系統。

            二. 用例建模簡介

            用例建模是UML建模的一部分,在我眼里,它也是UML里最基礎的部分。用例建模的最主要功能就是用來表達系統的功能性需求或行為。

            依我的理解用例建??煞譃橛美龍D和用例描述。用例圖由參與者(Actor)、用例(Use Case)、系統邊界、箭頭組成,用畫圖的方法來完成。用例描述用來詳細描述用例圖中每個用例,用文本文檔來完成。

            1. 用例圖

            參與者不是特指人,是指系統以外的,在使用系統或與系統交互中所扮演的角色。因此參與者可以是人,可以是事物,也可以是時間或其他系統等等。還有一點要注意的是,參與者不是指人或事物本身,而是表示人或事物當時所扮演的角色。比如小明是圖書館的管理員,他參與圖書館管理系統的交互,這時他既可以作為管理員這個角色參與管理,也可以作為借書者向圖書館借書,在這里小明扮演了兩個角色,是兩個不同的參與者。參與者在畫圖中用簡筆人物畫來表示,人物下面附上參與者的名稱。



            用例是對包括變量在內的一組動作序列的描述,系統執行這些動作,并產生傳遞特定參與者的價值的可觀察結果。這是UML對用例的正式定義,對我們初學者可能有點難懂。我們可以這樣去理解,用例是參與者想要系統做的事情。對于對用例的命名,我們可以給用例取一個簡單、描述性的名稱,一般為帶有動作性的詞。用例在畫圖中用橢圓來表示,橢圓下面附上用例的名稱。



            系統邊界是用來表示正在建模系統的邊界。邊界內表示系統的組成部分,邊界外表示系統外部。系統邊界在畫圖中方框來表示,同時附上系統的名稱,參與者畫在邊界的外面,用例畫在邊界里面。因為系統邊界的作用有時候不是很明顯,所以我個人理解,在畫圖時可省略。

            箭頭用來表示參與者和系統通過相互發送信號或消息進行交互的關聯關系。箭頭尾部用來表示啟動交互的一方,箭頭頭部用來表示被啟動的一方,其中用例總是要由參與者來啟動。

            2. 用例描述

            用例圖只是簡單地用圖描述了一下系統,但對于每個用例,我們還需要有詳細的說明,這樣就可以讓別人對這個系統有一個更加詳細的了解,這時我們就需要寫用例描述。

            對于用例描述的內容,一般沒有硬性規定的格式,但一些必須或者重要的內容還是必須要寫進用例描述里面的。用例描述一般包括:簡要描述(說明)、前置(前提)條件、基本事件流、其他事件流、異常事件流、后置(事后)條件等等。下面說說各個部分的意思:

            簡要描述:對用例的角色、目的的簡要描述;

            前置條件:執行用例之前系統必須要處于的狀態,或者要滿足的條件;

            基本事件流:描述該用例的基本流程,指每個流程都“正常”運作時所發生的事情,沒有任何備選流和異常流,而只有最有可能發生的事件流;

            其他事件流:表示這個行為或流程是可選的或備選的,并不是總要總要執行它們;

            異常事件流:表示發生了某些非正常的事情所要執行的流程;

            后置條件:用例一旦執行后系統所處的狀態;



          UML的作用就是用很多圖從靜態和動態方面來全面描述我們將要開發的系統

          三. 用例圖和用例描述設計實例

            這里用我開發的一個家教網站來簡單的分析用例圖的畫法和用例描述的寫法。這個網站我用UML完整的分析一下,以下我提取了用例圖和用例描述的部分。這個家教網站分為前臺客戶系統和后臺管理系統。

            前臺客戶系統的用例圖如下:



            后臺管理系統用例圖如下:



            對于用例描述,篇幅有限,我在這里只列了后臺管理系統中的網站公告發布這個用例的描述。如下:

          用例名稱:網站公告發布
          用例標識號:202
          參與者:負責人
          簡要說明:
            負責人用來填寫和修改家教網站首頁的公告,公告最終顯示在家教網站的首頁上。
          前置條件:
            負責人已經登陸家教網站管理系統
          基本事件流:
           1. 負責人鼠標點擊“修改公告”按鈕
           2. 系統出現一個文本框,顯示著原來的公告內容
           3. 負責人可以在文本框上修改公告,也可以完全刪除,重新寫新的公告
           4. 負責人編輯完文本框,按“提交”按鈕,首頁公告就被修改
           5. 用例終止
          其他事件流A1:
           在按“提交”按鈕之前,負責人隨時可以按“返回”按鈕,文本框的任何修改內容都不會影響網站首頁的公告
          異常事件流:
           1. 提示錯誤信息,負責人確認
           2. 返回到管理系統主頁面
          后置條件:
           網站首頁的公告信息被修改
          注釋:無

          posted @ 2009-10-26 17:59 shiwf 閱讀(177) | 評論 (0)編輯 收藏
          僅列出標題
          共4頁: 上一頁 1 2 3 4 下一頁 
           
          Copyright © shiwf Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 和田县| 泰来县| 桦南县| 武汉市| 寿阳县| 宿迁市| 吉木萨尔县| 眉山市| 洱源县| 新河县| 万载县| 洪雅县| 建水县| 云林县| 伊金霍洛旗| 株洲市| 驻马店市| 宁津县| 沂源县| 九江市| 黄石市| 建宁县| 张北县| 仁布县| 漳浦县| 岳普湖县| 双流县| 兴和县| 全州县| 内丘县| 青阳县| 贵港市| 高邑县| 嘉祥县| 阳原县| 永春县| 宜黄县| 淮北市| 惠来县| 即墨市| 莲花县|