`
dbzhuan
  • 浏览: 21355 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
最近访客 更多访客>>
社区版块
存档分类
最新评论
阅读更多



 
一 . MVC概述:

最近才接触到它,M—V—C,顾名思义,即模型层(数据库控制层,进行逻辑处理因此也可以分为Dao层和Service层),视图层(请求到的Jsp/Servlet,Html),控制层(一般是一个Servlet,现在多用Structs的实现 )。MVC设计模式它的目的是实现一种动态的程序设计,使后续的对程序的修改和扩充套件简化,并且使程序可重用一部分代码。MVC还是程序的结构更加简化清晰,不同专长的人可以完成不同的功能:



 


视图:界面设计人员进行界面设计(系美工)
控制器:负责转发请求,对流程进行控制,它主要用来实现视图层和模型层同步处理。
模型:要处理很多业务逻辑
MVC结构的系统会从根本上强制我们将web系统中的数据对象、业务逻辑、用户界面三者分离
二 . MVC设计模式的实现流程:定义了一 个简单的实现流程



 
 


用一个简单的MVC实例实现:




  •  
     

    我们的MVC理框架结构有五部分组成:
    1. ControllerServlet.java:请求分发控制器,解析请求中的动作名字,调用动作工厂对象生成的动作对象处理请求,处理后返回的结果为目地url,控制器再将请求和应答对象转向目标url。
    2. ActionFactory.java:该工厂类将请求中的动作名转换成 servlet 可以用来完成其工作的动作类。
    3. Action.java: 接口类,该接口定义所有动作的公共接口。
    4. 具体Action的实现类:指实现了Action接口的类,会被ActionFactory工厂根据请求中的名字创建,从而调用其具体实现的方法处理Request\Response对象后,返回一个URL由主控Servlet转发给用户。可以理解为,为一个具体的Action实现类用于处理页面上每一种用户点击(请求)
    5. 系统视view层e实现:
    代码说明各部分的简单实现:
    (1).控制器Servlet实现:
    所有页面发起的以*.cn的请求,都被web.xml配置给ControllerServlet进行处理,在ControlServlet中根据*的字符串,调用ActionFactory生成的指定Action对象的方法,再将处理后的URL转发给用户。
    控制器Servlet代码模型如下:
    package cn.netjava.servlet;
    import java.io.IOException;
    import javax.servlet.*;
    import cn.netjava.action.Action;
    import cn.netjava.action.ActionFactory;
    /**

    *系统控制器实现
    *功能:1.解析请求中的命令名
    *      2.根据请求的命令名调用工厂对象创建命令处理对象
    *      3.调用命令对象处理请求和应答对象,返回目标路径名
    *      4.本控制器将请求和应答转发至目标路径名
    */
    public class ControlServlet extends HttpServlet {
          //主控servlet分发用户请求的入口
         public void   service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
             try{ 
    String path=
    String start=path.getsubString();
    String end=path.getsubString();
    String actionName=
        //得到请求的命令名字:解析出*.cn请求中*所指代的字符串,即动作名字
            String actionName= getActionName(request);
            System.out.println(" request action is: "+actionName);
                //根据请求的动作名,得到控制器servlet中配置的Action实现类名字
              String actionClassName=this.getInitParameter(actionName);
              System.out.println("actionClassName is: "+actionClassName);
               //通过工厂类创建命令对象
              Action action = ActionFactory.getIns().getAction(actionClassName);
                //使用动作对像处理动作,返回结果为处理后要输出的目标页面
              String url = action.execute(request, response);
              if (url != null){
                //输出目标页面
              System.out.println("dest url is: "+url);
              getServletContext().getRequestDispatcher(url).forward(request, response);
               }
             }catch(Exception ef){
            ef.printStackTrace();
            //出错时,输出到错误页面
       getServletContext().getRequestDispatcher("/error.jsp").forward(request, response);
             }
    }
    //解析得到请求中的"命令"字
    //如请求路径为loginAction.cn解析得到loginAction
         protected String getActionName(HttpServletRequest request) {
              String path = request.getServletPath();
              return path.substring(1, path.lastIndexOf("."));
         }
    }
    (2).Action对象工厂类实现:
    ActionFactory是一个单实例类(整个系统只需要使用其一个对象),它只提供一个Action getAction(String actionClass) 的方法调用;这个方法根据传入的类名字(实现了Action接口的类名字)创建一个Action对象。这个方法在ControlServlet中被调用。代码如下:
    package cn.netjava.action;
    /**
    *命令对象工厂类实现
    *根据命令名字,创建命令对象
    */
    public class ActionFactory {
        //单实例访问方法
        public static ActionFactory getIns(){
        if(null==ac){
        ac=new ActionFactory();
        }
        return ac;
        }

        /**
         * 根据具体的Action类名字创建Action对象
         * @param actionName:具体的Action类全名
         * @return :Action类型对象
         */
         public Action getAction(String actionClass) {
              Action actionInstance = null;
              try {
              Class c=Class.forName(actionClass);
                   actionInstance = (Action) c.newInstance();
              } catch (Exception e) {
                   e.printStackTrace();
              }
              return actionInstance;
         }
         //不需要创建对象
         private ActionFactory() {    }
         private static ActionFactory ac=null;
    }
    (3).Action接口类定义:
    这个接口定义非常简单,系统中所有的命令对象都必须实现这个接口,以便在控制器处理时,通过工厂类返回其对象。
    package cn.netjava.action;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
    *系统中的命令处理器接口定义
    */
    public interface Action {
    /**
    * 所有的具体Action实现这个接口
    * @param request:请求对象
    * @param response:应答对象
    * @return :结果页面
    */
         public String execute(HttpServletRequest request, HttpServletResponse response);
       
    }




    以登陆这个具体动作为例它的实现:
    //登陆Action实现
    public class LoginAction implements Action {

         public String execute(HttpServletRequest request, HttpServletResponse response){
        String userName=request.getParameter("userName");
        String pwd=request.getParameter("pwd");
        //到数据库查找用户
        UserInfo user=MemoDBAccess.hasUser(userName, pwd);
        //有这个用户
        if(null!=user){
        //将用户对象放入session
        request.getSession().setAttribute("S_USER_OBJ",user);
        return "/mainPage.jsp";
        }
        request.setAttribute("R_ERROR_MSG"," 帐号或密码不正确!");
        return "/login.html";
       
         }
    }

    (4).web.xml中配置请求发送给控制器Servlet
    最后,我们只需要在wex.xml中对MVC结构的配置:
    视图面中的请求都是以<运作名字>.cn结尾,当这个请求到达web服务器后,会被服务器转向给控制器处理,控制器再根据解析出的动作名,调用对应的Action对象,处理结果,并输出结果页面,所以web.xml中必须有如下配置:
    <description>控制器servlet</description>
        <display-name>控制器servlet</display-name>
        <servlet-name>ControlActionServlet</servlet-name>
    <servlet-class>cn.netjava.control.ControlActionServlet</servlet-class>
    <!-- 将具体Action名字和全类名配置到Servlet参数中 -->
         <init-param>
          <param-name>ActionName</param-name>
        <param-value>cn.netjava.action.TheActionImpClassName</param-value>
         </init-param>
      </servlet>
    <servlet-mapping>
          <servlet-name>ControlActionServlet</servlet-name>
          <url-pattern>*.cn</url-pattern>
      </servlet-mapping>

    (5).系统视view层e实现:

    然后以一个具体的登录过程说下Action类的实现:
    表示层,即页面,接受用户输入数据,用户提交后,即发送给后台,经过控制器转发给具体的Action处理,以下表为各个页面的效果和代码:
    Login.jsp登陆页面


  •  

    代码:
    <%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
    <html><head><title>SampleBBS--你问我答---蓝杰信息@www.NetJava.cn</title>
      </head>  <body>
    <form name="testForm" method="get" action="LoginAction.netjava">
      <br>用户名: <input type="text" name="userName"/>
      <br>密&nbsp;&nbsp;&nbsp;  码: <input type="password" name="pwd"/>
      <%
      String errorMsg=(String)request.getAttribute("R_ERROR_MSG");
      if(null!=errorMsg){
       out.print("<br>"+errorMsg);
      }
       %>
    <input type="Submit" name="submit" value="登陆"/>
    </form>  <a href="userReg.html">注册新用户</a>
      </body></html>

三 . MVC的优点和缺点: 
      1 、 优点

  • 首先,最重要的一点是多个视图能共享一个模型,正如我所提及的,现在需要用越来越多的方式来访问你的应用程序。对此,其中一个解决之道是使用MVC,无论你的用户想要Flash界面或是 WAP 界面;用一个模型就能处理它们。由于你已经将数据和业务规则从表示层分开,所以你可以最大化的重用你的代码了。

    由于模型返回的数据没有进行格式化,所以同样的构件能被不同界面使用。例如,很多数据可能用HTML来表示,但是它们也有可能要用Macromedia Flash和WAP来表示。模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。

    因为模型是自包含的,并且与控制器和视图相分离,所以很容易改变你的应用程序的数据层和业务规则。如果你想把你的数据库从MySQL移植到Oracle,或者改变你的基于RDBMS数据源到LDAP,只需改变你的模型即可。一旦你正确的实现了模型,不管你的数据来自数据库或是LDAP服务器,视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互对立,改变其中一个不会影响其它两个,所以依据这种设计思想你能构造良好的松偶合的构件。

    对我来说,控制器的也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。
  •      2 、缺点:
    MVC的缺点是由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。

    你将不得不花费相当可观的时间去考虑如何将MVC运用到你的应用程序,同时由于模型和视图要严格的分离,这样也给调试应用程序到来了一定的困难。每个构件在使用之前都需要经过彻底的测试。一旦你的构件经过了测试,你就可以毫无顾忌的重用它们了。

    根据我个人经验,由于我们将一个应用程序分成了三个部件,所以使用MVC同时也意味着你将要管理比以前更多的文件,这一点是显而易见的。这样好像我们的工作量增加了,但是请记住这比起它所能带给我们的好处是不值一提。

    MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

四. MVC的拓展: 

 

           MVC框架的一种实现模型
          模型二(Servlet-centric):
           JSP+Servlet+JavaBean,以控制为核心,JSP只负责显示和收集数据,Sevlet,连接视图和模型,将视图层数据,发送给模型层,JavaBean,分为业务类和数据实体,业务类处理业务数据,数据实体,承载数据,基本上大多数的项目都是使用这种MVC的实现模式。

StrutsMVC框架(Web application frameworks)

Struts是使用MVC的实现模式二来实现的,也就是以控制器为核心。

Struts提供了一些组件使用MVC开发应用程序:
Model:Struts没有提供model类。这个商业逻辑必须由Web应用程序的开发者以JavaBean或EJB的形式提供

View:Struts提供了action form创建form bean, 用于在controller和view间传输数据。此外,Struts提供了自定义JSP标签库,辅助开发者用JSP创建交互式的以表单为基础的应用程序,应用程序资源文件保留了一些文本常量和错误消息,可转变为其它语言,可用于JSP中。

Controller:Struts提供了一个核心的控制器ActionServlet,通过这个核心的控制器来调用其他用户注册了的自定义的控制器Action,自定义Action需要符合Struts的自定义Action规范,还需要在struts-config.xml的特定配置文件中进行配置,接收JSP输入字段形成Action form,然后调用一个Action控制器。Action控制器中提供了model的逻辑接口。


     

  • 大小: 9.5 KB
  • 大小: 15.3 KB
  • 大小: 7.6 KB
  • 大小: 18.8 KB
0
0
分享到:
评论

相关推荐

    ASP.NET MVC小结之基础篇(二)

    ASP.NET MVC是一个强大的框架,用于构建可维护性和可测试性高的Web应用程序。在这个基础篇的第二部分中,我们将深入理解其核心概念,包括请求过程、控制器、动作、路由以及路由的优势。 1. **ASP.NET MVC请求过程**...

    【ASP.NET编程知识】ASP.NET MVC小结之基础篇(二).docx

    ASP.NET MVC 基础知识点总结 在 ASP.NET MVC 中,请求过程是从客户端发送请求到服务器端处理的过程。这个过程可以被分解为以下几个部分: 1. Controller:控制器在 ASP.NET MVC 中扮演着处理客户端请求的角色。...

    MVC编程实训实验报告

    在本篇MVC编程实训实验报告中,我们将深入探讨如何运用MVC(Model-View-Controller)模式来实现文件的上传、分割与合并功能。MVC模式是一种软件设计模式,常用于构建Web应用程序,它将应用程序的数据模型、用户界面...

    ASP.NET MVC 5 with Bootstrap and Knockout

    小结 第2章Bootstrap介绍 默认菜单 含有下拉列表和搜索框的菜单 按钮 警告框 主题 小结 第3章Knockout.js介绍 安装Knockout.js 基本示例 何为MVVM? 创建ViewModel 小结 第4章数据库应用 Entity ...

    Spring mvc中 RequestMapping 6个基本用法小结

    Spring MVC 中的 RequestMapping 6个基本用法小结 Spring MVC 是一个基于 Java 的 Web 应用程序框架,提供了强大的 RequestMapping 机制来处理 HTTP 请求。在 Spring MVC 中,RequestMapping 是一个核心组件,负责...

    Asp.NetMVC4入门指南(经典).pdf

    指南在最后部分提供了一个小结,对整个教程内容进行回顾,并指导学习者如何开始使用*** MVC 4框架。同时,指南还提供了一个示例项目的链接,以便学习者下载并亲自实践教程中所学的知识点。 #### 总结 这份"***MVC4...

    Windchill 10 MVC table

    ### 小结 通过以上介绍可以看出,在Windchill 10中,可以通过MVC架构有效地管理和操作表格数据。具体来说,`setChooseToChange`和`setPCRNO`这两个方法分别用于更新MVC表中特定列的选中值和所有行的`PCR_NO`列值,...

    MVC4 模块考试

    ### 小结 MVC4是一种重要的Web开发模式,它不仅有助于提高代码的组织结构,还能够简化测试和维护过程。对于希望构建现代化Web应用程序的开发者来说,理解和掌握MVC4是非常有益的。通过学习上述内容,考生们可以更好...

    Android mvc详解

    #### 四、小结 MVC 架构模式在 Android 开发中具有重要的作用,它能够帮助开发者更好地组织代码,提高程序的可维护性和可扩展性。通过将 GeoQuiz 应用作为一个具体的案例进行分析,我们不仅可以深入理解 MVC 模式的...

    Spring MVC总结(一)

    Spring MVC架构与DispatcherServlet配置 Spring MVC是一种流行的基于Java的Web应用框架,它提供了一个灵活的架构来开发Web应用程序。在本文中,我们将对Spring MVC的架构和DispatcherServlet的配置进行总结。 ...

    asp.net mvc request生命周期流程图

    #### 四、小结 理解 ASP.NET MVC 的 Request 生命周期对于开发者来说是非常重要的。它不仅可以帮助我们更好地组织代码结构,还可以让我们更加灵活地定制应用程序的行为。通过深入学习这些关键阶段以及各个扩展点的...

    Asp.net MVC4教学-动态表格

    Asp.net MVC4教学入门: ...技术要点小结: 1. Dreamweaver制作的html及CSS如何和VS MVC4开发平台结合使用。 2. get和post请求的区别。 3. 静态和动态的区别。 4. mvc开发平台自带的html助记符的使用。

Global site tag (gtag.js) - Google Analytics