频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

1.2 模型2和MVC

作者: 孙鑫著 出处:电子工业出版社  2008-06-22 16:29    砖    好    评论   进入论坛
阅读提示:《Struts 2深入详解》第1章主要是让大家认识Struts 2,Struts 2已经推出了稳定的版本,其先进的架构和设计思想,随着时间的推移,相信会有越来越多的人开始使用Struts 2, 本节为您介绍模型2和MVC。

1.1.2  模型2和MVC

在模型1中,JSP页面嵌入了流程控制代码和部分的逻辑处理代码,我们可以将这部分代码提取出来,放到一个单独的角色中,这个角色就是控制器角色,而这样的Web架构就是模型2了。模型2符合MVC架构模式,MVC即模型-视图-控制器(Model-View-Controller)。

MVC架构有助于将应用程序分割成若干逻辑部件,使程序设计变得更加容易。MVC架构提供了一种按功能对各种对象进行分割的方法(这些对象是用来维护和表现数据的),其目的是为了将各对象间的耦合程度降至最低。MVC架构原本是为了将传统的输入(input)、处理(processing)和输出(output)任务运用到图形化用户交互模型中而设计的,但是,将这些概念运用到基于Web的企业级多层应用领域也是很适合的。
在MVC架构中,一个应用被分成三个部分:模型(Model)、视图(View)和控制器(Controller)。

模型代表应用程序的数据以及用于访问控制和修改这些数据的业务规则。当模型发生改变时,它会通知视图,并为视图提供查询模型相关状态的能力。同时,它也为控制器提供访问封装在模型内部的应用程序功能的能力。

视图用来组织模型的内容。它从模型那里获得数据并指定这些数据如何表现。当模型变化时,视图负责维护数据表现的一致性。视图同时将用户的请求通知控制器。

控制器定义了应用程序的行为。它负责对来自视图的用户请求进行解释,并把这些请求映射成相应的行为,这些行为由模型负责实现。在独立运行的GUI客户端,用户的请求可能是一些鼠标单击或是菜单选择操作。在一个Web应用程序中,它们的表现形式可能是一些来自客户端的GET或POST的HTTP请求。模型所实现的行为包括处理业务和修改模型的状态。根据用户请求和模型行为的结果,控制器选择一个视图作为对用户请求的响应。图1-2描述了在MVC应用程序中模型、视图、控制器三部分的关系。

 
图1-2  MVC模型、视图、控制器的关系图
在JSP模型2中,控制器的角色由Servlet来实现,视图的角色由JSP页面来实现,模型的角色由JavaBean来实现。模型2的架构如图1-3所示。
 
图1-3  模型2架构示意图

Servlet充当控制器的角色,它接受请求,并且根据请求信息将它们分发给相应的JSP页面来产生响应。Servlet控制器还根据JSP视图的需求生成JavaBean的实例并输出给JSP环境。JSP视图可以通过直接调用JavaBean实例的方法或使用动作元素来得到JavaBean中的数据。

下面我们按照模型2的架构重写用户登录验证的程序。在本例中,两个JavaBean类(UserBean和UserCheckBean)和welcome.jsp仍然用模型1例子中的程序,主要增加作为控制器使用的Servlet。

在模型2的login.jsp中,我们增加了一个隐藏输入域,如下:


服务器端的控制器可以根据这个隐藏字段的值来判断用户是请求登录表单,还是提交登录信息。

ControllerServlet类充当控制器,它接收用户的请求,根据请求的不同进行相应的处理,并选择对应的视图呈现给用户。例如,当用户提交登录表单时,ControllerServlet实例化UserBean对象保存用户登录信息,实例化UserCheckBean对象对用户登录信息进行验证,并根据登录成功与否选择欢迎或者失败页面呈现给用户。ControllerServlet类的代码如例1-6所示。

例1-6  ControllerServlet.java

package org.sunxin.struts2.ch01.model2.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.sunxin.struts2.ch01.model2.UserBean;
import org.sunxin.struts2.ch01.model2.UserCheckBean;

