<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框架

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

    ?

    OK ,我們先來個類圖。

    class digram.jpg

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


    sequece.jpg

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

    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>
    ??????
    // 通過頁面?zhèn)鬟^來的action,以該實例為準(zhǔn),若jsp傳過來的action=100。這時String?action="com.qujingbo.InsertDB"
    ??????
    // web.xml中配置的內(nèi)容可以寫入像struts那種struts-config.xml那種做為配置文件,定義規(guī)范,容器管理。
    ??????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();
    ?????????
    // 調(diào)用execute方法,execute方法調(diào)用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()方法調(diào)用抽象方法doBusiLogic()(其實是按配置具體實現(xiàn)類的doBusiLogic()方法)。有人會有疑惑為什么要用execute()調(diào)用doBusiLogic()方法呢?直接調(diào)用doBusiLogic方法不行嗎?其實這里有個小技巧。就像filter一樣,我們?nèi)绻枰^濾些信息,只要寫在execute()方法最開始就OK,這樣,執(zhí)行任意一個doBusiLogic()方法時,都會調(diào)用execute()方法。結(jié)束也一樣。注釋有說明。
    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?
    {
    ???
    //模板模式,實現(xiàn)類需要實現(xiàn)doBusiLogic方法,在該方法中寫業(yè)務(wù)邏輯
    ???public?abstract?void?doBusiLogic(HttpServletRequest?request,?HttpServletResponse?response)?throws?Exception?;
    ???
    public?void?execute(HttpServletRequest?request,?HttpServletResponse?response)?throws?Exception?
    ???
    {
    ?????????
    //若想在業(yè)務(wù)邏輯前執(zhí)行某方法,寫在這里
    ??????
    //System.out.println?("pre?call");
    ??????doBusiLogic(request,?response);
    ??????
    //若想在業(yè)務(wù)邏輯后執(zhí)行某方法,寫在這里
    ?????????
    //System.out.println?("post?call");
    ???}

    }


    最后介紹要具體實現(xiàn)執(zhí)行業(yè)務(wù)類LoginUser。LoginUser繼承AbstractLogic抽象類,實現(xiàn)doBusiLogic()方法。我們只需在doBusiLogic()方法內(nèi)實現(xiàn)我們的業(yè)務(wù)邏輯就OK。LogicUer中的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?
    {
    ???
    //實現(xiàn)登陸功能
    ???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 ,全部結(jié)束,我們重新理下順序。首選通過 web.xml 配置 servlet FacadeServlet ),通過 url 訪問 FacadeServlet ,以本實例為例, url 地址為 http://yourip:yourport/yourservlet?action=100 ,通過獲取 action=100 ,在 web.xml 中取得對應(yīng)的包名,類名。實例化它,由 FacadeServlet 調(diào)用 execute() 方法, execute 方法調(diào)用的是具體實例化類的 doBusiLogic() 業(yè)務(wù)方法。整個過程結(jié)束。

    posted on 2006-10-16 19:34 曲靜波 閱讀(1666) 評論(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 學(xué)習(xí)程序的都可以來
      回復(fù)  更多評論   


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


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

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(3)

    隨筆分類(9)

    隨筆檔案(8)

    文章分類

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲日韩国产成网在线观看| 少妇亚洲免费精品| 中文亚洲AV片在线观看不卡| 成人午夜大片免费7777| 无码中文字幕av免费放dvd| kk4kk免费视频毛片| 色偷偷尼玛图亚洲综合| 99999久久久久久亚洲| 亚洲最新视频在线观看| 国产亚洲精品一品区99热| 超清首页国产亚洲丝袜| 又粗又黄又猛又爽大片免费 | 日本不卡在线观看免费v| ww4545四虎永久免费地址| 免费在线观看一级片| 国产裸体美女永久免费无遮挡 | 免费人成在线观看播放国产| 成人性生交大片免费看无遮挡| 亚洲视频免费播放| 一区二区在线免费观看| 免费91最新地址永久入口| XXX2高清在线观看免费视频| 一级毛片免费在线播放| 豆国产96在线|亚洲| MM1313亚洲精品无码久久| 亚洲日韩国产AV无码无码精品| 亚洲另类图片另类电影| 亚洲欧洲综合在线| 亚洲精品视频专区| 亚洲国产成人91精品| 亚洲冬月枫中文字幕在线看| 亚洲成人黄色在线观看| 亚洲国产美女精品久久久久| 亚洲精品视频在线免费| 亚洲sss综合天堂久久久| 亚洲中文字幕无码中文| 亚洲国产精品日韩av不卡在线 | 人禽杂交18禁网站免费| 日韩精品无码区免费专区| 永久免费AV无码网站在线观看 | 欧洲美女大片免费播放器视频|