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

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

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

    魅力生活

    用實例學(xué)習(xí)MVC模式

     
    1.1 MVC模式

    MVC是三個單詞的縮寫,這三個單詞分別為:模型(Model)、視圖(View)和控制(Controller)。MVC模式的目的就是實現(xiàn)Web系統(tǒng)的職能分工。下面以J2EE開發(fā)進(jìn)行介紹。
    Model層實現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,通常可以用JavaBean或EJB來實現(xiàn)。
    View層用于與用戶的交互,通常用JSP來實現(xiàn)。
    Controller層是Model與View之間溝通的橋梁,它可以分派用戶的請求并選擇恰當(dāng)?shù)囊晥D以用于顯示,同時它也可以解釋用戶的輸入并將它們映射為模型層可執(zhí)行的操作。
    現(xiàn)在來看一個例子,看MVC模式是怎樣工作的。
    1.1.1 一個實例
    例1-a:
    <servlet>
          <servlet-name>Controller</servlet-name>
          <servlet-class>nepalon.simplestruts.Controller</servlet-class>
    </servlet>  
    <servlet-mapping>
        <servlet-name>Controller</servlet-name>
        <url-pattern>/simplestruts/servlet/control/Controller</url-pattern>
    </servlet-mapping>
    上面是web.xml文件的片段,在這里定義了一個servlet用于處理請求。
    例1-b(Test.jsp文件):
    <html>
    <%@ page contentType="text/html;charset=gb2312"%> 
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>實例首頁</title>
    </head>
    <body>  
    <table border="0" width="100%">
      <tr> 
    <td><div align="center">
    <a href="/simplestruts/servlet/control/Controller?command=showarticle">顯示文章</a>
    </div></td>
      </tr>
    </table>
    </body>
    </html>
    在這個JSP中,我們并沒有直接去調(diào)用JSP或JavaBean,而是把請求分送到Servlet中。下面,我們來看看Servlet的代碼。
    例1-c:
    package nepalon.simplestruts;
    /**
     * <p>Title: MVC framework</p>
     * <p>Description: Controller<p>
     * <p>Copyright: R2003</p>
     * @author Nepalon
     * @version 1.0
     */

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.util.*;


    public class Controller extends HttpServlet  
    {

        public void init(ServletConfig config) throws ServletException 
        {
            super.init(config);
        }

        public void destroy() {}

        /** 用于處理HTTP的GET和POST請求的函數(shù)
        * @param request servlet request
        * @param response servlet response
        */
        protected void processRequest(HttpServletRequest request,HttpServletResponse response)
            throws ServletException, java.io.IOException 
        {        
            //代碼(1)通過if來實現(xiàn)對不同請求的分發(fā) 
            if(request.getParameter("command").equals("showarticle"))
            {
                ArticleCommand command = new ArticleCommand();
                next = command. getAllArticle (request, response);
            }
            //代碼(2)
            dispatch(request, response, next);
        }
        
        protected void doGet(HttpServletRequest request,
                            HttpServletResponse response)
            throws ServletException, java.io.IOException 
        {
            processRequest(request, response);
        }
        
        protected void doPost(HttpServletRequest request,
                             HttpServletResponse response)
            throws ServletException, java.io.IOException 
        {
            processRequest(request, response);
        }

        /** 一個實現(xiàn)了分發(fā)者模式的函數(shù)
        * @param request servlet request
        * @param response servlet response
        */
        protected void dispatch(HttpServletRequest request,
                               HttpServletResponse response,
                               String page)
            throws  javax.servlet.ServletException, java.io.IOException 
        {
            RequestDispatcher dispatcher =
                getServletContext().getRequestDispatcher(page);
            dispatcher.forward(request, response);
        }
    }
    在Servlet中并沒有直接處理所提交的請求,而是把請求的處理推后到ArticleCommand類中,通過ArticleCommand對象來執(zhí)行,如代碼(1)。在處理完請求后,轉(zhuǎn)到相應(yīng)的頁面中,如代碼(2)。下面,我們看一下ArticleCommand類的代碼。
    例1-d:
    package nepalon.simplestruts;

    /**
     * <p>Title: MVC framework</p>
     * <p>Description: 文章業(yè)務(wù)類<p>
     * <p>Copyright: R2003</p>
     * @author Nepalon
     * @version 1.0
     */

    import java.util.*;
    import javax.servlet.*;
    import java.io.*;
    import java.lang.*;
    import java.sql.*;
    import javax.sql.*;

    public class Contribute
    {
        public Contribute() {}
        public String getAllArticle(HttpServletRequest request, HttpServletResponse response)
              throws javax.servlet.ServletException, java.io.IOException
        {
             Connection conn=null;
            String con_user = "example1";
            String con_password = "example1";
            String con_dburl = "jdbc:oracle:thin:@localhost:iasdb";
            String con_driver = "oracle.jdbc.driver.OracleDriver";
            PreparedStatement pstmt=null;
            ResultSet rsComment=null;    
            Vector vectorComment = new Vector();
            String selectSQL= "SELECT content, time FROM article ORDER BY time DESC";
            try
            {
                 DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
                 Class.forName(con_driver);
                 conn = DriverManager.getConnection(con_dburl,con_user,con_password);
                 pstmt=conn.prepareStatement(selectSQL);
                 rsComment=pstmt.executeQuery();
                 while(rsComment.next()) 
                 {
                       CommentItem commentItem = new CommentItem();
                    commentItem.setContent(rsComment.getString(1));
                    commentItem.setTime(rsComment.getDate(2));
                    vectorComment.add(commentItem);
                 }
                 vectorComment.trimToSize();
              }
            catch (Exception e){//做相應(yīng)的處理}
            //代碼(1)保存處理結(jié)果并返回跳轉(zhuǎn)頁面
            request.setAttribute("vectorComment ", vectorComment);
            return "/simplestruts/showallarticle.jsp";
    }
    ……
    public String getNewArticle(HttpServletRequest request, HttpServletResponse response)
              throws javax.servlet.ServletException, java.io.IOException
        {…}
    }
    在這個類中進(jìn)行的是取得所有文章的業(yè)務(wù),最后返回如果成功執(zhí)行操作后要跳轉(zhuǎn)到的頁面。當(dāng)然,這個類中可能還有別的業(yè)務(wù)的相應(yīng)函數(shù),讀者可自己實現(xiàn)。下面看一下要跳轉(zhuǎn)到的頁面的代碼。
    例1-e(showallarticle.jsp文件):
    <html>
    <%@ page contentType="text/html;charset=gb2312"%> 
    <%@ page import="java.util.*, java.lang.*"%>
    <jsp:useBean id="vectorComment" type="java.util.Vector" scope="request"/>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>顯示文章</title>
    </head>
    <body>  
    <table border="0" width="100%">
        
      <tr> 
        <td>發(fā)表時間</td>
            <td>文章內(nèi)容</td>
      </tr>
    <%       
        if (vectorComment!=null && vectorComment.size()>0) 
        {        
            int counter=vectorComment.size();    
            CommentItem commentlist = null;    
            for (int i=0;i<counter;i++)
            {                                                             
                 commentlist=null;        
                 commentlist=(CommentItem)(vectorComment.get(i));     
    %> 
      <tr> 
        <td><%=commentlist.getCmTime()%></td>
            <td><%=commentlist.getCmContent()%></td>
      </tr>
    <%
            }
        }
    %>
    </table>
    </body>
    </html>
    在這個JSP中我們要做的只是取得結(jié)果并顯示,沒有涉及到相應(yīng)的業(yè)務(wù)邏輯。

    1.1.2 實例分析
    首先,我們看一下這個例子的序列圖
     
    圖1.1.2-1
    1)    首先在Veiw層的test.jsp中提交一個請求/simplestruts/servlet/control/Controller?command=showarticle;
    2)    在Controller層的Controller對象中,根據(jù)請求的類型來調(diào)用相應(yīng)的業(yè)務(wù)處理類,在這里,command值為showarticle的請求的業(yè)務(wù)處理類為ArticleCommand類,所以調(diào)用該類的對象的相應(yīng)函數(shù);
    3)    在Model層的ArticleCommand類主要實現(xiàn)請求的取得所有文章的業(yè)務(wù)功能,把結(jié)果保存在request中,并返回跳轉(zhuǎn)頁面作為返回值;
    4)    回到Controller層的Controller對象,根據(jù)上一步驟的返回值進(jìn)行頁面轉(zhuǎn)發(fā)。
    5)    轉(zhuǎn)發(fā)到View層的showallarticle.jsp頁面,這個頁面從request中取得結(jié)果并進(jìn)行顯示。在這個JSP中雖然也有Java代碼,但這些代碼只是用于顯示結(jié)果,并沒有涉及到任何業(yè)務(wù)邏輯。

    1.1.3 MVC模式的好處
    本來這樣一個簡單的功能我們只需要2個JSP文件就能實現(xiàn)了,為什么要這么麻煩把它分到幾個類中去實現(xiàn)呢?現(xiàn)在就來看一下MVC模式帶來的好處。
    1)    各施其職,互不干涉
    在MVC模式中,三個層各施其職,所以如果一旦哪一層的需求發(fā)生了變化,就只需要更改相應(yīng)的層中的代碼而不會影響到其它層中的代碼。假如業(yè)務(wù)發(fā)生了變化,如在取文章時可能webmaster把一些文章作了無效標(biāo)志,不能直接把所有文章取出來,只能取出有效的文章,這時業(yè)務(wù)就發(fā)生了改變。再設(shè)想一下,如果這個業(yè)務(wù)邏輯在100個頁面中都要用到,那么MVC模式就體現(xiàn)了它的靈活性。我們可以不更改任何JSP,只要更改model層中的相應(yīng)類中的SQL語句即可。
    2)    有利于開發(fā)中的分工
    在MVC模式中,由于按層把系統(tǒng)開,那么就能更好的實現(xiàn)開發(fā)中的分工。網(wǎng)頁設(shè)計人員可以進(jìn)行開發(fā)視圖層中的JSP,對業(yè)務(wù)熟悉的開發(fā)人員可開發(fā)業(yè)務(wù)層,而其它開發(fā)人員可開發(fā)控制層。
    3)    有利于組件的重用
    分層后更有利于組件的重用。如控制層可獨立成一個能用的組件,視力層也可做成通用的操作界面。

    posted on 2005-07-13 11:47 cutelife 閱讀(220) 評論(0)  編輯  收藏 所屬分類: JAVA編程


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲av中文无码乱人伦在线r▽| 亚洲级αV无码毛片久久精品| 免费观看的a级毛片的网站| 国产极品粉嫩泬免费观看| 国产aⅴ无码专区亚洲av麻豆| 亚洲第一精品电影网| 日韩在线观看视频免费| 99久久精品日本一区二区免费| 亚洲国产91精品无码专区| 亚洲国产日韩在线成人蜜芽 | 亚洲人成电影院在线观看| 在线免费观看国产| 国产a v无码专区亚洲av| 亚洲综合精品第一页| 一区二区三区福利视频免费观看| 国产精品免费视频网站| 黄色网址在线免费观看| 成人性生免费视频| 亚洲国产电影在线观看| 手机在线毛片免费播放| 看免费毛片天天看| 成人黄页网站免费观看大全| 丰满亚洲大尺度无码无码专线| 台湾一级毛片永久免费 | 免费v片在线观看| 亚洲国产成人久久综合| 免费国产黄线在线观看| 亚洲国产成人综合| 国产大片91精品免费观看男同| 一个人看的免费观看日本视频www| 国产又大又黑又粗免费视频| j8又粗又长又硬又爽免费视频| 亚洲福利精品电影在线观看| 日本免费A级毛一片| 亚洲日韩欧洲乱码AV夜夜摸| a免费毛片在线播放| 久久精品蜜芽亚洲国产AV| 91av在线免费视频| 直接进入免费看黄的网站| 亚洲成a人片在线观看无码专区| A级毛片高清免费视频在线播放|