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

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

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

    敬的世界

    常用鏈接

    統(tǒng)計(jì)

    最新評(píng)論

    Struts 的MVC架構(gòu)的基本原理

    1. 視圖 VIEW

    ???HTML + Struts Tag lib負(fù)責(zé)頁面格式, 比如要輸出一個(gè)報(bào)表,報(bào)表需要分幾列,每列顯示什么顏色。
    ???
    ???Form Bean 負(fù)責(zé)內(nèi)容。 如報(bào)表每一項(xiàng)數(shù)據(jù)內(nèi)容。

    2. 控制器(Controller)

    ???主要由 ActionServlet + Action Bean 組成。

    ???ActionServlet 是Struts中核心的部分,其功能如下。

    ??????ActionServlet負(fù)責(zé)所有頁面信息收集和頁面之間的轉(zhuǎn)換。
    ??????系統(tǒng)通過web.xml的 <servlet>來配置ActionServlet
    ??????系統(tǒng)通過web.xml 的<init-param>將Struts-config.xml 載入內(nèi)存以備ActionServlet調(diào)用
    ??????validation.xml以<plug-in>方法載入內(nèi)存?zhèn)銩ctionServlet調(diào)用。
    ?????????
    ???ActionBean 的性能如下:
    ??????
    ??????ActionServlet通過Struts-config.xm 的配置來調(diào)用相應(yīng)的Action Bean.
    ??????Action Bean 從Form Bean 取出相應(yīng)的值。
    ??????Action Bean 把相應(yīng)的值付給Form Bean
    ??????Action Bean 負(fù)責(zé)調(diào)用相應(yīng)的Model,
    ??????Action Bean 負(fù)責(zé)將頁面向前傳遞到相應(yīng)的頁面。

    3. 模型 (Model)

    ??????模型Model 主要負(fù)責(zé)業(yè)務(wù)邏輯實(shí)現(xiàn),包括Web Service 、Session Bean 和 Entity Bean. 從數(shù)據(jù)流的角度來看,這一過程主要包括以下兩個(gè)方面:

    ??????? (1)將前端的From Bean 的數(shù)據(jù)傳到后端,進(jìn)行數(shù)據(jù)庫的插入,更新和刪除。

    ????????(2)根據(jù)前端的請(qǐng)求,選擇數(shù)據(jù)庫數(shù)據(jù),將數(shù)據(jù)傳到前端的Form Bean



    ----------------------------------------------------------------------------------------------------------------------------------------------

    java.lang.Object
    ??|
    ??+--javax.servlet.GenericServlet
    ????????|
    ????????+--javax.servlet.http.HttpServlet
    ??????????????|
    ??????????????+--org.apache.struts.action.ActionServlet

    Struts提供了一個(gè)缺省版本的ActionServlet類,你可以繼承這個(gè)類,覆蓋其中的一些方法來達(dá)到你的特殊處理的需要。ActionServlet繼承與javax.servlet.http.HttpServlet,所以在本質(zhì)上它和一個(gè)普通的servlet沒有區(qū)別,你完全可以把它當(dāng)做一個(gè)servlet來看待,只是在其中完成的功能不同罷了。ActionServlet主要完成如下功能:

    將一個(gè)來自客戶端的URI映射到一個(gè)相應(yīng)的Action類

    • 如果是這個(gè)Action類是第一次被調(diào)用,那么實(shí)例化一個(gè)并放入緩存
    • 如果在配置文件(struts-config.xml)中指定了相應(yīng)的ActionForm,那么從Request中抓取數(shù)據(jù)填充FormBean
    • 調(diào)用這個(gè)Action類的perform()方法,傳入ActionMapping的一個(gè)引用,對(duì)應(yīng)的ActionForm、以及由容器傳給ActionServlet的HttpServletRequest、HttpServletResponse對(duì)象。



    確省版本的ActionServlet會(huì)從配置文件web.xml中讀取如下初始化參數(shù):

    • application
      應(yīng)用使用的資源包(resources?bundle)的基類
    • factory
      用于創(chuàng)建應(yīng)用的MessageResources對(duì)象的MessageResourcesFactory的類名。確省是org.apache.struts.util.PropertyMessageResourcesFactory。
    • config
      Struts的配置文件,確省是/WEB-INF/struts-config.xml。注意這兒是與應(yīng)用Context關(guān)聯(lián)的相對(duì)路徑。
    • content
      定義了確省的內(nèi)容類型和編碼格式,它會(huì)被自動(dòng)地被設(shè)置到每個(gè)response中,如果JSP/Servlet中沒有明確的設(shè)置。確省是text/html。
    • debug
      調(diào)試信息的級(jí)別。默認(rèn)為0,比當(dāng)前級(jí)別高的調(diào)試信息會(huì)被log到日志文件中。
    • detail
      與debug的作用類似,只是這個(gè)detail是initMapping()時(shí)專用的。調(diào)試信息會(huì)被打印到System.out,而不是日志文件。
    • formBean
      ActionFormBean的實(shí)現(xiàn)類,確省為org.apache.struts.action.ActionFormBean
    • forward
      應(yīng)用中使用的ActionForward類,確省是org.apache.struts.action.ActionForward。
    • locale
      指定了確省使用的Locale對(duì)象。設(shè)為true,當(dāng)?shù)玫揭粋€(gè)session時(shí),會(huì)自動(dòng)在session中存儲(chǔ)一個(gè)以Action.LOCALE_KEY標(biāo)示的Locale對(duì)象,如果session中還沒有與Action.LOCALE_KEY綁定的Locale對(duì)象。
    • mapping
      應(yīng)用中使用的ActionMapping類,確省是org.apache.struts.action.ActionMapping。
    • multipartClass
      文件上傳使用的MutipartRequestHandler的實(shí)現(xiàn)類。確省為org.apache.struts.upload.DiskMultipartRequestHandler
    • nocache
      如果設(shè)為true,那么ActionServlet會(huì)自動(dòng)在每個(gè)到客戶端的響應(yīng)中添加nocache的HTML頭,這樣客戶端就不會(huì)對(duì)應(yīng)用中的頁面進(jìn)行緩存。確省為false
    • null
      如果設(shè)置為true,那么應(yīng)用在得到一個(gè)未定義的message資源時(shí),會(huì)返回null,而不是返回一個(gè)錯(cuò)誤信息。確省是true。
    • maxFileSize
      文件上傳的大小上限,確省為250M
    • bufferSize
      文件上傳時(shí)的緩沖區(qū)的大小,確省為4M
    • tempDir
      設(shè)置用于上傳時(shí)的臨時(shí)目錄。工作目錄會(huì)作為一個(gè)Servlet環(huán)境(Context)的屬性提供。
    • validate
      Are?we?using?the?new?configuration?file?format?確省為true。
    • validating


    在解析配置XML文件是是否進(jìn)行有效性的驗(yàn)證。確省為true

    ActionServlet中應(yīng)用了命令設(shè)計(jì)模式。

    一個(gè)Servlet在由容器生成時(shí),首先會(huì)調(diào)用init()方法進(jìn)行初始化,在接到一個(gè)HTTP請(qǐng)求時(shí),調(diào)用相應(yīng)的方法進(jìn)行處理;比如GET請(qǐng)求調(diào)用doGet()方法,POST請(qǐng)求調(diào)用doPost()方法。所以首先看看ActionServlet的init()方法,你就會(huì)很清楚為什么ActionServlet可以完成這些功能了。

    init()


    在它的init()方法中,ActionServlet依次調(diào)用如下protected的方法完成初始化:

    • initActions()?-?????大家可能還曾有這個(gè)疑問:Struts為什么可以找到一個(gè)請(qǐng)求URI對(duì)應(yīng)的action類呢?答案就在這兒,ActionServlet有一個(gè)actions屬性,類型為org.apache.struts.util.FastHashMap,用于存儲(chǔ)以類的全名為key的已實(shí)例化的Action類。在init()時(shí)首先調(diào)用的就是initActions()方法,在這個(gè)方法中只是簡(jiǎn)單的清除map中的所有的名值對(duì),
      1. ????????synchronized?(actions)?{
      2. ????????????actions.setFast(false);
      3. ????????????actions.clear();
      4. ????????????actions.setFast(true);
      5. ????????}

      首先把a(bǔ)ctions設(shè)為slow模式,這時(shí)對(duì)FastHashMap的訪問是線程同步的,然后清除actions中的所有的已存在的名/值對(duì),最后再把a(bǔ)ctions的模式設(shè)為fast。由于FastHashMap是struts在java.util.HashMap的基礎(chǔ)上的一個(gè)擴(kuò)展類,是為了適應(yīng)多線程、并且對(duì)HashMap的訪問大部分是只讀的特殊環(huán)境的需要。大家知道java.util.HashMap是非線程安全的,所以HashMap一般適用于單線程環(huán)境下。org.apache.struts.FastHashMap就是繼承于java.util.HashMap,在其中添加多線程的支持產(chǎn)生的。在fast模式下的工作方式是這樣的:讀取是非線程同步的;寫入時(shí)首先克隆當(dāng)前map,然后在這個(gè)克隆上做寫入操做,完成后用這個(gè)修改后的克隆版本替換原來的map。那么在什么時(shí)候會(huì)把Actions類添加到這個(gè)map中呢?我們已經(jīng)提到了struts是動(dòng)態(tài)的生成Action類的實(shí)例的,在每次ActionServlet接收到一個(gè)GET或POST的HTTP請(qǐng)求時(shí),會(huì)在這個(gè)map中查找對(duì)應(yīng)的Action類的實(shí)例,如果不存在,那么就實(shí)例化一個(gè),并放入map中。可見這個(gè)actions屬性起到了對(duì)Action類實(shí)例的緩存的作用。
    • initInternal()?-?????初始化ActionServlet內(nèi)部使用的資源包MessageResources,使用MessageResources.getMessageResources(internalName)得到????internalName為"org.apache.struts.action.ActionResources"對(duì)應(yīng)的ActionResources.properties文件。這個(gè)資源包主要用于ActionServlet處理過程中的用到的提示信息,這兒不展開討論。
    • initDebug()?-?????從web.xml中讀取本應(yīng)用的debug級(jí)別參數(shù)getServletConfig().getInitParameter("debug"),然后賦給debug屬性。
    • initApplication()-????初始化應(yīng)用資源包,并放置入ServletContext中。
      1. ????????String?factory?=getServletConfig().getInitParameter(“factory”);????
      2. ????????String?oldFacory?=?MessageResourcesFactory.getFactoryClass();
      3. ????????if?(factory?!=null)
      4. ????????????????MessageResourcesFactory.setFactoryClass(factory);
      5. ????????String?value?=?getServletConfig().getInitParameter("application");
      6. ????????MessageResourcesFactory?factoryObject?=
      7. ????????????????MessageResourcesFactory.createFactory();
      8. ????????application?=?factoryObject.createResources(value);
      9. ????????MessageResourcesFactory.setFactory(oldFactory);?
      10. ????????getServletContext().setAttribute(Action.MESSAGES_KEY,?application);

      說明:文中引用的代碼片斷可能會(huì)省略了一些例外檢查等非主線的內(nèi)容,敬請(qǐng)注意。

      首先從配置文件中讀取factory參數(shù),如果這個(gè)參數(shù)不為空,那么就在MessageResourcesFactory中使用這個(gè)指定的Factory類;否則,使用默認(rèn)的工廠類org.apche.struts.util.PropertyMessageResourceFactory。然后調(diào)用MessageResourcesFactory的靜態(tài)createFactory()方法,生成一個(gè)具體的MessageResourceFactory對(duì)象(注意:MessageResourcesFactory是抽象類)。這樣就可以調(diào)用這個(gè)具體的MessageResourceFactory的createResource()方法得到配置文件(web.xml)中定義的資源文件了。
      上面的application對(duì)象類型為MessageResources。在web.xml中在配置ActionServlet時(shí)可以指定一個(gè)特定的工廠類。不能直接MessageResourcesFactory的createResources()方法,因?yàn)檫@個(gè)方法是abstract的。創(chuàng)建factoryObject的過程如下:
      1. ????
      2. ????????MessageResourceFactory?factoryObject=
      3. ????????????????MessageResourcesFactory.createFactory();
      4. ????????application?=?factoryObject.createResources(value);

      <li>initMapping()?-????為應(yīng)用初始化mapping信息ActionServlet有一個(gè)protected的屬性:mapping,封裝了一個(gè)ActionMapping的對(duì)象集合,以便于管理、查找ActionMapping。mappings是org.apache.struts.action.ActionMappings類的實(shí)例。主要有兩個(gè)方法:addMapping(ActionMapping?mapping)和findMapping(String?path)。ActionMapping也是使用上面提到的org.apache.struts.util.FastHashMap類來存儲(chǔ)所有的ActionMapping對(duì)象。
      1. ????????mappings.setServlet(this);
      2. ????????……
      3. ????????//?Initialize?the?name?of?our?ActionFormBean?implementation?class
      4. ????????value?=?getServletConfig().getInitParameter("formBean");
      5. ????????if?(value?!=?null)
      6. ????????????formBeanClass?=?value;
      7. ????
      8. ????????//?Initialize?the?name?of?our?ActionForward?implementation?class
      9. ????????value?=?getServletConfig().getInitParameter("forward");
      10. ????????if?(value?!=?null)
      11. ????????????????forwardClass?=?value;
      12. ????????//?Initialize?the?name?of?our?ActionMapping?implementation?class
      13. ????????value?=?getServletConfig().getInitParameter("mapping");
      14. ????????if?(value?!=?null)
      15. ????????????????mappingClass?=?value;

      在initMapping()中,首先鏈接mappings對(duì)象到本servlet實(shí)例。其實(shí)這句話的作用很簡(jiǎn)單,在ActionMappings中會(huì)有一個(gè)ActionServlet類型的屬性,這個(gè)屬性就界定了這個(gè)ActionMappings對(duì)象所屬的ActionServlet。Struts的實(shí)現(xiàn)比較靈活,其中的ActionFormBean、ActionForward、ActionMapping類你完全可以使用自己實(shí)現(xiàn)的子類,來定制Struts的工作方式。上面的代碼就從配置文件(web.xml)中讀取formBean、forward、mapping參數(shù),這些參數(shù)就是你定制的ActionFormBean、ActionForward、ActionMapping類名。
      1. ????????//?Initialize?the?context-relative?path?to?our?configuration?resources
      2. ????????value?=?getServletConfig().getInitParameter("config");
      3. ????????if?(value?!=?null)
      4. ????????????????config?=?value;
      5. ????????????????//?Acquire?an?input?stream?to?our?configuration?resource
      6. ????????InputStream?input?=?getServletContext().getResourceAsStream(config);
      7. ????????Digester?digester?=?null;
      8. ????????????????digester?=?initDigester(detail);
      9. ????????try?{
      10. ????????????????formBeans.setFast(false);
      11. ????????????????forwards.setFast(false);
      12. ????????????????mappings.setFast(false);
      13. ????????????????digester.parse(input);
      14. ????????????????mappings.setFast(true);
      15. ????????????????forwards.setFast(true);
      16. ????????????????formBeans.setFast(true);
      17. ????????}?catch?(SAXException?e)?{
      18. ????????????????throw?new?ServletException
      19. ????????(internal.getMessage("configParse",?config),?e);
      20. ????????}?finally?{
      21. ????????????????input.close();
      22. ????????}

      從web.xml讀取Struts的配置文件的位置。使用org.apache.struts.digester.Digester解析config參數(shù)標(biāo)示的配置文件,通常為“/WEB-INF/struts-config.xml”,解析出所有的data-source、form-bean、action-mapping、forward。從上面的程序片斷看到,Digester僅僅調(diào)用了一個(gè)parse()方法,那么,Digester是怎樣把解析struts-config.xml文件并把解析的結(jié)果form-bean等信息存儲(chǔ)到屬性變量formBeans等中的呢?你可以注意到在調(diào)用digester.parse(InputStream)之前,首先調(diào)用了initDigester()方法:
      1. ????????Digester?digester?=?new?Digester();
      2. ????????digester.push(this);
      3. ????????digester.addObjectCreate("struts-config/action-mappings/action",
      4. ?????????????????????????????????mappingClass,?"className");
      5. ????????digester.addSetProperties("struts-config/action-mappings/action");
      6. ????????digester.addSetNext("struts-config/action-mappings/action",
      7. ????????????????????????????"addMapping",
      8. ????????????????????????????"org.apache.struts.action.ActionMapping");
      9. ????????digester.addSetProperty
      10. ????????????("struts-config/action-mappings/action/set-property",
      11. ?????????????"property",?"value");

      在這個(gè)方法中首先生成一個(gè)Digester對(duì)象,然后設(shè)置解析的規(guī)則和回調(diào),如果你對(duì)XML、SAX不是很熟,這兒不必糾纏太深。要注意的是addSetNext()方法,設(shè)置了每一個(gè)要解析元素的Set?Next回調(diào)方法,而這個(gè)方法就是由digester解析器的父提供的。上面的片斷中的“addMapping”就是ActionServlet本身定義的一個(gè)方法,將由Digester回調(diào)。Digester就是籍此把解析出的每一個(gè)FormBean、ActionForward、ActionMapping等存儲(chǔ)到屬性變量formBeans、forwards、mappings等中的。
    • initUpload()?-????初始化有關(guān)Upload的一些參數(shù),比如:bufferSize、tempDir。
    • initDataSource()?-取出在initMapping()中從配置文件中讀取的每一個(gè)DataSource,設(shè)置LogWriter,如果為GenericDataSource的實(shí)例,則打開數(shù)據(jù)源。然后,把每個(gè)dataSource放入Context中。
      dataSource.setLogWriter(scw);
      ((GenericDataSource)dataSource).open();
      getServletContext().setAttribute(key,dataSource);
    • initOther()?-????????設(shè)置其它尚未初始化的的參數(shù)(content、locale、nocache),并發(fā)布formBeans、forwards、mappings到Context:
      getServletContext().setAttribute(Action.FORM_BEANS_KEY,?formBeans);
      getServletContext().setAttribute(Action.FORWARDS_KEY,?forwards);
      getServletContext().setAttribute(Action.MAPPINGS_KEY,?mappings);
    • initServlet()?-????初始化Controller?Servlet的Servlet?Mapping。這兒也使用了Digester工具,掃描web.xml所有的<web-app/servlet-mapping>,尋找servlet-name與當(dāng)前Servlet相同的mapping,置入Context。代碼如下;
      1. ????????Digester?digester?=?new?Digester();
      2. ????????digester.push(this);
      3. ????????digester.setDebug(debug);
      4. ????????digester.setValidating(validating);
      5. ????????digester.addCallMethod(“web-appservlet-mapping”,“addServletMapping”,?2);
      6. ????????digester.addCallParm(“web-appservlet-mappingservlet-name”,?0);
      7. ????????digester.addCallParm(“web-appservlet-mappingurl-pattern”,?1);
      8. ????????InputStream?is?=?getServletContext().getResourceAsStream(“/WEB-INFweb.xml”);
      9. ????????digester.parse(is);?
      10. ????????getServletContext().setAttribute(Action.SERVLET_KEY,servletMapping);

    posted on 2008-10-04 00:07 picture talk 閱讀(484) 評(píng)論(0)  編輯  收藏 所屬分類: struts


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产日韩亚洲大尺度高清| 亚洲性天天干天天摸| a级毛片在线免费看| 亚洲第一香蕉视频| 免费一级毛片在线播放| 四虎影视久久久免费观看| 亚洲AV日韩AV天堂久久| 免费被黄网站在观看| 国产羞羞的视频在线观看免费| 亚洲午夜电影在线观看高清| 亚洲国产黄在线观看| 在线精品一卡乱码免费| 伊人久久国产免费观看视频| 亚洲午夜国产精品| 亚洲日韩激情无码一区| 最近的免费中文字幕视频| 免费一区二区无码东京热| 亚洲精品欧美综合四区| 亚洲视频一区调教| MM131亚洲国产美女久久| 成熟女人特级毛片www免费| 三级网站免费观看| 国产亚洲视频在线| 亚洲Av高清一区二区三区| 亚洲乱码精品久久久久..| 国产午夜无码视频免费网站| 亚洲VA中文字幕无码毛片 | 青青青国产在线观看免费网站| 国产成人亚洲综合在线| 亚洲国产美女精品久久久久| 亚洲无线码一区二区三区| 国产精品无码素人福利免费| 亚洲免费在线视频播放| 免费观看一区二区三区| 国产亚洲精品美女2020久久| 亚洲成电影在线观看青青| 亚洲国产成人久久精品动漫| 亚洲永久精品ww47| 亚洲成a人片在线观看老师| 性感美女视频免费网站午夜| 成人免费视频网站www|