加载头像

第七章 MVC 模式

7.1 MVC 模式介绍

模型 - 视图 - 控制器(Model-View-Controller),简称为 MVC,MVC 已经成为软件设计者必须熟练使用的开发模式。

MVC 是一种通过三部分构造一个软件或组件的理想办法。

用于存储数据的对象。

向控制器提交所需数据、显示模型中的数据。

负责具体的业务逻辑操作,即控制器根据视图提出的要求对数据做出(商业)处理,将有关结果存储到模型中,并负责让模型和视图进行必要的交互,当模型中的数据变化时,让视图更新显示。

从面向对象的角度看,MVC 开发模式可以使程序容易维护,也更容易扩展。在设计程序时,可以将某个对象看作“模型”,然后为“模型”提供恰当的显示组件,即“视图”。在 MVC 模式中,“视图”“模型”和“控制器”之间是松耦合结构,便于系统的维护和扩展。

7.2 JSP 中的 MVC 模式

目前,随着软件规模的扩大,MVC 模式正在被运用到各种应用程序的设计中。那么在 JSP Web 程序设计中,MVC 模式是怎样具体体现的呢?

我们已经知道,JSP 页面擅长数据的显示,即适合作为用户的视图,例如,JSP 页面里可以有 HTML 标记、JavaScript、CSS、Java 表达式等。避免使用大量的 Java 程序片来进行数据的逻辑处理。servlet 擅长数据的处理,应当尽量避免在 servlet 中使用 out 流输出大量的 HTML 标记来显示数据,否则一旦要修改显示外观就要重新编译 servlet。

一些小型的 Web 应用可以使用 JSP 页面调用 JavaBean 完成数据的处理,实现代码复用。在 JSP+JavaBean 模式中,JavaBean 不仅要提供修改和返回数据的方法,而且要经常参与数据的处理。当 Web 应用变得复杂时,我们希望 JavaBean 仅仅负责提供修改和返回数据的方法即可,不必参与数据的具体处理,而是把数据的处理交给称作控制器的 servlet 对象去完成,即 servlet 控制器负责处理数据,并将有关的结果存储到 JavaBean 中,实现存储与处理的分离。负责视图功能的 JSP 页面可以使用 Java 程序片或用 JavaBean 标记显示 JavaBean 中的数据。

在 JSP 中,MVC 模式的实现如下图所示:

7-1 MVC 模式

  • 模型(Model)

    一个或多个 JavaBean 对象,用于存储数据。

    JavaBean 主要提供简单的 set 方法和 get 方法,在这些方法中不涉及对数据的具体处理细节,以便增强模型的通用性。

  • 视图(View)

    一个或多个 JSP 页面,其作用是向控制器提交必要的数据和显示数据。

    JSP 页面可以使用 HTML 标记、JavaBean 标记以及 Java 程序片或 Java 表达式来显示数据。视图的主要工作就是显示数据,对数据的逻辑操作由控制器负责

  • 控制器(Controller)

    一个或多个 servlet 对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到 JavaBean 中,然后 servlet 使用转发或重定向的方式请求视图中的某个 JSP 页面显示数据。

    例如让某个 JSP 页面通过使用 JavaBean 标记、Java 程序片或 Java 表达式显示控制器存储在 JavaBean 中的数据。

7.3 模型的生命周期与视图更新

使用 MVC 模式和 JSP+JavaBean 模式有很大不同。

在 JSP+JavaBean 模式中,由 JSP 页面通过使用 useBean 标记:

1
<jsp:useBean id="bean 名字" class="创建 bean 的类" scope="生命周期"/>

创建 bean。

而在 MVC 模式中,由控制器 servlet 创建 bean,并将有关数据存储到所创建的 bean 中,然后 servlet 请求某个 JSP 页面使用 getProperty 标记

1
<jsp:getProperty name="bean 名字" property="bean 的属性"/>

显示 bean 中的数据。

