<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    千里馬

    天馬行空

    struts的一些總結(jié)

    1,使用框架進行程序開發(fā)的意義在于:框架本身包含了各種思想,這些思想是前人為開發(fā)人員總結(jié)的,他們往往具有開發(fā)效率高、易維護、是程序開發(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)用程序很容以維護和擴展。因為各個部件的功能不同可以有不同的人進行開發(fā)和維護。例如,美工專門負(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進行轉(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()的方式獲取的 話,工作量會非常大,而且不利于維護,有了ActionForm以后,他可以幫助開發(fā)者自動填充數(shù)據(jù)。而且,它還提供了一些數(shù)據(jù)驗證的功能。
      自定義的ActionForm需要繼承org.apache.struts.action.ActionForm類,然后把需要添加的字段作為成員變量進行設(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里進行配置以后,才能供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)到下一個資源護或視圖jsp,該方法的參數(shù)即下一個資源的名稱,在struts-config.xml通過<forward>進行配置,他是一個超類,往往需要強制類型轉(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里進行設(shè)置。
    (5),訪問Action的URL:
         struts的可操作元素往往是以Action為單元的,有多少Action,就代表了多少個可進行的動作。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>的改進,讓開發(fā)者更好的使用請求參數(shù)、請求頭和cookie等信息。但是他和jstl、el有一些重復(fù)的地方。
    盡管如此,有一個標(biāo)簽時struts特有的,那就是,<bean:message/>,它是用力啊嘟嘟資源文件數(shù)據(jù)的。有的時候,一些常用的常量,如錯誤描述、多語言文本等保存在struts的資源文件ApplicationResources.properties里面便于維護。但是定義一個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的反射機制調(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 閱讀(446) 評論(0)  編輯  收藏 所屬分類: java技術(shù)

    My Links

    Blog Stats

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章檔案

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

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日本成人在线免费观看| 亚洲美女在线国产| 成人亚洲国产精品久久| 亚洲日韩在线观看免费视频| 久久国产乱子伦精品免费不卡| 亚洲激情中文字幕| 热99re久久精品精品免费| a级毛片免费全部播放无码| 亚洲日本在线观看| 全黄性性激高免费视频| 久久午夜夜伦鲁鲁片免费无码影视 | 国产成人亚洲精品91专区高清 | 亚洲综合无码AV一区二区| 香蕉97超级碰碰碰免费公| 人人爽人人爽人人片av免费| 亚洲精品免费在线视频| 亚洲成AⅤ人影院在线观看| 天天影视色香欲综合免费| 久久久WWW成人免费精品| 亚洲成_人网站图片| 亚洲开心婷婷中文字幕| 国产青草视频免费观看97| 6080午夜一级毛片免费看| 一区二区视频在线免费观看| 国产精品亚洲片在线va| 亚洲一二成人精品区| 亚洲乱码中文字幕手机在线| 成人毛片18女人毛片免费| 一级毛片免费播放| 久久www免费人成精品香蕉| 亚洲国产一区二区三区在线观看| 亚洲视频免费在线观看| ZZIJZZIJ亚洲日本少妇JIZJIZ| 成人免费视频一区二区三区| 91在线手机精品免费观看| 女人隐私秘视频黄www免费| 麻豆69堂免费视频| 亚洲精品无AMM毛片| 亚洲国产成a人v在线观看| 中文字幕亚洲第一在线| 国产精品亚洲一区二区三区在线 |