您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第8章 基于Servlet的MVC模式
第八章基于Servlet的MVC模式第一节MVC模式介绍MVC是三个单词的缩写,别是模型(Model),视图(view)和控制器(Controller)。MVC的目的就是实现WEB系统的职能分工。Model层实现系统中的业务逻辑,通常可以用javabean或EJB实现。View层用于与用户的交互,通常用JSP来实现。Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求,并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。一、MVC模式的好处各施其责,互不干涉在MVC模式中,三个层各施其责,所以如果一旦哪一层的需求发生了变化,就只需要修改相应层中的代码而不会影响到其他层中的代码。有利于开发中的分工在MVC模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可以开发业务层,而其他开发人员可以开发控制层。有利于组件的重用分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可以做成通用的操作界面。二、不同JSP构造的应用三、为何要组合使用servlet&JSP?典型的做法:使用JSP简化HTML内容的开发与维护对于简单的动态代码,使用由脚本元素调用java代码来完成。对于稍微复杂一些的应用,则可以使用脚本元素调用定制的类来完成。(即所谓的help类)对于比较复杂的应用,则使用JAVABEAN和定制标签。但,这些还是不够的对于复杂的处理过程,从JSP开始做起会难以处理。JSP除了能够带来将实际的代码隔离成单独的类、bean、和定制标签的便利以外,它所隐含的假定是单个页面给出单个基本视图。四、处理单个请求的可能方式仅servlet输出为二进制类型,例如:一幅图像。没有输出,如搜索引擎例子中的转发与重定向。页面的格式/布局变化很大,例如:门户网站。仅JSP输出大部分为字符数据,如HTML。格式/布局大部分固定。二者的组合单个请求可能会得到外观相差较大的多种结果。数据处理过程复杂,但布局相对固定。这些仅适用于单个请求的处理在整个应用中,我们依旧需要使用servlet和JSP。五、对MVC的误解必须采用复杂的框架框架有时很有用•struts•Spring但并非必需!•对于大多数简单或者适度复杂的应用来说,使用内建的RequestDispatcher就能很好的实现MVC。MVC影响整个系统的设计可以将它认为是MVC方案,而非MVC框架。•也被称为是模型2方案。六、模型2架构示意图Servlet(Controller)JSP(View)JavaBeans(Model)数据库浏览器请求响应选择视图实例化第二节用RequestDispatcher实现MVC①定义用以表示数据的javabean。②使用一个servlet处理请求servlet读取请求参数,检查数据的缺失或异常等。③填充bean该servlet调用业务逻辑或数据访问代码得到最终的结果。得出的结果被放在第一步中定义的bean中。④将bean存储在请求,会话或servlet上下文。该servlet调用请求、会话或servlet上下文对象的setAttribute存储表达请求结果的bean的引用。一、实现MVC的步骤实现MVC的步骤(续)⑤将请求转发到JSP页面该servlet确定哪个JSP页面适合于处理当前的情形,并使用RequestDispatcher的forward方法将控制转移到那个页面。⑥从bean中提取数据JSP页面使用jsp:bean和与第四步匹配的位置访问之前存储的bean,然后使用jsp:getProperty输出bean的属性。JSP页面并不创建或修改bean;它只是提取并显示由servlet创建的数据。二、一个简单的例子Beerfrom.html&result.jsp&BeerExpert.java&BeerSelect.java三、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选项requestjsp:useBeanid=“…”type=“…”scope=“request”/sessionjsp:useBeanid=“…”type=“…”scope=“session”/applicationjsp:useBeanid=“…”type=“…”scope=“application”/pagejsp:useBeanid=“…”type=“…”scope=“page”/或者仅仅使用jsp:useBeanid=“…”type=“…”/MVC(model2)构架不使用这个scope。五、不同数据的共享方式向用户显示一个随机的数字。由于每次请求应该产生新的数字,因而基于请求的共享是恰当的。显示用户的姓和名。数据要为每个客户存储,因而基于会话的共享比较适用。显示一个指定长度的质数(计数器)。数据在所有客户间共享,因此,基于应用的共享比较恰当。1.基于请求的数据共享ServletValueObjectvalue=newValueObject(…);request.setAttribute(“key”,value);RequestDispatcherdispatcher=request.getRequestDispatcher(“/WEB-INF/SomePage.jsp”);dispatcher.forward(request,response);JSPjsp:useBeanid=“key”type=“somePackage.ValueObject”scope=“request”/jsp:getPropertyname=“key”property=“someProperty”/2.基于会话的数据共享ServletValueObjectvalue=newValueObject(…);HttpSessionsession=request.getSession();session.setAttribute(“key”,value);RequestDispatcherdispatcher=request.getRequestDispatcher(“/WEB-INF/SomePage.jsp”);dispatcher.forward(request,response);JSPjsp:useBeanid=“key”type=“somePackage.ValueObject”scope=“session”/jsp:getPropertyname=“key”property=“someProperty”/3.基于ServletContext的数据共享Servletsynchronized(this){ValueObjectvalue=newValueObject(…);getServletContext().setAttribute(“key”,value);RequestDispatcherdispatcher=request.getRequestDispatcher(“/WEB-INF/SomePage.jsp”);dispatcher.forward(request,response);}JSPjsp:useBeanid=“key”type=“somePackage.ValueObject”scope=“application”/jsp:getPropertyname=“key”property=“someProperty”/六、SummaryMVC(Model2)方式适用于:单次提交会产生多个基本外观。几个页面拥有大量公共的处理过程。需要为同样的数据提供多个视图的应用程序,它很好地实现了数据层与表示层地分离,特别适用于开发与用户图形界面有关的应用程序。构架由一个servlet应答初始的请求。Servlet完成实际的数据处理并将结果存储在bean中。Bean存储在HttpServletRequest,HttpSession或ServletContext中。Servlet使用RequestDispatcher的forward方法将请求转发到JSP页面。JSP页面通过使用jsp:useBean和响应的作用域(request,session,application)从bean中读出数据。第三节实例应用(MvcDemo)UserBean.java:用于保存用户的登录信息,以及在多个JSP页面中传递用户数据。UserCheckBean.java:用于对用户名和密码进行验证,登录验证功能的主要业务逻辑在这个Bean中完成。ControllerServlet.java:充当控制器角色,它接受客户登录的信息,调用JavaBean组件对用户登录信息进行验证,并根据验证的结果,调用JSP页面返回给客户。welcome.jsp:欢迎页面。loginerr.jsp:错误页面。login.html:登录页面。练习计算等差、等比数列的和。计算一元二次方程的根。简单的计算器。读取文件。查询数据库。
本文标题:第8章 基于Servlet的MVC模式
链接地址:https://www.777doc.com/doc-3966997 .html