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

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

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

    好·色之徒
    已經(jīng)轉(zhuǎn)移到 好·色之徒--我的博客、我的生活

    先來說說如何搭建MVC中最重要組成部分C
    其實(shí)就是一個(gè)Servlet,當(dāng)然我們主要是基于http的web應(yīng)用,所以這里需要講述的是關(guān)于HttpServlet的。
    我們通過繼承HttpServlet,創(chuàng)建一個(gè)控制器,這里暫且命名為:UctServlet。

    HttpServlet主要有三個(gè)方法:init,service,destroy,這三個(gè)需要我們?cè)赨ctServlet中詳細(xì)實(shí)現(xiàn)它,先看一段代碼

    public void init(ServletConfig config) {
    try {
    super.init(config);
    poSCtxt = getServletContext(); //定義了私有成員變量poSCtxt,以獲取ServletContext

    UctProperties.setServCtxt(poSCtxt); //UctProperties類(共通類),存放一些基礎(chǔ)資源,比如數(shù)據(jù)庫信息
    DBA = new UctDBIO(); //定義了私有成員變量DBA,UctDBIO類(共通類),關(guān)于數(shù)據(jù)庫操作的
    psConn = DBA.connect(); //定義了私有成員變量psConn,初始化取得數(shù)據(jù)庫的連接

    } catch (Exception e) {
    logger.error("UctServlet_init error", e);
    }
    }
    這是在容器啟動(dòng)的時(shí)候觸發(fā)的方法,在init方法中,初始化了一些固有的資源,比如ServletContext、數(shù)據(jù)庫的相關(guān)操作,
    這是非常必要的,因?yàn)檫@些資源對(duì)整個(gè)web系統(tǒng)來說一直需要使用,在init中加以初始化,為整個(gè)應(yīng)用節(jié)省了很多不必要的開支,
    也是系統(tǒng)提升性能的關(guān)鍵措施之一。

    public void destroy() {
    logger.info("UctServlet destroy.IN & DisConnect Conn = " + psConn);
    try {
    DBA.disconnect(); // 數(shù)據(jù)庫連接解除
    } catch (Exception e) {
    logger.error("UctServlet destroy.Error, UctServlet disconnect-Error");
    }
    }
    這是在容器停止的時(shí)候觸發(fā)的方法,用于清除一些資源,比如說數(shù)據(jù)庫資源。

    上面兩個(gè)方法一看就明白,比較簡(jiǎn)潔,最關(guān)鍵的方法,也是實(shí)現(xiàn)C功能的方法是service方法。
    這里先探討一下接收頁面請(qǐng)求,實(shí)現(xiàn)控制資源分配、頁面流轉(zhuǎn)的要素有哪些?

    一種方式是:所有的請(qǐng)求都交由service來實(shí)現(xiàn),包括數(shù)據(jù)分析、數(shù)據(jù)裝配,最后到forward到某一個(gè)資源,
    當(dāng)然可能需要一些輔助的help類,這樣實(shí)現(xiàn)的,service方法會(huì)變的很龐大,而且請(qǐng)求的變數(shù)很大,
    系統(tǒng)從功能上來說很單一,一旦有所變化,那么service方法需要大的改動(dòng)。這是不可取的。

    第二種方法:對(duì)請(qǐng)求首先進(jìn)行一定的限制設(shè)計(jì),比如:有兩個(gè)參數(shù)Window(某一畫面)和Action(某一動(dòng)作),
    分別表示畫面和動(dòng)作,然后在數(shù)據(jù)庫或是xml文件中來設(shè)置你的相關(guān)配置,舉例如下:(在數(shù)據(jù)庫中)
    alink atype window_id action_id
    HAAap BEAN WIN_HGA HAA ----年度計(jì)劃畫面 初始的一種狀態(tài)
    HAAap BEAN WIN_HGA SRDT ----SRDT表示年度計(jì)劃畫面上的檢索功能
    HAAap BEAN WIN_HGA DTIL ----DTIL表示年度計(jì)劃畫面上的詳細(xì)畫面功能
    HBAap JSP WIN_HGA HBA ----執(zhí)行計(jì)劃畫面 初始的一種狀態(tài)
    。。。
    類似這樣的設(shè)計(jì)
    對(duì)這幾個(gè)字段說明一下:
    window_id、action_id是對(duì)應(yīng)畫面?zhèn)鬟^來的兩個(gè)參數(shù),一個(gè)代表具體某一畫面,一個(gè)是該畫面上所有可能需要觸發(fā)的動(dòng)作,
    比如:初始態(tài)、檢索、增加、刪除等等。
    alink是這個(gè)體系中M的部分(bean的概念),是針對(duì)比如年度計(jì)劃畫面所有的操作,這個(gè)很關(guān)鍵。
    具體的業(yè)務(wù)邏輯處理都在其中實(shí)現(xiàn),而且可以看到命名也是很刻意的HAAap--HAA,HBAap--HBA,這樣很容易區(qū)分是屬于哪個(gè)畫面的。
    最后atype,這里設(shè)計(jì)了三種形態(tài):BEAN、JSP、HTML,怎么來理解呢?BEAN就是剛剛提到的HAAap、HBAap這類的有業(yè)務(wù)邏輯在里面的,
    JSP是直接用到了數(shù)據(jù)bean,而不需要關(guān)聯(lián)的業(yè)務(wù)邏輯,而HTML則直接到頁面資源,不需要輔助的bean。

    這是第二種方法,把核心業(yè)務(wù)都交由bean去處理,service方法主要關(guān)注分發(fā)這些業(yè)務(wù),
    具有更好的擴(kuò)展性、穩(wěn)定性,方法也變得簡(jiǎn)潔明了,容易維護(hù),推薦使用這樣的方法來實(shí)現(xiàn)MVC模式,具體的做法下面給我一些代碼片斷:

    String sbsWindow = req.getParameterValues("Window"); //獲取Window畫面參數(shù)
    String sbsAction = req.getParameterValues("Action"); //獲取該畫面的動(dòng)作參數(shù)

    //在數(shù)據(jù)庫中獲取相關(guān)處理資源(alink atype)
    if (!sUser.getFuriwake(DBA, sbsWindow, sbsAction)) {
    errPage(req, res, "UctSevlet AP-CALL.IN", "數(shù)據(jù)庫中沒有定義處理動(dòng)作");
    return;
    }

    String sType = sUser.getApName(); //(BEAN/JSP/HTML)三種類型 atype字段
    String sWindow = sUser.getApType(); //畫面處理具體的類 alink字段

    下面是處理的核心部分:

    switch (iType) {
    case 1: // ** APP Bean Call **
    try {
    String wAppId = sPktName + "." + sWindow; //sPktName是包的名字
    Class genClass = Class.forName(wAppId); // APPBean的獲取

    // APPBean實(shí)例的取得
    appBean = genClass.newInstance();
    Class prmClass[] = {
    javax.servlet.http.HttpServletRequest.class,
    javax.servlet.http.HttpServletResponse.class,
    javax.servlet.http.HttpSession.class };
    Method mthd = genClass.getMethod("apexec", prmClass); // APPBean的起動(dòng)方法
    Object param[] = { req, res, appSession }; // APPBeann的起動(dòng)方法的參數(shù)的設(shè)定
    mthd.invoke(appBean, param); // APPBean起動(dòng)
    } catch (ClassNotFoundException e) {
    略。。。
    }

    break;
    case 2: // ** JSP 直接調(diào)用 (通過DB自動(dòng)生成bean后) **
    try {
    Class genClass = Class.forName(sWindow + "Bean"); // JSP用Bean名取得+生成
    appBean = genClass.newInstance(); // JSP用Bean的生成
    req.setAttribute(sWindow + "Bean", appBean);
    } catch (ClassNotFoundException e) {
    略。。。
    }
    this.fCallPage(req, res, sWindow + ".jsp"); //觸發(fā)JSP資源
    break;
    case 3: // ** HTML 直接調(diào)用 **

    boolean wSts = this.fCallPage(req, res, sWindow + ".jsp");
    if (wSts == false) {
    errPage(req, res, sWindow + ".jsp/.html",
    "File_Not_Defined!!");
    return;
    }
    break;
    default: // ** 如果沒有定義三種類型之一 **
    //錯(cuò)誤畫面
    errPage(req, res, sWindow + ".jsp/.html",
    "Furiwake_DefinE Not_Defined!!");
    }

    這是MVC中C的部分(UctServlet類)的介紹,相應(yīng)的代碼作為修改,為了理解學(xué)習(xí)之用

    不借助任何web框架結(jié)構(gòu),構(gòu)建自己的MVC應(yīng)用程序(1)?? 有個(gè)論壇

    Feedback

    # re: 不借助任何web框架結(jié)構(gòu),構(gòu)建自己的MVC應(yīng)用程序(1)  回復(fù)  更多評(píng)論   

    2006-10-26 11:52 by 春花秋實(shí)
    關(guān)注一下,順便收藏.

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


    網(wǎng)站導(dǎo)航:
     

    posts - 39, comments - 91, trackbacks - 0, articles - 1

    Copyright © 城市劣人

    好·色之徒
    主站蜘蛛池模板: 国产精品视频全国免费观看 | 免费人成激情视频在线观看冫| 精品久久久久久亚洲| 久久久久免费看成人影片| 久久九九AV免费精品| 国产v亚洲v天堂a无| 亚洲女同成人AⅤ人片在线观看| 99精品视频在线观看免费播放| 亚洲中文字幕久久无码| 亚洲日本中文字幕一区二区三区| 99re免费99re在线视频手机版| jizzjizz亚洲日本少妇| 亚洲av成人无码久久精品| 国产大片免费天天看| 亚洲黄色激情视频| 亚洲色自偷自拍另类小说| 最新中文字幕电影免费观看| 97超高清在线观看免费视频| 亚洲日本在线电影| 国产午夜亚洲精品午夜鲁丝片 | 国产亚洲av片在线观看18女人 | 免费a级毛片在线观看| 久久久久国产精品免费网站| 国产成人亚洲精品蜜芽影院| 亚洲日本乱码一区二区在线二产线| 亚洲 小说区 图片区 都市| 国产午夜亚洲精品不卡电影| 亚洲熟妇av一区| 亚洲人成网站在线观看播放| 凹凸精品视频分类国产品免费| 国产一卡二卡3卡四卡免费| 免费看男人j放进女人j免费看| 牛牛在线精品免费视频观看| 亚洲一区二区三区国产精品无码| 亚洲av无码无在线观看红杏| 亚洲伊人久久成综合人影院| 国产乱弄免费视频| 成年女人免费视频播放77777| 在线a免费观看最新网站| 无码av免费网站| 中文字幕久无码免费久久|