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

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

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

    好·色之徒

    前言:
    雖然現(xiàn)在ssh開(kāi)發(fā)滿天飛,但是對(duì)于初學(xué)者來(lái)說(shuō),未必是好事,從基礎(chǔ)學(xué)起,一步一個(gè)腳印,也許對(duì)他們來(lái)說(shuō)更好。更多詳情請(qǐng)參見(jiàn):我的博客 我的生活


    接下來(lái)的時(shí)間里,講解一個(gè)struts的簡(jiǎn)單案例,從基礎(chǔ)學(xué)起,有興趣的朋友可以慢慢看來(lái)。

    概要:Front Controller(模式)

    說(shuō)明:
    講解struts具體例子之前,先說(shuō)明一下Front Controller模式(前端控制器模式)。struts就是它的具體實(shí)現(xiàn),得以擴(kuò)展,并且是Model2結(jié)構(gòu)的完整實(shí)現(xiàn)。

    Model2結(jié)構(gòu)通過(guò)一個(gè)控制組件來(lái)接受請(qǐng)求,這個(gè)控制組件本身可以為請(qǐng)求提供服務(wù),也可以把這項(xiàng)任務(wù)分配給其他一些組件。生成響應(yīng)信息的任務(wù)接著被分配給適當(dāng)?shù)囊晥D組件。實(shí)現(xiàn)這種要求的方式很多,F(xiàn)ront Controller就是其中一種。
    20080726-1.gif
    實(shí)現(xiàn)前端控制器可以采取不同的策略,一種典型的策略是使用一個(gè)servlet
    問(wèn)題:如果把所有的功能集中起來(lái)會(huì)出現(xiàn)一個(gè)大而臃腫的控制器組件,它將負(fù)責(zé)整個(gè)Web的
    相關(guān)處理。
    解決:辦法之一是使用多個(gè)前端控制器,分別負(fù)責(zé)某一方面的處理任務(wù)
    另一種解決方案是使用Command and Controller(命令與控制器)(稍候介紹)

    下面是這種Front Controller模式示例程序框架實(shí)現(xiàn):
    public class FrontController extends HttpServlet {
    protected void processRequest(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    RequestDispatcher dispatcher =
    getServletContext().getRequestDispatcher(nextView);
    dispatcher.forward(req, res);
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    processRequest(req, res);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    processRequest(req, res);
    }
    }

    在這里,它只是HttpServlet一個(gè)簡(jiǎn)單的擴(kuò)充,默認(rèn)實(shí)現(xiàn)了doGet()和doPost()方法,這兩個(gè)方法負(fù)責(zé)把請(qǐng)求分配給另一個(gè)叫processRequest()的方法。這是為了保證不論發(fā)出什么請(qǐng)求,前端控制器都能為之提供服務(wù)。
    在processRequest()的方法中我們省去主要部分,但實(shí)際上前端控制器將先執(zhí)行與請(qǐng)求關(guān)聯(lián)的處理,然后再把它分配給一個(gè)視圖組件來(lái)生成相關(guān)的 響應(yīng)信息。視圖組件一般是JSP頁(yè)面??刂破魍瓿闪俗约旱臉I(yè)務(wù)邏輯之后,它就可以通過(guò)RequestDispatcher把處理分配給一個(gè)JSP。
    到此你可能會(huì)提出一個(gè)問(wèn)題。如果控制器要負(fù)責(zé)處理所有的請(qǐng)求,那么它怎么知道各請(qǐng)求都是什么以及如何處理呢?(Command and Controller,上面問(wèn)題所提到的,現(xiàn)在開(kāi)始講解)

    Command and Controller策略
    在Command and Controller策略中,處理每個(gè)具體請(qǐng)求的邏輯被轉(zhuǎn)移到了一個(gè)單獨(dú)的組件中。
    20080726-2.gif
    這些額外組件各表示一個(gè)具體的命令(或操作,既action),并且組件中封裝著執(zhí)行相關(guān)操作的邏輯。
    前端控制器把對(duì)請(qǐng)求的處理分配給適當(dāng)?shù)拿罱M件。
    操作類
    為了實(shí)現(xiàn)Command and Controller策略,首先需要定義位于控制器和操作組件之間的接口。
    public abstract class Action {
    public abstract String process(HttpServletRequest req, HttpServletResponse res);
    }

    關(guān)于請(qǐng)求類型的通信
    這里的處理如下:FrontController Servlet和URI/controller/*之間定義了一個(gè)映射
    <servlet>
    <servlet-name>FrontController</servlet-name>
    <servlet-class>com.wxhx.controller.FrontController</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>FrontController</servlet-name>
    <url-pattern>/controller/*</url-pattern>
    </servlet-mapping>

    為了從附加路徑信息中獲得的字符串映射到一個(gè)特定的操作實(shí)例上,當(dāng)然,同樣有很多策略可供選擇,其中最靈活的就是把這種映射外部化,例如可以通過(guò)一個(gè)XML文件。
    為了簡(jiǎn)單起見(jiàn),我們?cè)谶@里建立一個(gè)單獨(dú)的組件,用于封裝這種映射。
    public class ActionHelper {
    private static HashMap actions = new HashMap();
    static {
    actions.put(”Login”, “com.sample.LoginAction”);
    }
    public static Action getAction(String name) {
    Action action = null;
    try {
    Class c = Class.forName((String) actions.get(name));
    action = (Action) c.newInstance();
    } catch (Exception e) {
    e.printStackTrace();
    }
    return action;
    }
    }
    好了,以上就是要實(shí)現(xiàn)的一個(gè)簡(jiǎn)單的框架類FrontController,Action以及輔助的ActionHelper類

    下一步是把所有這些處理插入到FrontController的processRequest方法中,這將是Web應(yīng)用程序中所有請(qǐng)求的單一入口:
    public class FrontController extends HttpServlet {
    protected void processRequest(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    String actionName =req.getPathInfo().substring(1);
    Action action =ActionHelper.getAction(actionName);

    String nextView =action.process(req, res);

    RequestDispatcher dispatcher =
    getServletContext().getRequestDispatcher(nextView);
    dispatcher.forward(req, res);
    }

    protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    processRequest(req, res);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    processRequest(req, res);
    }
    }

    具體相關(guān)內(nèi)容可參見(jiàn)實(shí)例!

    Feedback

    # re: struts簡(jiǎn)單案例-適合初學(xué)者(一)  回復(fù)  更多評(píng)論   

    2008-07-31 03:15 by 深圳旅游資訊網(wǎng)
    強(qiáng)人

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


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

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

    Copyright © 城市劣人

    好·色之徒
    主站蜘蛛池模板: a级毛片100部免费观看| 亚洲性色AV日韩在线观看| 污网站在线免费观看| 国内精品免费视频自在线| 亚洲伊人久久大香线蕉| 亚洲一区免费观看| 亚洲黄色在线网站| 一级毛片在线免费看| 亚洲第一精品在线视频| 久久国产精品一区免费下载| 亚洲∧v久久久无码精品| 不卡视频免费在线观看| 亚洲不卡中文字幕无码| 久久午夜夜伦鲁鲁片无码免费| 久久精品亚洲综合| 曰批视频免费40分钟试看天天| 亚洲午夜一区二区电影院| 成人免费视频网址| 国内成人精品亚洲日本语音| 免费a在线观看播放| 精品无码一级毛片免费视频观看| 久久久久久亚洲精品| 亚洲三级在线免费观看| 亚洲香蕉久久一区二区三区四区| 毛色毛片免费观看| 又粗又长又爽又长黄免费视频| 国产亚洲美女精品久久久| 91人成网站色www免费下载| 亚洲黄色激情视频| 免费a级黄色毛片| 精品一卡2卡三卡4卡免费视频| 久久狠狠高潮亚洲精品| 成全高清视频免费观看| 污网站免费在线观看| 久久亚洲精品成人| 永久在线毛片免费观看| a级精品九九九大片免费看| 亚洲欧洲日本在线观看| 中文字幕亚洲第一| 成年私人影院免费视频网站| jizz在线免费播放|