java web 开发——第七章MVC模式


前言

本章将介绍 MVC 模式,MVC 模式的核心思想是将“模型关视图”和“控制器?进行有效组合。掌握该模式对于设计合理的 Web 应用以及学习使用某些流行的 Web 框架,如 Spring、Struts 等,有着十分重要的意义。


7.1、MVC模式介绍

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

MVC 是一种通过三部分构造一个软件或组件的理想办法。
★ 模型(model) : 用于存储数据的对象 。
★ 视图(view) : 回控制器提交所需数据、显示模型中的数据。
★ 控制器(controller) : 负责具体的业务逻辑操作,即控制需根据视图提出的要求对数据做出(商业)处理,将有关结果存储到模型中,并负责让模型和视图进行必要的交互,当模型中的数据变化时,让视图更新显示。

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

7.2、JSP中的MVC模式

在 JSP 中,MVC 模式的实现如图 7. 2 所示,具体实现如下 :

★ 模型(Model) : 一个或多个 JavaBean 对象 ,用于存储数据。JavaBean 主要提供简单的setXxx 方法和 getXxx 方法,在这些方法中不涉及对数据的具体处理细节,以便增强模型的通用性。

★ 视图(View) : 一个或多个 JSP 页面,其作用是各控制需提交必要的数据和显示数据。JSP 页面可以使用 HTML 标记、JavaBean 标记以及Java 程序片或 Java 表达式来显示数据。视图的主要工作就是显示数据 ,对数据的逻辑操作由控制器负责。

★ 控制器(Controller) : 一个或多个 servlet 对象,根据视图提交的要求进行数据处理操作 ,并将有关的结果存储到 JavaBean 中 ,然后 servlet 使用转发或重定辐的方式请求视图中的某个JSP 页面显示数据。例如让某个 JSP 页面通过使用 JavaBean 标记、Java程序片或 Java 表达式显示控制需存储在 JavaBean 中的数据。

在这里插入图片描述

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

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

< jsp:getProperty name = “名字” property = “bean 的属性”/>

显示 bean 中的数据。

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

在 MVC 模式中,servlet 创建的 bean 也涉及生命周期(有关 bean 的生命周期见 5. 1. 3节)。生命周期分为 request bean sessionbean 和 application bean。

7.3.1、request bean

★ bean的创建

servlet 创建 request bean 的步骤如下 :
(1) 用 BeanClass 类的某个构造方法创建 bean 对象 ,例如 :

BeanClass bean = new BeanClass( ) ;

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

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 的代码如下 :

RequestDispatcher dispatcher = Tequest. getRequestDispatcher("show. jsp”) ;
dispatcher. forward(request, response) ;

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

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

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

< jsp:getProperty name = “keyWord” property = “bean 的变量”/>

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

7.3.2、session bean

★ bean的创建

servlet 创建 session bean 的步骤如下 :
(1) 用 BeanClass 类的某个构造方法创建 bean 对象 ,例如 :

BeanClass bean = new BeanClass( ) ;

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

HttpSesslion sesslion = request. getSesslion(true) ;
session. setRAttribute( “keyWord” ,bean) ;

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

★视图更新

servlet 创建 bean 的步骤(2)决定了 bean 为 session bean,只要用户的session 没有消失,该 session bean 就一直存在。Web 服务目录的各个 JSP 都可以使用

< jsp:useBean id = "keVWord"class = “save. data. BeanClass” scope = “session”/>

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

< jsp:getProperty name = “keyWord””Pproperty = “bean 的变量”/>

标记显示该 session bean 中的数据。

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

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

7.3.3、application bean

★ bean的创建

servlet 创建 application bean 的步骤如下 :
(1) 用 BeanClass 类的某个构造方法创建 bean 对象 ,例如 :

BeanClass bean = new BeanClass( ) ;

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

getServletContext( ) . setAttribute(“keyWord” ,bean) ;

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

★视图更新

servlet 创建 bean 的步骤(2)决定了bean 为 application bean。当 servlet 创建 applicationbean 后,只要 Tomcat 服务需不关闭 ,该 bean 就一直存在。一个用户在访问 Web 服务目录的各个JSP 中都可以使用

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

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

< jsp:getProperty name = “keyWord” property = “bean 的变量”/>

标记显示该 application bean 中的数据。

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

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

7.4、简单示例

设计一个 Web 应用,只有一个JSP 页面 example7_1. jsp、一个 request bean和一个 servlet。JSP 页面 example7_ 1. jsp 提供一个表单 ,用户可以通过表单输入两个数,选择运算符号提交给 servlet 控制顺。bean 负责存储运算数.运算符号和运算结果,servlet 控制

负责运算,将结果存储在 request bean 中,并负责请求 JSP 页面 example7 1. jsp 显示request bean 中的数据 。

Example7_1_Bean.java

package save.data;
public class Example7_1_Bean { 
   double numberOne,numberTwo,result;
   String operator="+";
   public void setNumberOne(double n){
      numberOne=n;
   }
   public double getNumberOne(){
      return numberOne; 
   }
   public void setNumberTwo(double n){
      numberTwo=n;
   }
   public double getNumberTwo(){
      return numberTwo; 
   }
   public void setOperator(String s){
      operator=s.trim();;
   }
   public String getOperator(){
      return operator;
   }
   public void setResult(double r){
      result=r; 
   }
   public double getResult(){
      return result; 
   }
}

example7_1.jsp

<%@ page contentType="text/html" %>
<%@ page pageEncoding = "utf-8" %>
<jsp:useBean id="digitBean" class ="save.data.Example7_1_Bean" scope="request"/>
<style>
   #tom{
      font-family:宋体;font-size:26;color:blue 
   }
