首页 > 开发 > 综合 > 正文

MVC模式概述

2024-07-21 02:15:05
字体:
来源:转载
供稿:网友
    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="http://www.VeVb.com/htmldata/2005-11-17/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中读出数

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表