servlet和jsp集成mvc模式
模型-视图-控制器(MVC)的概述
模型(Model):指系统的状态,大多指系统的数据。Model层实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。
视图(View):通过用户界面展示的东西。View层用于与用户的交互,通常用JSP来实现。
控制(Controller):沟通视图和模型,是视图和模型之间的桥梁。Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

MVC模式的好处

一。各施其职互不干涉
在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其他层中的代码。
二。有利于开发中的分工
在MVC模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开发人员可开发业务层,而其他开发人员可开发控制层。
三。有利于组件的重用
分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。

为什么要组合使用servlet和jsp

典型的做法:使用JSP来简化HTML内容的开发与维护
对于简单的动态代码,使用由脚本元素调用JAVA代码来完成
对于稍微复杂一些的应用,则可使用脚本元素调用定制的类来完成(即所谓的help类)
对于比较复杂的应用,则使用JAVA BEAN和定制标签
但,这些还不够
对于复杂的处理过程,从JSP开始做起会难以处理.
JSP除了能够带来将实际的代码隔离成单独的类、bean、和定制标签的便利以外,它所隐含的假定施单个页面给出单个基本视图
那么,不足之处就是
如果用户的一个请求有可能由多个视图展现给客户的话,那么JSP就不够了
比如,用户发出“查询余额”的请求,如果余额小于零可能是一个页面,余额大于零可能是一个页面,余额大于十万可能又是另外一个页面,比如贵宾页面。如果单只用jsp页面就难于实现,这时就需要引入servlet来充当一个控制器,根据用户的不同请求进行判断,反馈给用户不同的页面。

处理单个请求的可能方式

仅servlet
输出为二进制类型,例如:一幅图画。
没有输出,如搜索引擎例子中的转发与重定向。
页面的格式/布局变化很大,例如:门户网站。
仅JSP
输出大部分静态字符数据,如HTML
格式/布局大部分固定
二者的组合
单个请求可能会得到外观相差较大的多种结果。
数据处理过程复杂,单布局相对固定。

对MVC的误解

X必须采用复杂的框架X
框架有时很有用

Struts 
 Spring 
 JavaServer Face(JSF)

但并非必需
对于大多简单或者中度复杂的应用来说,使用内建的RequestDispatcher就能够很好地实现MVC
MVC是一种解决方案,并不是框架

***用RequestDispatcher实现MVC(dispatcher:发送者,调度员)***

1、定义用以表示数据的java bean(用于保存数据,也就是系统状态),可以供jsp和servlet使用,是一种数据共享的机制
2、使用一个servlet处理请求,进行中心控制,将分散在不同jsp中的逻辑抽取出来放在一个servlet中来实现,比如由servlet读取请求参数,检查数据的缺失或异常等。
3、填充bean:由servlet调用业务逻辑或数据访问代码得到最终的结果。得出的结果被放在第一步中定义的bean中。以便由jsp使用bean中的数据。
4、将bean存储在请求,会话或servlet的上下文中:方法是该servlet调用请求、会话或servlet上下文对象的setAttribute方法存储表达请求结果的bean的引用。
5、将请求转发到jsp页面:该servlet确定哪个jsp页面适合于处理当前的情形,并使用RequestDispatcher(请求开关)的forward方法将控制转移到那个页面。
6、从bean中提取数据
JSP页面使用jsp:useBean和与第四步匹配的位置访问之前存储的bean,然后使用jsp:getProperty输出bean的属性。
JSP页面并不创建或修改bean;它只是提取并显示由servlet创建的数据。

转发请求的格式

public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException 
 { 
 RequestDispatcher dispatcher=request.getRequestDispatcher(address); 
 dispatcher.forward(request,response); 
 }

jsp:useBean在MVC中的使用与在独立JSP页面中有什么不同
1、JSP页面不应该创建对象
应该由servlet创建所有的数据对象。因此,为了保证JSP页面不会创建对象,我们应该使用

<jsp:useBean...type="package.Class"/>

而不是

<jsp:useBean...class="package.Class"/>

2、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"/>

数据共享策略的对比
1.基于请求的数据共享
向用户显示一个随机的数字:由于每次请求应该产生新的数字,因而基于请求的共享是恰当的。
基于请求的数据共享格式:
在servlet中

ValueObject value=new ValueObject(...); 
 request.setAttribute("key",value); 
 RequestDispathcer 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" />

2。基于会话的数据共享
显示用户的姓和名:数据要为每个客户存储,因而基于会话的共享比较适用。
基于会话的数据共享格式:
在servlet中

ValueObject value=new ValueObject(...); 
 HttpSession session=request.getSession(); 
 session.setAttribute("key",value); 
 RequestDispathcer 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" />

3.基于ServletContext的数据共享
显示一个指定长度的质数,或者搜房网上的房屋按揭计数器:数据在多个客户间共享,因此,基于应用的共享比较恰当
基于ServletContext的数据共享格式:
在servlet中

synchronized(this) 
 { 
 ValueObject value=new ValueObject(...); 
 getServletContext().setAttribute("key",value); 
 RequestDispathcer 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" />