</style>
<HTML><body bgcolor=#ffccff>
<form action="computer" id =tom method=post>
<table>
<tr><td id =tom> 输入两个数:</td>
<td id =tom>
<input type=text name="numberOne" 
       value=<%= digitBean.getNumberOne() %> id =tom size=6/></td>
<td><input type=text name="numberTwo" 
       value=<%=digitBean.getNumberTwo()%> id =tom size=6/></td>
</tr>
<tr><td id =tom>选择运算符号:</td>
<td id =tom>
<select id =tom name="operator">
    <option value="+">+()
    <option value="-">-()
    <option value="*">*()
    <option value="/">/()
</select> 
</td>
<td><input type="submit" id =tom value="提交" name="sub"/></td>
</tr>
</table></form> 
<p id=tom>
运算结果:
<jsp:getProperty name="digitBean" property="numberOne"/>
<jsp:getProperty name="digitBean" property="operator"/>
<jsp:getProperty name="digitBean" property="numberTwo"/> =
<jsp:getProperty name="digitBean" property="result"/> 
</p></body></HTML>

Example7_1_Servlet.java

package handle.data;
import save.data.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Example7_1_Servlet extends HttpServlet{
   public void init(ServletConfig config) throws ServletException{
       super.init(config);
   }
   public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
       Example7_1_Bean digitBean = null;
       digitBean = new Example7_1_Bean();  //创建Javabean对象.
       //digitBean 是request bean:
       request.setAttribute("digitBean",digitBean);
       String str1 = request.getParameter("numberOne");
       String str2 = request.getParameter("numberTwo");
       if(str1==null||str2==null)
         return;
       if(str1.length()==0||str2.length()==0)
         return;
       double numberOne = Double.parseDouble(str1);
       double numberTwo = Double.parseDouble(str2);
       String operator = request.getParameter("operator");
       double result=0;
       if(operator.equals("+"))
           result = numberOne+numberTwo;
       else if(operator.equals("-"))
           result = numberOne-numberTwo;
       else if(operator.equals("*"))
           result = numberOne*numberTwo;
       else if(operator.equals("/"))
           result = numberOne/numberTwo;
       digitBean.setNumberOne(numberOne); //将数据存储在digitBean中 
       digitBean.setNumberTwo(numberTwo);  
       digitBean.setOperator(operator);   
       digitBean.setResult(result); 
       //请求example7_1.jsp显示digitBean中的数据:
       RequestDispatcher dispatcher= request.getRequestDispatcher("example7_1.jsp");
       dispatcher.forward(request,response);
   } 
   public  void  doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
       doPost(request,response);
   }
} 

web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app>
    <servlet>
        <servlet-name>computer</servlet-name>
        <servlet-class>handle.data.Example7_1_Servlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>computer</servlet-name>
        <url-pattern>/computer</url-pattern>
    </servlet-mapping>
    </web-app>

