千里馬

          天馬行空

          struts的一些總結(jié)

          1,使用框架進(jìn)行程序開發(fā)的意義在于:框架本身包含了各種思想,這些思想是前人為開發(fā)人員總結(jié)的,他們往往具有開發(fā)效率高、易維護(hù)、是程序開發(fā)更簡單的特點。Struts實現(xiàn)MVC的思想,Hibernate實現(xiàn)了對象 與關(guān)系映射的思想,Sping則是依賴注入和面向切面編程的思想,他們都是全世界開發(fā)者智慧的結(jié)晶。也是眾多框架中的佼佼者。
          2,MVC模式:
            在java web開發(fā)中有兩種普遍的開發(fā)模式(模式1和模式2),模式1使用jsp+javabean技術(shù)將頁面顯示和業(yè)務(wù)邏輯分開,有jsp實現(xiàn)頁面 的顯示,javabean對象用來保存數(shù)據(jù)和實現(xiàn)業(yè)務(wù)邏輯。客戶端直接向jsp發(fā)出請求,jsp作出相應(yīng)響應(yīng),并調(diào)用javabean對象,所有的數(shù)據(jù)都通過javabean來處理,然后再返回jsp,有jsp生成最后的返回結(jié)果。
            在模型1中,jsp往往會嵌入控制請求流程的代碼和部分邏輯代碼,如果把這部分代碼提取出來,有一個單獨的較色來承擔(dān)(該較色也就是控制器),則此時就構(gòu)成了模型2,。模型2就符合了MVC的設(shè)計模式,即模型-視圖-控制器的模式。
          3,MVC框架的web應(yīng)用程序被分割成若干邏輯部件,使程序開發(fā)變得更加容易。它把各種對象按照功能的不同分割成了3部分,主要目的就是將各種對象的耦合度降到最低。被分割的3部分是模型、視圖、控制器。
             模型:代表了應(yīng)用程序的數(shù)據(jù)和處理這些數(shù)據(jù)的規(guī)則。當(dāng)模型發(fā)生變化時,他會通知視圖,并為視圖提供查詢模型相關(guān)狀態(tài)的能力。
            視圖:用來組織模型的內(nèi)容,他從模型那里獲得數(shù)據(jù),然后展現(xiàn)給用戶,這較色往往有jsp承擔(dān)。
            控制器:負(fù)責(zé)從客戶端接受請求,并把這些請求轉(zhuǎn)換成某種行為,這些行為往往有模型來實現(xiàn),這些行為完成以后,在選擇一個視圖呈現(xiàn)給用戶。
            如果使用已有是的知識實現(xiàn)一個MVC框架的web應(yīng)用程序的話,可以這樣來實現(xiàn),有servlet來充當(dāng)控制器的角色,他接受請求,根據(jù)請求信息的不同,將他們分發(fā)給不同 的jsp頁面來作為用戶的響應(yīng),同時servlet還要實例化一個javabean對象,jsp就可以使用javabean的相關(guān)標(biāo)簽來得到j(luò)avabean的數(shù)據(jù)。
            采用模型2,可以將頁面的顯示、業(yè)務(wù)邏輯的處理和流程的控制很清晰的分離開來。jsp負(fù)責(zé)頁面的顯示,javabean負(fù)責(zé)業(yè)務(wù)邏輯的處理,servlet負(fù)責(zé)流程的控制。MVC模式使得web應(yīng)用程序很容以維護(hù)和擴(kuò)展。因為各個部件的功能不同可以有不同的人進(jìn)行開發(fā)和維護(hù)。例如,美工專門負(fù)責(zé)jsp頁面成分發(fā)揮他們的美術(shù)和設(shè)計才能,而程序編寫人員負(fù)責(zé)業(yè)務(wù)邏輯的實現(xiàn)。
          4,Struts基礎(chǔ):
            Struts的控制器是有ActionServlet、Action、和Struts-config.xml組成。ActionServlet是struts的入口,所有的請求都回通過它來處理,然后讓他決定讓相應(yīng) 的Action處理請求。Action代表了一次動作,如用戶注冊、購買商品。開發(fā)者的業(yè)務(wù)邏輯代碼也會在這里添加;配置文件Struts-config.xml是對整個struts的配置,包括Actionservlet應(yīng)該講請求轉(zhuǎn)發(fā)給那個Action,Action處理完成以后,又有哪個jsp文件作為響應(yīng)等。
            Struts的模型主要有ActionForm來實現(xiàn)。他有一點類似于javabean,包含了若干可讀可寫的屬性,用于保存數(shù)據(jù),也有數(shù)據(jù)驗證的功能。一般來說一個Action回配備一個ActionFom。
            Struts的視圖主要有jsp實現(xiàn)。jsp中顯示的數(shù)據(jù)可以來自ActionForm,也可以是Action保存在作用范圍內(nèi)(request、session、application)的數(shù)據(jù)。當(dāng)然是用struts自帶的標(biāo)簽庫可以起到最大的簡化作用。
            使用struts開發(fā)web應(yīng)用程序以后,開發(fā)者 的思想需要做一下改變,Action、ActionForm和jsp是一個整體了。每一次Http請求都會有他們?nèi)叩陌l(fā)現(xiàn)。jsp代表用戶可以看到的東西,ActionForm代表的是數(shù)據(jù),Action代表的業(yè)務(wù)邏輯。
           一次典型的struts請求是這樣完成的:首先由瀏覽器客戶端發(fā)送請求,請求的地址,默認(rèn)為以“.do”結(jié)尾。然后Actionservlet接收到請求以后,會根據(jù)請求的路徑和參數(shù)來判斷有那個Action來處理此次請求;等到Action完成以后,通常是execute方法調(diào)用完成以后,struts會根據(jù)返回的ActionForward來判斷是有那個jsp來作為最終的響應(yīng)。
             以上就是struts最核心的設(shè)計思想,開發(fā)人員大多數(shù)時候只需完成配置文件和Action,將大多數(shù)的精力集中在Action里的業(yè)務(wù)邏輯實現(xiàn)上面。如果業(yè)務(wù)上有改動,只需修改Action即可,如果是顯示上的變化,也只需修改jsp,兩者實現(xiàn)了松耦合,互不影響。
           Action的URL后綴是“.do”是Struts的一種慣例,一般情況下不會做修改,通過配置也可以使用其他后綴,如“.action”。
          5,Struts開發(fā)的一般步驟:
                (1)搭建開發(fā)環(huán)境:最簡單的一種就是MyEclipse提供的工具直接添加。還有一種就是手動添加:具體步驟就是1,復(fù)制Struts所需的jar文件到web應(yīng)用的“/WEB-INF/lib”目錄下面。2,在web.xml里配置,ActionServlet。Actionservlet是所有Struts的入口,他本質(zhì)就是一個servlet,它的默認(rèn)URL匹配方式為“/*.do”,所有以“.do”結(jié)尾的URL都會有Actionservlet來處理,以下是一個示例配置:
              <servlet>
              <servlet-name>action</servlet-name>
              <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
              <init-param>
                <param-name>config</param-name>
                <param-value>/WEB-INF/struts-config.xml</param-value>
              </init-param>
              <init-param>
                <param-name>debug</param-name>
                <param-value>3</param-value>
              </init-param>
              <init-param>
                <param-name>detail</param-name>
                <param-value>3</param-value>
              </init-param>
              <load-on-startup>0</load-on-startup>
            </servlet>
            <servlet-mapping>
              <servlet-name>action</servlet-name>
              <url-pattern>*.do</url-pattern>
            </servlet-mapping>

            3,創(chuàng)建Struts的配置文件struts-config.xml。一般來說,配置文件存放在web應(yīng)用程序的“/WEB-INF/struts-config.xml”目錄下,通過配置文件指定Struts包含哪些Action、ActionForm等。示例配置如下:
           <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "

          <struts-config>
            <data-sources />
            <form-beans>
            <form-bean name="greetForm" type="com.insigma.struts.GreetForm"></form-bean><!-- 放置所有的ActionForm配置-->
            </form-beans>
            <global-exceptions />
            <global-forwards />
            <action-mappings>
              <action path="/CreetAction" type="com.insigma.struts.CreetAction" name="greetForm"><!-- 放置所有的Action配置-->
              <forward name="greet" path="/greet.jsp"></forward>
              </action>
            </action-mappings>
            <message-resources parameter="com.insigma.struts.ApplicationResources" /><!-- 配置資源文件的路徑-->
          </struts-config>
           (2),實現(xiàn)View-jsps:
                 jsp在struts中的兩個作用:提供用戶輸入接口和展示數(shù)據(jù)。一般來說,不會讓用戶直接訪問struts的jsp文件,都是通過Action進(jìn)行轉(zhuǎn)發(fā),所以jsp表單數(shù)據(jù)一般來自ActionForm,而其他的動態(tài)數(shù)據(jù)一般來自于Action的request里的屬性(Attribute);
              Struts為jsp提供了豐富的標(biāo)簽庫,尤其是Html標(biāo)簽庫,讓jsp和actionForm成為了一個整體,提交表單的時候可以自動填充ActionForm,響應(yīng)的時候可以為表單的輸入框自動添加數(shù)據(jù),而對于其他的動態(tài)數(shù)據(jù),可以使用struts的標(biāo)簽庫,也可以使用JStl,是數(shù)據(jù)的展示非常簡便。
           (3),實現(xiàn)Modle-ActionForms:
                   ActionForm充當(dāng)?shù)氖菙?shù)據(jù)層的作用,他為開發(fā)者保存數(shù)據(jù)提供了方便,尤其對于大型的web項目來說,一個頁面可能包含幾十個甚至上百個輸入框,如果開發(fā)者的每一個請求參數(shù)都通過request.getParameter()的方式獲取的 話,工作量會非常大,而且不利于維護(hù),有了ActionForm以后,他可以幫助開發(fā)者自動填充數(shù)據(jù)。而且,它還提供了一些數(shù)據(jù)驗證的功能。
            自定義的ActionForm需要繼承org.apache.struts.action.ActionForm類,然后把需要添加的字段作為成員變量進(jìn)行設(shè)置,并為這些變量加上set和get方法。
                 import org.apache.struts.action.ActionForm;
                     public class GreetForm extends ActionForm {
                               String username;

                     public String getUsername() {
                    return username;
                                               }

                    public void setUsername(String username) {
                     this.username = username;
                         }
                            }
             ActionForm完成以后,還需要在struts-config.xml里進(jìn)行配置以后,才能供Action使用。使用標(biāo)簽為<form-bean>,它包含form的名稱、name的屬性和類型type屬性。
           (4),實現(xiàn)Controller-Actions:
                 Action代表了一次動作,邏輯代碼、數(shù)據(jù)裝填代碼和請求轉(zhuǎn)發(fā)代碼都會放在Action里,它是struts最核心最重要的地方。
                 自定義的Action需要繼承自org.apache.struts.action.Action類,而且需要覆蓋它的execute方法,當(dāng)有請求指向該Action時,struts會實例化該action在調(diào)用execute()方法。
                      public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
               它包含4個參數(shù):ActionMapping、ActionForm、HttpServletRequest、HttpServletResponse,最后的兩個參數(shù)與servlet的請求和響應(yīng)是完全相同的。ActionMapping指的是該action映射的信息,通常會調(diào)用該對象的findForward()方法轉(zhuǎn)到下一個資源護(hù)或視圖jsp,該方法的參數(shù)即下一個資源的名稱,在struts-config.xml通過<forward>進(jìn)行配置,他是一個超類,往往需要強制類型轉(zhuǎn)換,通過<action>的name屬性指定,
             import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;

          import org.apache.struts.action.Action;
          import org.apache.struts.action.ActionForm;
          import org.apache.struts.action.ActionForward;
          import org.apache.struts.action.ActionMapping;

          public class CreetAction extends Action {
            @Override
          public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
             request.setCharacterEncoding("utf-8");
             response.setContentType("text/html,charset=utf-8");
             //轉(zhuǎn)換成ActionForm
             GreetForm gForm=(GreetForm)form;
             //往請求范圍內(nèi)設(shè)置用戶名屬性變量
             request.setAttribute("username",gForm.getUsername());
             //返回名字為greet的view
             return mapping.findForward("greet");
          }
          }
          然后在struts-config.xml里進(jìn)行設(shè)置。
          (5),訪問Action的URL:
               struts的可操作元素往往是以Action為單元的,有多少Action,就代表了多少個可進(jìn)行的動作。Action的URl與ActionServlet的配置是有關(guān)系的,默認(rèn)的情況下,所有的Action是以“.do”結(jié)尾的。
          6,Struts標(biāo)簽庫::
             (1),Bean常用標(biāo)簽庫:
                  Struts的Bean標(biāo)簽庫是為了訪問jsp的javabean和他們的屬性而設(shè)計的。它是對jsp的動作標(biāo)簽<jsp:useBean>的改進(jìn),讓開發(fā)者更好的使用請求參數(shù)、請求頭和cookie等信息。但是他和jstl、el有一些重復(fù)的地方。
          盡管如此,有一個標(biāo)簽時struts特有的,那就是,<bean:message/>,它是用力啊嘟嘟資源文件數(shù)據(jù)的。有的時候,一些常用的常量,如錯誤描述、多語言文本等保存在struts的資源文件ApplicationResources.properties里面便于維護(hù)。但是定義一個javabean來訪問這些數(shù)據(jù)顯得有些多余,皆可以直接使用這個標(biāo)簽,非常的方便。
                  資源文件ApplicationResources.properties的內(nèi)容是以鍵值對的形式書寫的,中間以“=”隔開,key=value.在使用<bean:message/>的時候,只需要指定該標(biāo)簽的key屬性即可,它對應(yīng)的就是資源文件的左邊的名稱,然后該標(biāo)簽就會返回相應(yīng)的文本值。
           (2)html常用標(biāo)簽:
             HTML標(biāo)簽庫是Struts使用最多的標(biāo)簽庫,它架起了jsp與Action和ActionForm的橋梁。它主要提供了大多數(shù)的表單元素即數(shù)據(jù)管理功能。他在標(biāo)單方面表現(xiàn)的比jstl和el更優(yōu)秀一些。如果要構(gòu)建一個表單,Html標(biāo)簽庫是目前最好的選擇。
            <html:form>是用來包含其他標(biāo)簽的,他的action屬性的值,應(yīng)該和struts-config.xml里面的<action>的path屬性的值相同,也是以斜線開頭。他們中的大多住都包含一個property屬性,與ActionForm的屬性相對應(yīng),也就是如果ActionForm有一個username屬性,那么property也許寫成username。
          7,Struts的高級特性:
             1,使用多種Action:
                Struts針對不同的情況,除了原始的Action以外,還提出了DispatchAction、LookupDispatchAction、MappingDispatchAction,后面的三個都可以將多個action方法寫在一個Action里面。
                    Struts的多種Action
            名稱             使用情況              使用簡介
           Action         普遍的action                 直接使用即可
          DispatchAction 表單包含多個參數(shù)時使用    需要從客戶端接受一個參數(shù),該參數(shù)的值對應(yīng)方法的名稱
          lookupDispatchAction 表單包含多個提交按鈕的時候         需要重載getKeyMethodMap()方法,返回參數(shù)與方法名之間的對應(yīng)                                                                                  @                                                         關(guān)系
          MappingDispatchAction 客戶端不便于傳遞參數(shù)時適用       需要配置文件的<action>標(biāo)簽的parameter屬性,指定Action的方法@                                                      名稱
          (1),DispatchAction的實現(xiàn)類為org.apache.struts.actions.DispatchAction,他需要從客戶端接受一個參數(shù),該參數(shù)的值與方法名對應(yīng)。Struts會根據(jù)struts-config.xml里面配置的<action>標(biāo)簽的parameter屬性來獲取請求參數(shù),然后利用java的反射機(jī)制調(diào)用方法名與參數(shù)值相同的方法。這些方法的參數(shù)列表和返回類型與Action的execute()方法完全相同。使用DispatchAction大致可以分為以下幾步:
           1>自定義一個繼承自DispatchAction的類。把需要對外的每個action動作寫成一個方法。方法的參數(shù)列表和返回類型與Action的execute()方法完全相同。
           2>在struts-config.xml里配置Action。與配置一個普通的Action差不多,只是需要多加一個parameter屬性,一般為action或method,他指定了客戶端需要傳遞的參數(shù)名。
          3>為客戶端表單添加一個隱藏的輸入框,他的值為需要調(diào)用的方法名。如果http請求采用提交表單的形式,隱藏的輸入框是最好的選擇;若是通過url訪問Action的話,則需要在url后面加上請求參數(shù)。
          (2),lookupDispatchAction:的實現(xiàn)類是org.apache.struts.actions.lookupDispatchAction,它主要適合于一個表單里有多個按鈕的情況。lookupDispatchAction也需要從客戶端接受一個參數(shù),但是參數(shù)的值與方法名的對應(yīng)關(guān)系需要一個getKeyMethodMap()方法來確定,該方法返回一個Map,該Map的Key與Value與資源文件ApplicationResources.properties的key和value對應(yīng)。使用lookupDispatchAction的步驟:
           1》,自定義一個lookupDispatchAction類把需要對外的每個action動作寫成一個方法,該方法的參數(shù)列表和返回類型與action的execute()方法完全相同。然后實現(xiàn)父類的getKeyMethodMap()方法,該方法返回的Map與資源文件的部分內(nèi)容相對應(yīng)。
          2》在資源文件ApplicationResources.properties里定義按鈕的名稱
          3》在struts-config.xml里配置Action。與普通的配置Action差不多,只需多家一個parameter屬性,一般為action或method,他制定了客戶端需要指定的參數(shù)名。
          4》當(dāng)客戶端表單包含兩個提交按鈕時,用<bean:message>標(biāo)簽來定義按鈕的value,并按鈕的name為參數(shù)的名字。
          (3),MappingDispatchAction:MappingDispatchAction:的實現(xiàn)類為org.apache.struts.actions.MappingDispatchAction.
          它無需從客戶端接收參數(shù),直接通過struts-config.xml里的<action>的屬性parameter指定方法名,客戶端不許咬任何配置,使用起來就像一個普通的eAction一樣。他的確定就是可能導(dǎo)致struts-config的配置非常長,因為每一個方法都需加一個<action>標(biāo)簽。盡管如此,他還是要比原來的Action要好一點,至少不需要寫那么多的action類了,所以MappingDispatchAction:更適合直接通過url訪問Action。使用MappingDispatchAction:的步驟:
          1》定義一個繼承自MappingDispatchAction:的類,把需要對外的每個action動作寫成一個方法,該方法的參數(shù)列表和返回類型與execute()方法的完全相同。
          2》在struts-config里配置該action,與一個普通的Action差不多,對于沒一個方法會對應(yīng)一個<action>標(biāo)簽,他們的path各不相同,另外,parameter屬性的值就是一個方法名。
          3》,客戶端訪問MappingDispatchAction的時候,無論是表單還是直接使用url,與普通的Action沒有區(qū)別。
          8,使用多種ActionForm:
            針對不同的情況,除了最原始的ActionForm以外,還提供了動態(tài)的ActionForm(DynaActionForm)和懶惰ActionForm(LazyValidatorForm)。在具體的開發(fā)過程中,可以有多種選擇,如果數(shù)據(jù)量大或用途比較廣泛,可以用普通ActionForm;如果數(shù)據(jù)量很小,則使用動態(tài)的DynaActionForm;如果數(shù)據(jù)量不太確定,那就是用懶惰的LazyValidatorForm
            1》DynaActionForm的實現(xiàn)類為org.apache.struts.action.DynaActionForm,之所以稱他為動態(tài)的ActionForm,是因為它是Action不比單獨定義一個ActionForm類,而可以通過在配置文件里通過XML的形式定義ActionForm的字段及其類型。
          此時的<form-bean>標(biāo)簽里的type屬性應(yīng)該是DynaActionForm的完整類名,然后再在其中嵌入<form-property>標(biāo)簽來定義屬性,支持的數(shù)據(jù)類型包含8中java基本類型,String和時間類型。在Action的execute()方法和其他的action方法里。通過DynaActionForm.get()方法獲取所需的參數(shù)。
          2》lazyValidatorForm:
          lazyValidatorForm的實現(xiàn)類是org.apache.struts.validator.lazyValidatorForm,他比起DynaActionForm來說更簡單。lazyValidatorForm連用Xml定義字段的步驟都不必要了,他會自動將請求參數(shù)全部作為ActionForm的屬性,所有的Action都可以使用它。只不過,對于使用lazyValidatorForm的Action在配置的時候,需要設(shè)置<action>標(biāo)簽的的validate屬性的為false。
          與DynaActionForm類似,在action的execute()方法或其他的action方法里。通過lazyValidatorForm.get()方法獲取所需的參數(shù)。

          posted on 2012-06-12 13:47 Mr Lee 閱讀(448) 評論(0)  編輯  收藏 所屬分類: java技術(shù)

          My Links

          Blog Stats

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章檔案

          (hibernate)http://www.aygfsteel.com/dyllove98/archive/2012/05/12/377959.html

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 高安市| 乌鲁木齐市| 宁陵县| 玉林市| 华亭县| 安乡县| 革吉县| 连云港市| 司法| 湖州市| 方正县| 九江市| 嘉祥县| 西平县| 北海市| 东阿县| 洛宁县| 遂平县| 南涧| 普兰县| 信丰县| 安泽县| 宜川县| 绍兴县| 长宁县| 西乌珠穆沁旗| 东平县| 固原市| 枝江市| 崇信县| 鄂托克前旗| 保德县| 揭阳市| 深水埗区| 枝江市| 阳谷县| 阳新县| 和平县| 广水市| 尉氏县| 启东市|