MVC简介
前面写了很多,我们已经可以看出,servlet善于完成实际的编程任务,如操作HTTP状态代码和报头,使用Cookie,跟踪会话,跨请求保存信息,压缩页面,访问数据库等等。但是用servlet生成的HTML十分冗长难读,于是引入了JSP来完成表示层的任务。
MVC正式基于这样的思想---即将表示层和业务逻辑层分离,发挥各自的长处。
bean表示相应的结果(模型),JSP表示页面(视图),servlet调用商业逻辑和数据处理(控制器)。
JSP中动态调用代码策略。
MVC方案的主要驱动力是操作数据的代码与表达数据的代码分离这一愿望。在十分复杂的应用中,更为精致的MVC框架会更有利,这些框架中最流行的就是Apache Structs,对于中等和简单的解决方案,使用RequestDispatcher从零实现MVC更为直观和灵活。这里我们主要了解RequestDispatcher,理解MVC的思想。
1,用RequestDispatcher实现MVC
1)定义bean来表示数据
2)使用servlet处理请求
servlet读取请求参数
3)填写bean
servlet调用商业逻辑或数据访问代码获取最后的结果并将结果放在bean中。
4)将bean存储到请求,会话或者servlet上下文中
ValueObject value = new ValueObject(...);
request.setAttribute("key", value);
<jsp:useBean id="key" type="somePackage.ValueObject"
scope="request" />
或者:
ValueObject value = new ValueObject(...);
HttpSession session = request.getSession();
session.setAttribute("key", value);
<jsp:useBean id="key" type="somePackage.ValueObject"
scope="session" />
或:
ValueObject value = new ValueObject(...);
getServletContext().setAttribute("key", value);
<jsp:useBean id="key" type="somePackage.ValueObject"
scope="application" />
5)将请求转发到JSP页面
转发请求使用RequestDispatcher的forward方法,RequestDispatcher的获取需要调用ServletRequest的getRequestDispatcher方法并提供相对地址:
RequestDispatcher dispatcher =request.getRequestDispatcher(address);
得到dispatcher对象后,则可调用forward方法将控制转移到相关的地址,提供HttpServletRequest和HttpServletResponse作为参数。forward方法和sendRedirect方法不同,forward方法不会引入额外的响应和请求,因而在使用时显示给客户的URL不会变。
RequestDispatcher dispatcher =
request.getRequestDispatcher(address);
dispatcher.forward(request, response);
6)从bean中提取数据
请求到达JSP页面后,使用jsp:useBean,jsp:getProperty提取数据
2,一般的例子
1)基于请求的数据共享
servlet:
ValueObject value = new ValueObject(...);
request.setAttribute("key", value);
RequestDispatcher 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);
RequestDispatcher 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)基于应用的数据共享
servlet:
synchronized(this) {
ValueObject value = new ValueObject(...);
getServletContext().setAttribute("key", value);
RequestDispatcher 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" />
其实就是将bean存储在不同的位置,针对不同的方式应用场景不一样。