在这里插入图片描述
在这里插入图片描述


  • 9
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MVC模式(Model-View-Controller)是一种软件设计模式,主要用来组织和管理程序的开发和设计。Unity是一款游戏开发引擎,提供了一系列工具和功能来帮助开发者创建和开发游戏。 在Unity中,使用MVC模式可以将游戏的逻辑和数据组织起来,实现更好的代码结构和可维护性。具体来说,Unity中的游戏开发可以按照以下方式应用MVC模式: 1. Model(模型):模型部分是游戏中的数据和逻辑,包括角色属性、游戏状态、游戏规则等。在Unity中,我们可以使用C#编写类来表示模型,并且使用属性、方法和事件来操作和更新模型的数据。 2. View(视图):视图部分是游戏中的用户界面和展示层,包括菜单、按钮、角色模型等。在Unity中,视图可以使用GUI、UI系统或者自定义的UI组件来实现。视图负责显示模型数据,并且根据用户的操作推动控制器进行逻辑处理。 3. Controller(控制器):控制器部分是游戏中的业务逻辑,负责接收用户的输入,控制模型的更新和处理模型之间的交互。在Unity中,我们可以编写脚本来处理用户输入,并根据输入的变化来调整模型的数据或触发事件。 通过使用MVC模式,Unity中的游戏开发可以更好地分离游戏的逻辑、数据和展示层,使得程序更容易理解、扩展和维护。同时,该设计模式也可以增加代码的重用性和可测试性,提高团队合作的效率。 总而言之,MVC模式在Unity中的应用可以帮助开发者更好地组织游戏的逻辑和代码结构,提升开发效率和代码质量。 ### 回答2: MVC模式是一种对软件进行组织的架构模式,其中M代表模型(Model),V代表视图(View),C代表控制器(Controller)。Unity是一种跨平台的游戏开发引擎。 在Unity中使用MVC模式可以更好地管理游戏开发过程中的逻辑和界面分离。首先,模型(Model)部分负责管理游戏的数据和逻辑。它定义了游戏的规则和行为,并且可以与其他模型进行交互。在Unity中,模型可以是游戏对象的脚本,用于控制游戏对象的行为和属性。 其次,视图(View)部分负责展示游戏的界面和图形内容。在Unity中,视图可以是游戏对象的渲染组件,例如UI元素或3D模型。视图接收模型的数据并将其显示给玩家。同时,视图还可以向控制器发送用户输入的消息,以便更新游戏状态。 最后,控制器(Controller)部分是连接模型和视图的中间人。它接收视图发送的输入消息,并根据消息的类型调用模型的方法进行状态更新。控制器还可以向视图发送消息,告知其需要更新界面或显示新的内容。在Unity中,控制器可以是脚本组件,用于处理用户输入和游戏逻辑的交互。 通过使用MVC模式,Unity可以实现良好的代码组织和项目管理。它将游戏逻辑,界面显示和用户交互分离开来,使开发人员可以更专注于每个部分的设计和开发。此外,MVC模式还提高了代码的可维护性和可扩展性,使团队成员可以更方便地合作开发修改游戏。 ### 回答3: MVC(Model-View-Controller)是一种软件架构模式,用于将应用程序的不同组成部分进行分离和组织。在Unity中,也可以应用MVC模式来设计和开发游戏或应用程序。 在MVC模式中,三个主要组成部分分别为模型(Model)、视图(View)和控制器(Controller)。 1. 模型(Model):模型表示游戏或应用程序的数据和逻辑部分。它负责处理和管理数据,以及定义游戏规则和逻辑。在Unity中,模型通常是由脚本或脚本组件实现的。 2. 视图(View):视图负责展示和渲染游戏或应用程序的界面和图形。它负责将模型中的数据以可视化的形式呈现给用户。在Unity中,视图通常是由场景、UI元素或其他图形组件构成的。 3. 控制器(Controller):控制器作为模型和视图之间的桥梁,负责处理用户输入和事件,并将其转化为对模型或视图的操作。它帮助用户与游戏或应用程序进行交互,并控制游戏流程。在Unity中,控制器通常通过脚本来实现。 使用MVC模式可以提高游戏或应用程序的可维护性、可扩展性和可重用性。通过将不同的逻辑和功能进行分离,我们可以更方便地进行测试、维护和更新。 在Unity中,我们可以根据游戏或应用程序的需求,使用MVC模式来设计和实现不同的功能模块,比如角色控制、UI交互、关卡管理等。通过合理地规划和组织,我们能够更有效地编写代码、管理资源和调试错误,提高开发效率和质量。 总结:在Unity中,MVC模式可用于游戏或应用程序的设计和开发,帮助我们更好地组织和管理代码,提高软件的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值