public class ControllerServlet extends HttpServlet
{
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");

String action = request.getParameter("action");

//如果用户没有登录,并且也不是提交登录信息,则向用户显示登录页面
if (!isValidated(request) && !("login".equals(action)))
{
gotoPage("login.jsp", request, response);
return;
}

//如果用户提交登录信息,则对用户登录信息进行验证
if ("login".equals(action))
{
UserBean user = new UserBean();
user.setName(request.getParameter("name"));
user.setPassword(request.getParameter("password"));

UserCheckBean uc = new UserCheckBean(user);

if (uc.validate())
{
HttpSession session = request.getSession();
// 将user对象保存到Session对象中,在welcome.jsp中通过
// 动作元素从Session中得到user对象
session.setAttribute("user", user);
// 验证成功,将请求转向welcome.jsp
gotoPage("welcome.jsp", request, response);
}
else
{
// 验证失败,将请求转向loginerr.jsp
gotoPage("loginerr.jsp", request, response);
}
}
// 对于其他的action请求,可在后面的else if...else语句中继续处理
/*
* else if { } else { }
*/
}

/**
* 判断用户是否已经登录了
*/
private boolean isValidated(HttpServletRequest request)
{
HttpSession session = request.getSession();
if (session.getAttribute("user") != null)
return true;
else
return false;
}

/**
* 将请求导向指定的页面
*/
private void gotoPage(String targetURL, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException
{
RequestDispatcher rd;
rd = request.getRequestDispatcher(targetURL);
rd.forward(request, response);
}
}


完整的代码请参看本书配套光盘中的ch01目录,测试时,输入URL:

http://localhost:8080/ch01/model2/login

本例中的JSP页面不包含任何的流程控制和业务处理逻辑,它只是简单地检索控制器创建的JavaBean对象,然后将动态内容插入到预定义的页面模板中。

采用模型2的架构,可以将页面的显示、业务逻辑的处理和流程的控制很清晰地区分开,JSP负责数据的显示,JavaBean负责承载数据以及业务逻辑的处理,Servlet负责流程的控制。采用模型2架构的Web应用程序很容易维护和扩展,因为作为视图的JSP页面之间没有直接的关联。另外,在大型项目的开发过程中,采用模型2的架构,可以充分利用前端页面设计人员和后端Java开发人员所掌握的不同技能,页面设计人员可以发挥自己的美术和设计才能来表现页面,程序开发人员可以发挥自己擅长逻辑思维的特点,实现项目中的业务逻辑处理。

在项目中,采用哪种模型要根据实际的业务需求来确定。一般来说,对于小型的、业务逻辑处理不多的应用,采用模型1比较合适。如果应用有着较复杂的逻辑,并且返回的视图也不同,那么采用模型2较为合适。

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
专题
企业Web安全威胁在线评估系统
Java实用开发全集
Java类的基础教程专题
Java发展动态专题
Web 2.0基础知识大全
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
Linux 集群技术专题
Linux 集群技术专题
Windows集群服务应用
Windows集群服务应用
CISSP认证成长之路
CISSP认证成长之路
· CISSP认证成长之路
· SQL Server 2008/2005..
· SQL Server入门到精通
· 网络工程师职业规划与..
· 浏览器的战国时代
· 运营商封堵ADSL共享 中..
· 微软出价446亿美元收购..
· 技术人求职简历完备手册
· 开源虚拟化技术Xen
· Windows Server 2008专..
· 隐私保护技术探讨
· 绿色IT人健康生存手册
· 杀毒软件评测专题
· 访问控制列表(ACL)介绍
· Vista SP1对决XP SP3
· 华为员工自杀频频拷问..
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SOA 面向服务架构
SOA 面向服务架构
· SOA 面向服务架构
· SQL Server 2008/2005..
· Apache技术专题
· 三层交换技术专题
· SQL Server入门到精通
· Apache技术专题
· Windows集群服务应用
· 国际文档格式标准开战
· 路由器设置与口令恢复
· Linux 集群技术专题
· PHP开发应用手册
· SOA 面向服务架构
· 企业数据恢复指南
· 了解统一威胁管理(UTM)..
· 专题:AIX操作系统管理..
· 访问控制列表(ACL)介绍
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SQL Server入门到精通
SQL Server入门到精通
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· 三层交换技术专题
· Apache技术专题
· 企业数据恢复指南
· Windows集群服务应用
· 路由器设置与口令恢复
· Linux 集群技术专题
· SOA 面向服务架构
· 了解统一威胁管理(UTM)..
· 反垃圾邮件技术应用
· 访问控制列表(ACL)介绍
· PHP开发应用手册
· 专题:AIX操作系统管理..