`
jafisher
  • 浏览: 55721 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

MVC结构总结

阅读更多
  学习MVC已有一段时间,之前对MVC的理解比较凌乱,最近开始着手做web项目,考虑到MVC的重要性,觉得有必要把MVC的知识点综合总结一下,也算是对自己学习的一个检测吧。
  MVC是一个设计模式,是model-view-control结构。它强制性的使应用程序的输入、处理和输出分开。MVC应用程序被分成三个核心部件:模型(model)、视图(view)、控制器(controller)。它们各自处理自己的任务。MVC模式的目的就是实现Web系统的职能分工。
  Model层:
    实现系统中的业务逻辑,通常可以用JavaBean或EJB来实现。模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。一个模型能为多个视图提供数据。模型分为数据模型和业务逻辑模型。
  View层:
    负责展示数据对象给用户的界面层,用于与用户的交互,通常用JSP来实现。是用户看到并与之交互的界面。
  Controller层:
    是Model与View之间沟通的桥梁,是根据界面反馈处理业务逻辑的控制层,可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。

  简单地说,MVC就是一个HTML/JSP+Servlet+javaBean结构:
  HTML/JSP负责生成动态网页;
  Servlet负责流程转发至对应胡Action实现
  javabean(pojo和dao)负责业务数据模型存取

  控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后用确定用哪个视图来显示模型处理返回的数据。最重要的一点是多个视图能共享一个模型,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论用户想要Flash界面或是WAP界面,用一个模型就能处理它们。由于已经将数据和业务规则从表示层分开,所以可以最大化的重用代码了。

MVC特点:
  低耦合性
  高重用性和可适用性
  较低的生命周期成本
  快速部署
  可维护性
  有利于软件工程化管理
  并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

model1与model2的概念:
  在使用JAVA技术建立Web应用的实例中,由于JSP技术的发展,很快这种便于掌握和可实现快速开发的技术就成了创建Web应用的主要技术。JSP页面中可以非常容易地结合业务逻辑(jsp:useBean)、服务端处理过程(jsp:let)和HTML(),在JSP页面中同时实现显示,业务逻辑和流程控制,从而可以快速地完成应用开发。现在很多的Web应用就是由一组JSP页面构成的。这种以JSP为中心的开发模型我们可以称之为Model1。
  Model 2表示的是基于MVC模式的框架。MVC是Model-View-Controller的简写。“Model”代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),“View”是应用的表示面(由JSP页面产生),“Controller”是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。从而弥补了Model1的不足。

MVC框架结构:
  ControlServlet:请求控制器,解析请求中的动作名字,调用动作工厂对象生成的动作对象处理请求,处理后返回的结果即为目标url。
  ActionFactory:工厂类,根据请求中的动作名创建命令对象action。
  Action:接口,定义所有动作的接口。
  具体Action:是实现了Action接口的类,调用其具体实现的方法处理Request或Response对象,返回一个url,再由Servlet负责转发到界面上。
  user:用户类,一个最基本的单元,用来实现动作的对象。
  Dao:负责连接数据库,将数据库中的数据导入到具体的Action中。

java实例:
1.设计控制器Servlet:
  创建一个动态web工程后,首先定义一个ControlServlet,用户的所有请求都提交给这个Servlet,为了便于系统扩展,可以对Servlet的请求路径在web.xml中进行模糊配置。
<servlet-mapping>
  <servlet-name>ControlServlet</servlet-name>
  <url-pattern>*.netjava</url-pattern>
</servlet-mapping>

ControlServlet:
protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
try{
            //得到请求的命令名字,解析出*.netjava请求中*所指代的字符串,即动作名字        
              String actionName = getActionName(request);
  //根据请求的动作名,得到控制器servlet中配置的Action实现类名字
   String actionClassName = this.getInitParameter(actionName);

  //通过工厂类创建命令对象
   Action action = ActionFactory.getIns().getAction(actionClassName);

  //使用动作对象处理动作,返回结果为处理后要输出的目标页面
   String url = action.execute(request, response);
   if(url != null){
   //输出目标页面
            getServletContext().getRequestDispatcher(url).forward(request, response);
            }
}catch(Exception e){
   e.printStackTrace();
//出错则输出错误页面
getServletContext().getRequestDispatcher("/error.jsp").forward(request, response);
}
}

//解析得到请求中的命令字
protected String getActionName(HttpServletRequest request){
String path = request.getServletPath();
return path.substring(1, path.lastIndexOf("."));
}

ActionFactory:
public class ActionFactory {

private static ActionFactory af = null;
//单实例访问方法
public static ActionFactory getIns(){
if(af == null){
af = new ActionFactory();
}
return af;
}

//根据具体的Action类名字创建Action对象
public Action getAction(String actionClassName){
Action actionInstance = null;
try{
Class c = Class.forName(actionClassName);
actionInstance = (Action)c.newInstance();
}catch(Exception e){
e.printStackTrace();
}
return actionInstance;
}
}

Action接口:
public interface Action {

public String execute(HttpServletRequest request, HttpServletResponse response);
}

具体Action:
public class LoginAction implements Action{

public String execute(HttpServletRequest request, HttpServletResponse response){
response.setContentType("text/html; charset=UTF-8");
String userName = request.getParameter("userName");
String userPwd = request.getParameter("userPwd");

//到数据库中查找用户
User user = new UserDao().findUser(userName, userPwd);

//判断用户是否存在
if(userName.equals(user.getName()) &&
userPwd.equals(user.getPwd())){
request.getSession().setAttribute("USER", user);
return "/mainPage.jsp";
}else{
request.setAttribute("ERROR", "账号或密码不正确!");
return "/Login.html";
}
}
}

web.xml配置:
  <servlet>
    <description></description>
    <display-name>ControlServlet</display-name>
    <servlet-name>ControlServlet</servlet-name>
    <servlet-class>cn.netjava.servlet.ControlServlet</servlet-class>
    <init-param>
      <param-name>LoginAction</param-name>
      <param-value>cn.netjava.action.LoginAction</param-

value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>ControlServlet</servlet-name>
    <url-pattern>/*.netjava</url-pattern>
  </servlet-mapping>

Login.jsp:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;

charset=UTF-8">
<title>登陆界面</title>
</head>
<body>

<form name="testForm" method="get"

action="LoginAction.netjava">
<br>用户名:<input type="text" name="userName"/>
<br>密     码:<input type="password" name="userPwd"/>
<%
String msg = (String)request.getAttribute("ERROR");
if(msg != null){
out.print("<br>"+msg);
}
%>
<input type="submit" name="submit" value="登陆"/>
</form>
<a href="Register.jsp">注册用户</a>
</body>
</html>

开启服务器,在IE浏览器上测试结果:

http://localhost:8080/MVCTest/Login.jsp
注意:最好是使用IE浏览器,因为有的浏览器并不完全兼容tomcat,可能会出现异常。
  在界面上输入用户名和密码,点击登陆按钮,jsp将请求交给Servlet,Servlet再根据提交的动作得到具体的Action对象,然后通过Factory创建命令动作对象,处理Servlet中的动作,返回目标url,即得到登陆成功的界面。
  这就是MVC构架的一个大致流程。为系统的扩展为了充分的准备,利用一个Servlet可以实现用户多个不同动作的响应。以上也是我对MVC的一点粗略的理解。
分享到:
评论

相关推荐

    PureMVC框架学习总结

    介绍了PureMVC框架结构以及PureMVC下消息发送机制,有助于更好的了解和学习PureMVC架构

    最基础的MVC结构

    最基础的MVC结构 这个都是本人收藏了3年的资源 现放出 都是总结了很多系统 软件项目实施过程中的经验的 慢慢积累的

    Spring MVC 3 深入总结

    大家好,Spring3 MVC是非常优秀的MVC框架,由其是在3.0版本发布后,现在有越来越多的团队选择了Spring3 MVC了。Spring3 MVC结构简单,应了那句话简单就是美,而且他强大不失灵活,性能也很优秀。

    ASP.NET MVC 3高级编程

    1.1.9 asp.net mvc 3特性总结 10 1.2 创建asp.net mvc 3应用程序 10 1.2.1 创建asp.net mvc 3应用程序的软件要求 11 1.2.2 安装asp.net mvc 3 11 1.2.3 创建asp.net mvc 3应用程序 12 1.2.4 new asp.net mvc 3 ...

    MVC模式与框架

    MVC框架与模式分析在实践中,人们总结出了一些常用的软件系统结构高层模式,以供应用系统设计时参考。这些模式包括:单服务两层/多层C/S;MVC结构;面向服务的SOA与多服务集合;数据交换总线等。

    Ruby on Rails中MVC结构的数据传递解析

    如果读者已经开发过基于 Rails 的应用,但对其 MVC 间的数据传递还有诸多困惑,那么恭喜您,本文正是要总结梳理 Rails 数据传递的方法和技巧。Ruby on Rails 3(以下统称为 Rails 3)是当前的主要发布版本,本文所述...

    java-springboot“小世界”私人空间毕业设计程序.zip

    总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果...

    基于 servlet 开发的学生管理系统(mvc+bootstrap+jquery3.0+mysql)

    项目描述:基于 servlet 开发的系统 ...3.数据库 Mysql 以及 Druid 连接池、服务器使用 Tomact8.5,开发...项目总结:从项目中学会用 bootstrap 框架对前端页面进行快速搭建,熟悉了 mvc 开发流程,掌握了 JAVAEE 模式开

    使用MVC连接数据库及MVC应用的一般命名

    MVC使得业务逻辑与显示相分离,可以使代码更加的规范与清晰,下面是我自己总结的一般包的一些命名,可能不太规范,希望对大家有帮助!  java数据库链接三层结构:  是对java的工程进行分层,封装。  三层: ...

    ssi框架学习总结(mvc三层架构)

    相信大家对于mvc的三层架构已经灰常熟悉了,在这就不细讲了,个人感觉ssi的框架结构还是比较典型的mvc三层架构,还是比较容易上手的。关于这块的入门我想特别感谢下FrankHui童鞋,在他的帮助下,我才能比较快滴熟悉...

    Java面试题总结,包括数据结构、设计模式等常见问题

    Java面试题总结,包括数据结构、设计模式、反射机制、MVC、进程与线程等常见问题 秋招收集的面经资源,分享出来,希望能帮到大家~ 侵删!

    看透springMvc源代码分析与实践

    21.1 Spring MVC原理总结272 21.2 实际跟踪一个请求275 第22章 异步请求281 22.1 Servlet 3.0对异步请求的支持281 22.1.1 Servlet 3.0处理异步请求实例282 22.1.2 异步请求监听器Async-Listener284 22.2 ...

    MVC、前端控制器、服务工作者三种模式写的jsp企业职员信息管理

    本项目使用用JSP语言作为根本,选用经典的Tomcat作为服务器平台,采用MVC、前端控制器、服务工作者三种主要模式,并用Eclipse作为开发平台,详细介绍了本管理系统的开发过程。并从系统的需求分析、系统分析、概要设计...

    看透springMvc源代码分析与实践.pdf

    全面介绍Spring MVC的架构、原理、核心概念和操作,通过案例完整呈现Tomcat的实现,系统总结Spring MVC九大组件的处理以及常用的技巧和实践 在大型网站和复杂系统的开发中,Java具有天然的优势,而在Java的Web框架中...

    ASP.NET小结之MVC, MVP, MVVM比较以及区别(二)

    上一篇得到大家的关注,非常感谢。由于自己对于这些模式的理解也是有限,对于这些模式的比较,是结合自己的理解,一些地方不一定准确,但是只有亮出自己的观点,才能抛砖引玉不是?... MVC, MVP和MVVM模式使用场景总结

    硕士生毕业论文,电子政务系统的实现

    基于MVC实现的电子政务系统 1.4本论文的组织 本文 的 组 织结构如下: 第一 章 引 言。主要讲述电子政务系统开发的现状,以及mvc设计模式应用于 ...本章总结全文,指出本系统设计的不足及下一步工作的 研究重点。

    基于asp.net mvc5.2.7个人博客系统程序(aspxadmin cms)下载

    广州阅速Cms系统基于B/S结构和asp.net MVC 5.2.7架构创建,传承53BK数字报刊系统优秀安全基因。它能快速搭建新闻、文章系统、个人博客和手机app后端等网站、管理和发布内容。界面模板也可以自由定制设计成你自己需要...

    java-jsp基于MVC框架的在线书店设计计算机毕业设计程序.zip

    总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果...

Global site tag (gtag.js) - Google Analytics