用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
renco的公告
文章分类
    java
    Java 网络文件传输
    存档

    原创  解析MVC模式 收藏

    MVC模式概述


        MVC是三个单词的缩写,分别为:
    模型(Model),视图(View)和控制Controller)。
    MVC模式的目的就是实现Web系统的职能分工。
      
        Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。 
        View层用于与用户的交互,通常用JSP来实现。
      
        Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

    MVC模式的好处

     
        各施其职,互不干涉
    在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。 
        有利于开发中的分工
    在MVC模式中,由于按层把系统开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开发人员可开发业务层,而其它开发人员可开发控制层。 
        有利于组件的重用
    分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。 

    不同JSP构造的应用



    为什么要组合使用servlet & JSP?
        典型的做法:使用JSP来简化HTML内容的开发与维护 
        对于简单的动态代码,使用由脚本元素调用JAVA代码来完成。 
        对于稍微复杂一些的应用,则可使用脚本元素调用定制的类来完成。(即所谓的help类) 
        对于比较复杂的应用,则使用JAVA BEAN和定制标签
        但,这些是不够的 
        对于复杂的处理过程,从JSP开始做起会难以处理。 
        JSP除了能够带来将实际的代码隔离成单独的类、bean、和定制标签的便利以外,它所隐含的假定是单个页面给出单个基本视图。

    对MVC的误解

        必须采用复杂的框架 
        框架有时很有用 
        Struts 
        JavaServer Faces (JSF) 
        但并非必需! 
        对于大多简单或者适度复杂的应用来说,使用内建的RequestDispatcher就能够很好地实现MVC
        MVC影响整个系统的设计 
        我们可以用MVC来处理单个请求 
        可以将它认为是MVC方案,而非MVC框架。 
        也被称为是模型2方案


    用RequestDispatcher实现MVC

        1. 定义用以表示数据的java bean 
        2. 使用一个servlet处理请求 
        servlet读取请求参数,检查数据的缺失或异常等。 
        3. 填充bean 
        该servlet调用业务逻辑或数据访问代码得到最终的结果。得出的结果被放在第一步中定义的bean中。 
        4. 将bean存储在请求,会话或servlet的上下文中 
        该servlet调用请求、会话或servlet上下文对象的setAttribute存储表达请求结果的bean的引用。


        5. 将请求转发到JSP页面 
         该servlet确定哪个JSP页面适合于处理当前的情形,并使用RequestDispatcher的forward方法将控制转移到那个页面。 
        
        6. 从bean中提取数据 
        JSP页面使用jsp:useBean和与第4步匹配的位置访问之前存储的bean,然后使用jsp:getProperty输出bean的属性。 
        JSP页面并不创建或修改bean;它只是提取并显示由servlet创建的数据。

    jsp:useBean在MVC中的使用与在
    独立JSP页面中有什么不同
        JSP页面不应该创建对象 
        应该由servlet创建所有的数据对象。因此,为了保证JSP页面不会创建对象,我们应该使用<jsp:useBean ... type=“package.Class” />
    而不是
    <jsp:useBean ... class="package.Class" />
        JSP页面也不应该修改已有的对象 
        因此,我们应该只使用jsp:getProperty,不使用jsp:setProperty
    。 提示:jsp:useBean的scope选项
        request 
        <jsp:useBean id="..." type="..." scope="request" />
        session 
        <jsp:useBean id="..." type="..." scope="session" />
        application 
        <jsp:useBean id=".." type=".." scope="application" />
        page 
        <jsp:useBean id=“...” type=“...” scope=“page” />
    或者仅仅使用<jsp:useBean id="..." type="..." /> 
        MVC (Model 2)构架不使用这个scope。

    不同数据共享方式
        向用户显示一个随机的数字。 
        由于每次请求应该产生新的数字,因而基于请求的共享是恰当的。 
        
        显示用户的姓和名 
        数据要为每个客户存储,因而基于会话的共享比较适用。 
        
        显示一个指定长度的质数。 
        数据在多个客户间共享,因此,基于应用的共享比较恰当。

    基于请求的数据共享
        Servlet 
        ValueObject value = new ValueObject(...); 
        request.setAttribute("key", value); 
        RequestDispatcher dispatcher = 
    request.getRequestDispatcher("/WEB-INF/SomePage.jsp"); 
        dispatcher.forward(request, response); 

        JSP 
    <jsp:useBean id="key" type="somePackage.ValueObject" 
    scope="request" /> 
    <jsp:getProperty name="key" property="someProperty" />

    基于会话的数据共享
        Servlet 
    ValueObject value = new ValueObject(...); 
    HttpSession session = request.getSession(); 
    session.setAttribute("key", value); 
    RequestDispatcher dispatcher = 
    request.getRequestDispatcher("/WEB-INF/SomePage.jsp"); 
    dispatcher.forward(request, response); 

        JSP 
    <jsp:useBean id="key" type="somePackage.ValueObject" 
    scope="session" /> 
    <jsp:getProperty name="key" property="someProperty" />

    基于ServletContext的数据共享
        Servlet 
        synchronized(this) 
        { 
            ValueObject value = new ValueObject(...); 
            getServletContext().setAttribute("key", value); 
            RequestDispatcher dispatcher = 
            request.getRequestDispatcher("/WEB-INF/SomePage.jsp"); 
            dispatcher.forward(request, response); 
        } 

        JSP 
    <jsp:useBean id="key" type="somePackage.ValueObject“ scope="application" /> 
    <jsp:getProperty name="key" property="someProperty" />

    JSP页面中的相对URL
        问题: 
        使用请求分配器进行的转发对客户来说是透明的。初始的URL是浏览器惟一知道的URL。 
        为什么这会比较重要? 
        浏览器会如何处理类似下面的这些标签: 
            <IMG SRC="foo.gif" …> 
            <LINK REL=STYLESHEET 
            HREF="JSP-Styles.css" TYPE="text/css"> 
            <A HREF="bar.jsp">…</A> 
        答案:浏览器将会把它们看作是相对于servlet的URL 
        
        最简单的解决方案: 
        使用以斜杠开始的URL

    Summary
        MVC (Model 2) 方式适用于: 
        单次提交会产生多个基本外观。 
        几个页面拥有大量公共的处理过程。 
        需要为同样的数据提供多个视图的应用程序,它很好地实现了数据层与表示层的分离,特别适用于开发与用户图形界面有关的应用程序 
        
        构架 
        由一个servlet应答初始的请求 
        Servlet完成实际的数据处理并将结果存储在bean中 
        Bean存储在HttpServletRequest, HttpSession, 或ServletContext中 
        Servlet使用RequestDispatcher的forward方法将请求转发到JSP页面 
        JSP页面通过使用jsp:useBean和相应的作用域(request, session, application)从bean中读出数

    发表于 @ 2005年11月13日 18:54:00 | 评论( loading... ) | 编辑| 举报| 收藏

    旧一篇:J2EE MVC模式JSF与Struts的异同 | 新一篇:技术交流:QuickTime流媒体和Java(图)

    • 发表评论
    • 评论内容:
    •  
    Copyright © renco
    Powered by CSDN Blog