在 MVC 模式中,当使用控制器 servlet 创建 bean 时,就可以使用 bean 类的带参数的构造方法。类中的方法的命名继续保留 getXxx 规则,但可以不遵守 setXxx 规则。理由是:在 MVC 模式中,我们不希望 JSP 页面修改 JavaBean 中的数据,只需要它显示 bean 中的数据。

在 MVC 模式中,servlet 创建的 bean 也涉及生命周期。生命周期分为 request bean、session bean 和 application bean。

request bean

bean 的创建

servlet 创建 request bean 的步骤如下:

  1. 用 BeanClass 类的某个构造方法创建 bean 对象,例如:

    1
    BeanClass bean = new BeanClass();
  2. 将所创建的 bean 对象存放到 HttpServletRequest 对象 request 中,并指定查找该 bean 的 id。该步骤决定了 bean 为 request bean。例如:

    1
    request.setAttribute("keyword", bean);

    执行上述操作,就会把 bean 存放到 Tomcat 服务器管理的内置对象 pageContext 中,该 bean 被指定的 id 是 keyWord,生命周期是 PageContext.REQUEST_SCOPE(request)

视图更新

在 MVC 模式中,由 servlet(控制器)负责根据模型中数据的变化通知 JSP 页面(视图)更新,其手段是使用转发,即使用 RequestDispatcher 对象向某个 JSP 页面发出请求,让所请求的 JSP 页面显示 bean(模型)中的数据(不能使用重定向,即不能用 sendRedirect 方法)。

因为 servlet 创建 bean 的步骤 2 决定了 bean 为 request bean,因此,当 servlet 使用 RequestDispatcher 对象向某个 JSP 页面发出请求时(进行转发操作),该 request bean 只对 servlet 所请求的 JSP 页面有效,该 JSP 页面对请求作出响应之后,request bean 所占有的内存被释放,结束自己的生命。

servlet 请求一个 JSP 页面,例如 show.jsp 的代码如下:

1
2
RequestDispatcher dispatcher = request.getRequestDispatcher("show.jsp");
dispatcher.forward(request,response);

servlet 所请求的 JSP 页面,例如 show.jsp 页面可以使用如下标记获得 servlet 所创建的 request bean:

1
<jsp:useBean id="keyWord" class="save.data.BeanClass" scope="request"/>

id 的值是 servlet 创建 request bean 时,为 bean 指定的关键字。然后 JSP 页面可以使用相应的标记或 Java 程序片显示该 request bean 中的数据,例如使用如下标记显示 request bean 中的数据:

1
<jsp:getProperty name="keyWord" property="bean 的变量"/>

如果上述代码执行成功,用户就看到了 show.jsp 页面显示 request bean 中的数据的效果。

session bean

bean 的创建

servlet 创建 session bean 的步骤如下:

  1. 用 BeanClass 类的某个构造方法创建 bean 对象,例如:

    1
    BeanClass bean = new BeanClass();
  2. 将所创建的 bean 对象存放到 HttpServletSession 对象 session 中,并指定查找该 bean 的 id。该步骤决定了 bean 为 session bean。例如:

    1
    2
    HttpSession session = request.getSession(true);
    session.setAttribute("keyWord", bean);

    内置对象执行上述操作,就会把 bean 存放到 Tomcat 服务器管理的内置对象 pageContext 中,该 bean 被指定的 id 是 keyWord,生命周期是 PageContext.SESSION_SCOPE(session)

视图更新

servlet 创建 bean 的步骤 2 决定了 bean 为 session bean,只要用户的 session 没有消失,该 session bean 就一直存在。

Web 服务目录的各个 JSP 都可以使用如下标记获得 servlet 所创建的 session bean:

1
<jsp:useBean id="keyWord" class="save.data.BeanClass" scope="session"/>

id 的值是 servlet 创建 session bean 时,为 bean 指定的关键字,然后使用相应的标记或程序片显示该 session bean 中的数据,例如使用如下标记显示该 session bean 中的数据:

1
<jsp:getProperty name="keyWord" property="bean 的变量"/>

对于 session bean,如果 servlet 希望某个 JSP 显示其中的数据,可以使用 RequestDispatcher 对象转发到该页面,也可以使用 HttpServletResponse 类中的重定向方法(sendRedirect)定向到该页面。

需要注意的是,不同用户的 session bean 是互不相同的,即占有不同的内存空间。

application bean

bean 的创建

servlet 创建 application bean 的步骤如下:

  1. 用 BeanClass 类的某个构造方法创建 bean 对象,例如:

    1
    BeanClass bean = new BeanClass();
  2. servlet 使用 getServletContext 方法返回服务器的 ServletContext 内置对象的引用,将所创建的 bean 对象存放到服务器这个 ServletContext 内置对象中,并指定查找该 bean 的关键字。该步骤决定了 bean 的生命周期为 application。例如:

    1
    getServletContext().setAttribute("keyword", bean);

    这样就会把 bean 存放到 Tomcat 服务器管理的内置对象 pageContext 中,该 bean 被指定的 id 是 keyWord,生命周期是 PageContext.APPLICATION_SCOPE(application)

视图更新

servlet 创建 bean 的步骤 2 决定了 bean 为 application bean。当 servlet 创建 application bean 后,只要 Tomcat 服务器不关闭,该 bean 就一直存在。

一个用户在访问 Web 服务目录的各个 JSP 中都可以使用如下标记标记获得 servlet 所创建的 application bean:

1
<jsp:useBean id="keyWord" class="save.data.BeanClass" scope="application"/>

id 的值是 servlet 创建 application bean 时为 bean 指定的关键字,然后使用相应的标记或程序片显示该 application bean 中的数据、例如使用如下标记显示该 application bean 中的数据:

1
<jsp:getProperty name="keyWord" property="bean"/>

对于 application bean,如果 servlet 希望某个 JSP 显示其中的数据,可以使用 RequestDispatcher 对象向该 JSP 页面发出请求,也可以使用 HttpServletResponse 类中的重定向方法(sendRedirect)。

需要注意的是,所有用户在同一个 Web 服务目录中的 application bean 是相同的,即占有相同的内存空间。

习题 7

  1. 在 JSP 中,MVC 模式中的数据模型的角色由谁担当?

    答:MVC 模式中的数据模型的角色由 JavaBean 担当。

  2. 在 JSP 中,MVC 模式中的控制器的角色由谁担当?

    答:MVC 模式中的控制器的角色由 servlet 担当。

  3. 在 JSP 中,MVC 模式中的视图的角色由谁担当?

    答:MVC 模式中的视图的角色由 JSP 页面担当。

  4. MVC 的好处是什么?

    答:从面向对象的角度看,MVC 开发模式可以使程序容易维护,也更容易扩展。在设计程序时,可以将某个对象看作“模型”,然后为“模型”提供恰当的显示组件,即“视图”。在 MVC 模式中,“视图”“模型”和“控制器”之间是松耦合结构,便于系统的维护和扩展。

  5. MVC 模式中用到的 JavaBean 是由 JSP 页面还是 servlet 负责创建?

    答:MVC 模式中用到的 JavaBean 是由 servlet 负责创建。


返回目录 上一章 下一章
avatar
这有关于产品、设计、开发相关的问题和看法,还有文章翻译分享
相信你可以在这里找到对你有用的知识教程
博客快捷键
shift K
关闭快捷键功能
shift A
打开/关闭中控台
shift M
播放/暂停音乐
shift D
深色/浅色显示模式
shift S
站内搜索
shift R
随机访问
shift H
返回首页
shift L
友链页面
shift P
关于本站
shift I
原版/本站右键菜单
引用到评论
随便逛逛博客分类文章标签
复制地址关闭热评深色模式轉為繁體