目录
MVC模式的核心思想是将“模型”“视图”和“控制器”进行有效组合。
一、MVC模式介绍
模型-视图-控制器(Model-View-Controller),简称为MVC。MVC已经成为软件设计者必须熟练使用的开发者模式。
MVC是一种通过三部分构造一个软件或组件的理想办法。
· 模型(model):用于存储数据的对象。
· 视图(view):向控制器提交所需数据,显示模型中的数据。
·控制器(controller):负责具体的业务逻辑操作,即控制器根据视图提出的要求对数据做出(商业)处理,将有关结果存储到模型中,并负责让模型和视图进行必要的交互,当模型中的数据变化时,让视图更新显示。
从面向对象的角度看,MVC开发模式可以使程序容易维护,也更容易扩展。在设计程序时,可以将某个对象看作“模型”,然后为“模型”提供恰当的显示组件,即“视图”。在MVC模式中,“视图”“”模型“和”控制器“之间是松耦合结构,便于系统的维护和扩展。
二、JSP中的MVC模式
在JSP页面中可以使用HTML标记、JSP指令(例如getProperty指令)或Java程序片、Java表达式来为用户显示数据,避免使用大量的Java程序片来进行数据的逻辑处理(简明扼要的除外)。servlet擅长数据的处理,应当尽量避免在servlet中使用out流输出大量的HTML标记来显示数据,否则一旦要修改显示外观就要重新编译servlet。
在JSP+JavaBean模式中,JavaBean不仅要提供修改和返回数据的方法,而且要经常参与数据的处理。当Web应用变得复杂时,我们希望把数据的处理交给称作控制器的servlet对象去完成,即servlet控制器负责处理数据,并将有关的结果存储到JavaBean中,实现存储与处理的分离。负责视图功能的JSP页面可以使用Java程序片或用JavaBean标记显示JavaBean中的数据。
在JSP中,MVC模式的具体实现如下:
·模型(Model):一个或多个JavaBean对象,用于存储数据。JavaBean主要提供简单的setXxx方法和getXxx方法,在这些方法中不涉及对数据的具体处理细节,以便增强模型的通用性。
·视图(View):一个或多个JSP页面,其作用是向控制器提交必要的数据和显示数据。JSP页面可以使用HTML标记、JavaBean标记以及Java程序片或Java表达式来显示数据。视图的主要工作就是显示数据,对数据的逻辑操作由控制器负责。
·控制器(Controller):一个或多个servlet对象,根据视图提交的要求进行数据处理操作,并将有关的结果存储到JavaBean中,然后servlet使用转发或重定向的方式请求视图中的某个JSP页面显示数据。例如让某个JSP页面通过使用JavaBean标记、Java程序片或Java表达式显示控制器存储在JavaBean中的数据。
三、模型的生命周期与视图更新
使用MVC模式和JSP+JavaBean模式有很大的不同。在JSP+JavaBean模式中,由JSP页面通过使用useBean标记:
<jsp:useBean id = "名字" class = "创建bean的类" scope = "生命周期”/>
创建bean。而在MVC模式中,由控制器servlet创建bean,并将有关数据存储到所创建的bean中,然后servlet请求某个JSP页面使用getProperty动作标记:
<jsp:getProperty name = "名字" property = "bean的属性"/>
显示bean中的数据。
在MVC模式中,当用控制器servlet创建bean时,就可以使用bean类的带参数的构造方法。类中的方法的命名继续保留getXxx规则,但可以不遵守setXxx规则。其理由是:我们不希望JSP页面修改JavaBean中的数据,只需要它显示bean中的数据。
在MVC模式中,servlet创建的bean也涉及生命周期。生命周期分为request bean、session bean和application bean\
1、request bean
①bean的创建
servlet创建request bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean = new BeanClass();
(2)将所创建的bean对象存放到HttpServletRequset对象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所占有的内存被释放,结束自己的生命。
2、session bean
①bean的创建
servlet创建session bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean = new BeanClass();
(2)将所创建的bean对象存放到HttpServletSession对象session中,并指定查找该bean的id。该步骤决定了bean为session bean。例如:
HttpSession session = request.getSession(true);
session,setAttribute*"keyWord",bean);
内置对象执行上述操作,就会把bean存放到TOmcat服务器管理的内置对象pageContent中,该bean被指定的id是keyWord,生命周期是PageContext.SESSION_SCOPE(session)。
②视图更新
servlet创建bean的步骤(2)决定了bean为session bean,只要用户的session没有消失,该session bean就一直存在。Web服务目录的各个JSP都可以使用
<jsp:useBean id = "keyWord" class = "save.data.BeanClass" scope = "session"/>
标记获得servlet所创建的session bean(id的值是servlet创建session bean时,为bean指定的关键字),然后使用相应的标记或程序片显示该session bean中的数据,例如使用
<jsp :getProperty name = "keyWord" property = "bean的值"/>
标记显示该session bean中的数据。
对于session bean,如果servlet希望某个JSP页面显示其中的数据,可以使用RequestDispatcher对象转发到该页面,也可以使用HttpServletResponse类中的重定向方法(sendRedirect)定向到该页面。
需要注意的是,不同用户的session bean是互不相同的,即占有不同的内存空间。
3、application bean
①bean的创建
servlet创建application bean的步骤如下:
(1)用BeanClass类的某个构造方法创建bean对象,例如:
BeanClass bean = new BeanClass();
(2)servlet使用getServletContext()方法返回服务器的Servlet Context内置对象的引用,将所创建的bean对象存放到服务器这个ServletContext内置对象中,并指定查找该bean的关键字。该步骤决定了bean的生命周期为application。例如:
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中都可以使用
<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对象向该页面发出请求,也可以使用HttpServletResponse类中的重定向方法(sendRedirect)。
需要注意的是,所有用户在同一个Web服务目录中的application bean是相同的,即占有相同的内存空间。