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

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

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

    JAVA隨筆

     

    使用fa?ade、template pattern搭建MVC框架

    網絡上有很多介紹 MVC 的理論知識(至于理論知識,我們不多做介紹),我也看到了一些其他人員開發的基于 MVC 的框架。對此我也有些自己的見解。通過使用 fa?ade,template,factory pattern 搭建了一個簡易的 MVC 框架。

    ?

    OK ,我們先來個類圖。

    class digram.jpg

    介紹下各自類的用途, FacadeServlet 主要應用為分發類,而 AbstractLogic 應用了 template pattern ,它是一個抽象類,包括一個抽象方法 doBusiLogic(HttpServletRequest request, HttpServletResponse response) 方法。像 struts 一樣,若新增一個 controller ,需新增一個實現 Action execute() 方法的類。在 struts-config.xml 中配置,通過頁面 url 確定執行哪個類的。在本實例中執行 doBusiLogic(HttpServletRequest request, HttpServletResponse response) 方法(注: struts 中根據配置執行方法不一樣)。有點糊涂,別急,來個時序圖,詳細說明。


    sequece.jpg

    首先通過 URL 訪問 FacadeServlet FacadeServlet 在全局應用中只存在一個。取得具體配置實現類(有點像 struts 應用。通過 java 反射機制實例化配置類。調用 execute() 方法分發。代碼如下(含注釋):

    package ?com.qujingbo;

    import ?javax.servlet.http.HttpServlet;
    import ?javax.servlet.http.HttpServletRequest;
    import ?javax.servlet.http.HttpServletResponse;
    import ?javax.servlet.ServletException;
    import ?java.io.IOException;
    /**
    ?*?<p/>?Title:
    ?*?</p>
    ?*?<p/>?Description:
    ?*?</p>
    ?*?<p/>?Date:2004-9-7?14:50:25
    ?*?</p>
    ?*?
    ?*?
    @author ?EOMS?曲靜波
    ?*?
    @version ?1.0
    ?
    */

    public ? class ?FacadeServlet? extends ?HttpServlet?
    {
    ???
    public ? void ?doPost(HttpServletRequest?request,?HttpServletResponse?response)? throws ?ServletException,?IOException?
    ???
    {
    ?????????
    // 在web.xml中配置
    ?????????
    // <servlet>
    ???????
    // <servlet-name>FacadeServlet</servlet-name>
    ???????
    // <servlet-class>FacadeServlet</servlet-class>?
    ??????
    // <init-param>
    ????????
    // <param-name>100</param-name>
    ??????
    // <param-value>com.qujingbo.InsertDB</param-value>
    ??????
    // </init-param>
    ??????
    // <init-param>
    ????????
    // <param-name>101</param-name>
    ??????
    // <param-value>com.qujingbo.LoginCheckBusiLogic</param-value>
    ??????
    // </init-param>
    ??????
    // </servlet>
    ??????
    // 通過頁面傳過來的action,以該實例為準,若jsp傳過來的action=100。這時String?action="com.qujingbo.InsertDB"
    ??????
    // web.xml中配置的內容可以寫入像struts那種struts-config.xml那種做為配置文件,定義規范,容器管理。
    ??????String?action? = ?request.getParameter( " action " );
    ??????
    if (action? == ? null ? || ? "" .equals(action))?
    ??????
    {
    ?????????System.out.println(
    " no?action " );
    ?????????
    return ;
    ??????}

    ??????
    try ?
    ??????
    {
    ???????????
    // 通過java反射機制實例化com.qujingbo.InsertDB
    ?????????String?strClassName? = ? this .getInitParameter(action);
    ?????????Class?cls?
    = ?Class.forName(strClassName);
    ?????????AbstractLogic?_AbstractLogic?
    = ?(AbstractLogic)cls.newInstance();
    ?????????
    // 調用execute方法,execute方法調用com.qujingbo.LoginUser類的doBusiLogic()方法?????????
    ?????????_AbstractLogic.execute(request,?response);
    ??????}

    ??????
    catch (java.lang.Exception?cfe)?
    ??????
    {
    ?????????cfe.printStackTrace();
    ??????}

    ???}

    ???
    public ? void ?doGet(HttpServletRequest?request,?HttpServletResponse?response)? throws ?ServletException,?IOException?
    ???
    {
    ??????doPost(request,?response);
    ???}

    }


    給出它的
    web.xml
    <?xml?version="1.0"??>
    <!DOCTYPE?web-app?PUBLIC?"-//Sun?Microsystems,?Inc.//DTD?Web?Application?2.3//EN"?"http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    ??
    <welcome-file-list>
    ????
    <welcome-file>index.jsp</welcome-file>
    ??
    </welcome-file-list>

    ??
    <servlet>
    ?????
    <servlet-name>FacadeServlet</servlet-name>
    ?????
    <servlet-class>FacadeServlet</servlet-class>?
    ????
    <init-param>
    ??????
    <param-name>100</param-name>
    ????
    <param-value>com.qujingbo.LoginUser</param-value>
    ????
    </init-param>
    </servlet>
    ????
    <servlet-mapping>
    ????????
    <servlet-name>FacadeServlet</servlet-name>
    ????????
    <url-pattern>FacadeServlet</url-pattern>
    ????
    </servlet-mapping>

    </web-app>

    下一步介紹AbstractLogic這個抽象類。該類包含兩個方法。execute()方法調用抽象方法doBusiLogic()(其實是按配置具體實現類的doBusiLogic()方法)。有人會有疑惑為什么要用execute()調用doBusiLogic()方法呢?直接調用doBusiLogic方法不行嗎?其實這里有個小技巧。就像filter一樣,我們如果需要過濾些信息,只要寫在execute()方法最開始就OK,這樣,執行任意一個doBusiLogic()方法時,都會調用execute()方法。結束也一樣。注釋有說明。
    package?com.qujingbo;

    import?javax.servlet.http.HttpServletRequest;
    import?javax.servlet.http.HttpServletResponse;
    /**
    ?*?<p/>?Title:
    ?*?</p>
    ?*?<p/>?Description:
    ?*?</p>
    ?*?<p/>?Date:2004-9-7?14:50:25
    ?*?</p>
    ?*?
    ?*?
    @author?EOMS?曲靜波
    ?*?
    @version?1.0
    ?
    */

    public?abstract?class?AbstractLogic?
    {
    ???
    //模板模式,實現類需要實現doBusiLogic方法,在該方法中寫業務邏輯
    ???public?abstract?void?doBusiLogic(HttpServletRequest?request,?HttpServletResponse?response)?throws?Exception?;
    ???
    public?void?execute(HttpServletRequest?request,?HttpServletResponse?response)?throws?Exception?
    ???
    {
    ?????????
    //若想在業務邏輯前執行某方法,寫在這里
    ??????
    //System.out.println?("pre?call");
    ??????doBusiLogic(request,?response);
    ??????
    //若想在業務邏輯后執行某方法,寫在這里
    ?????????
    //System.out.println?("post?call");
    ???}

    }


    最后介紹要具體實現執行業務類LoginUserLoginUser繼承AbstractLogic抽象類,實現doBusiLogic()方法。我們只需在doBusiLogic()方法內實現我們的業務邏輯就OKLogicUer中的doBusiLogic()方法模擬了一個登陸過程。

    package?com.qujingbo;

    import?javax.servlet.http.HttpServletRequest;
    import?javax.servlet.http.HttpServletResponse;
    import?javax.naming.Context;
    import?javax.naming.InitialContext;
    import?javax.sql.DataSource;
    import?java.sql.Connection;
    import?java.sql.ResultSet;
    import?java.sql.Statement;
    import?javax.rmi.PortableRemoteObject;
    import?loginEjbPac.LoginHome;
    import?loginEjbPac.Login;
    /**
    ?*?<p/>?Title:
    ?*?</p>
    ?*?<p/>?Description:
    ?*?</p>
    ?*?<p/>?Date:2004-9-7?14:50:25
    ?*?</p>
    ?*?
    ?*?
    @author?EOMS?曲靜波
    ?*?
    @version?1.0
    ?
    */

    public?class?LoginUser?extends?AbstractLogic?
    {
    ???
    //實現登陸功能
    ???public?void?doBusiLogic(HttpServletRequest?request,?HttpServletResponse?response)?throws?Exception?
    ???
    {
    ??????System.out.println(
    "LoginUser");
    ??????Context?ctxt?
    =?null;
    ??????ctxt?
    =?new?InitialContext();
    ??????DataSource?ds?
    =?(DataSource)ctxt.lookup("jbPoolJndi");
    ??????Connection?con?
    =?ds.getConnection();
    ??????Statement?stmt?
    =?con.createStatement();
    ??????ResultSet?rs?
    =?stmt.executeQuery("select?*?from?test");
    ??????
    //模擬登陸
    ??????if(rs.next())?
    ?????????System.out.println(rs.getString(
    "name"));
    ??????System.out.println(
    "LoginEJB");
    ??????LoginHome?home?
    =?(LoginHome)PortableRemoteObject.narrow(ctxt.lookup("LoginEJBRemote"),?LoginHome.class);
    ??????Login?remote?
    =?home.create();
    ??????
    if(remote.checkLoginUser("aa"))?
    ?????????System.out.println(
    "EJB?success");
    ??????remote.remove();
    ???}

    }


    OK ,全部結束,我們重新理下順序。首選通過 web.xml 配置 servlet FacadeServlet ),通過 url 訪問 FacadeServlet ,以本實例為例, url 地址為 http://yourip:yourport/yourservlet?action=100 ,通過獲取 action=100 ,在 web.xml 中取得對應的包名,類名。實例化它,由 FacadeServlet 調用 execute() 方法, execute 方法調用的是具體實例化類的 doBusiLogic() 業務方法。整個過程結束。

    posted on 2006-10-16 19:34 曲靜波 閱讀(1667) 評論(1)  編輯  收藏 所屬分類: design pattern

    評論

    # re: 使用façade、template pattern搭建MVC框架 2006-10-18 14:42 123bingbing

    增開7群,號碼 30440732
    8群 30756649
    9群 30178567
    10群 28694497

    我們的qq群:15096318 學習程序的都可以來
      回復  更多評論   


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


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(3)

    隨筆分類(9)

    隨筆檔案(8)

    文章分類

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲毛片免费观看| 巨胸喷奶水www永久免费| 免费A级毛片无码A∨ | 亚洲高清视频免费| 久久国产精品亚洲一区二区| 久久免费香蕉视频| 亚洲av无码精品网站| 最新国产乱人伦偷精品免费网站 | 亚洲人成电影网站色| 国产精品免费看香蕉| 麻豆安全免费网址入口| 国产性爱在线观看亚洲黄色一级片 | 亚洲精品成a人在线观看☆| 国产jizzjizz免费看jizz| 免费国产污网站在线观看不要卡| 亚洲精品国产va在线观看蜜芽| 九九九精品视频免费| 国产亚洲综合久久系列| 精品一区二区三区无码免费视频| 亚洲国产精品一区二区久| 毛片免费在线观看网址| 美女裸免费观看网站| 亚洲国产精品成人久久| 蜜桃AV无码免费看永久| 精品国产_亚洲人成在线| 狠狠综合久久综合88亚洲| 999久久久免费精品播放| 亚洲国产综合精品中文第一| 亚洲av无码不卡私人影院| 精品亚洲永久免费精品| 亚洲校园春色小说| 凹凸精品视频分类国产品免费| 美女视频黄a视频全免费网站色窝| 亚洲人成激情在线播放| 亚洲国产成人五月综合网| 久久99热精品免费观看牛牛| 亚洲成a人片在线观看天堂无码| 亚洲欧洲美洲无码精品VA| 在线观看免费人成视频| 女同免费毛片在线播放| 亚洲Av永久无码精品黑人|