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

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

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

    好·色之徒
    已經轉移到 好·色之徒--我的博客、我的生活

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

    HttpServlet主要有三個方法:init,service,destroy,這三個需要我們在UctServlet中詳細實現它,先看一段代碼

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

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

    } catch (Exception e) {
    logger.error("UctServlet_init error", e);
    }
    }
    這是在容器啟動的時候觸發的方法,在init方法中,初始化了一些固有的資源,比如ServletContext、數據庫的相關操作,
    這是非常必要的,因為這些資源對整個web系統來說一直需要使用,在init中加以初始化,為整個應用節省了很多不必要的開支,
    也是系統提升性能的關鍵措施之一。

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

    上面兩個方法一看就明白,比較簡潔,最關鍵的方法,也是實現C功能的方法是service方法。
    這里先探討一下接收頁面請求,實現控制資源分配、頁面流轉的要素有哪些?

    一種方式是:所有的請求都交由service來實現,包括數據分析、數據裝配,最后到forward到某一個資源,
    當然可能需要一些輔助的help類,這樣實現的,service方法會變的很龐大,而且請求的變數很大,
    系統從功能上來說很單一,一旦有所變化,那么service方法需要大的改動。這是不可取的。

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

    這是第二種方法,把核心業務都交由bean去處理,service方法主要關注分發這些業務,
    具有更好的擴展性、穩定性,方法也變得簡潔明了,容易維護,推薦使用這樣的方法來實現MVC模式,具體的做法下面給我一些代碼片斷:

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

    //在數據庫中獲取相關處理資源(alink atype)
    if (!sUser.getFuriwake(DBA, sbsWindow, sbsAction)) {
    errPage(req, res, "UctSevlet AP-CALL.IN", "數據庫中沒有定義處理動作");
    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實例的取得
    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的起動方法
    Object param[] = { req, res, appSession }; // APPBeann的起動方法的參數的設定
    mthd.invoke(appBean, param); // APPBean起動
    } catch (ClassNotFoundException e) {
    略。。。
    }

    break;
    case 2: // ** JSP 直接調用 (通過DB自動生成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"); //觸發JSP資源
    break;
    case 3: // ** HTML 直接調用 **

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

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

    不借助任何web框架結構,構建自己的MVC應用程序(1)?? 有個論壇

    Feedback

    # re: 不借助任何web框架結構,構建自己的MVC應用程序(1)  回復  更多評論   

    2006-10-26 11:52 by 春花秋實
    關注一下,順便收藏.

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

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

    Copyright © 城市劣人

    好·色之徒
    主站蜘蛛池模板: 性做久久久久久免费观看| 青柠影视在线观看免费高清| 亚洲一级毛片免费观看| 西西人体44rt高清亚洲| a毛片免费全部播放完整成| 亚洲综合伊人久久综合| 国产黄色片免费看| 亚洲热妇无码AV在线播放| a视频在线观看免费| 亚洲av无码不卡一区二区三区 | 久久丫精品国产亚洲av| 久草免费福利视频| 91情国产l精品国产亚洲区| 日韩插啊免费视频在线观看 | 午夜精品一区二区三区免费视频| 亚洲AV永久纯肉无码精品动漫 | 日韩中文字幕免费视频| 久久久久亚洲AV无码专区首JN| 亚洲三级在线免费观看| 亚洲一区二区三区成人网站| 狠狠久久永久免费观看| 成人午夜影视全部免费看| 亚洲码国产精品高潮在线| 精品熟女少妇av免费久久| 亚洲乱码在线观看| 亚洲综合激情另类专区| 无码国产精品一区二区免费式芒果| 亚洲日本国产乱码va在线观看| 四虎成人免费网址在线| eeuss影院www天堂免费| 久久亚洲AV无码精品色午夜| 在线免费观看污网站| 久久久久久噜噜精品免费直播| 99人中文字幕亚洲区| 国产一级高清视频免费看| 中国精品一级毛片免费播放| 亚洲人成在线中文字幕| 亚洲精品老司机在线观看| 最近中文字幕免费mv在线视频| 美女羞羞免费视频网站| 在线亚洲精品视频|