`
coder_hero
  • 浏览: 11147 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

简单的MVC框架流程

    博客分类:
  • Java
阅读更多

根据MVC的设计思想,自己动手做一个简单的MVC流程。从而加深对Spring MVC的理解。

我们知道MVCModel-View-Controller)即模型-视图-控制器, Struts,Spring MVC都是采用了这种模式。

根据MVC的设计思想,一个完整的HTTP请求需要经过以下几步。

1,所有的HTTP请求都将映射到一个Servlet上。

2, Servlet根据URL选择合适的Controller来处理请求,获得返回的ModeView

3, ServletModel绑定到Request中,然后交给View渲染。

4, View将渲染后的页面返回给用户,完成请求处理。

由于存在多个控制器,如果直接用Servlet作为控制器,则需要实现多个Servlet,这会导致非常复杂的配置和大量的重复代码。因此,通常将Servlet作为一个请求入口,或者称之为前置控制器,然后根据URL选择一个合适的控制器处理。

下面,我们在Eclipse中建立一个SimpleMVC项目,自己动手实现一个最简单的MVC流程.

我们知道所有的请求会映射到一个Servlet上,然后这个Servlet根据URL与控制器的映射关系在选择合适的控制器来处理。所有我们可以先抽象出一个Controller接口。所有的控制器都实现这一接口,这也面向接口编程的好习惯。

public interface Controller {

    //只有一个方法.处理请求的方法

    ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response);

}

Controller需要返回视图和将要由视图渲染的Model。视图通常是JSP页面,因此,返回JSP页面的路径即可,而Model可以简单地使用Map来实现。由于一个方法只能返回一个对象,因此,有必要将ModelView一起返回。设计ModelAndView如下。

public class ModelAndView {

    private String view;

    private Map<String, Object> model;

    public ModelAndView(String view, Map<String, Object> model) {

       this.view = view;

       this.model = model;

    }

    public String getView() {

       return view;

    }

    public Map<String, Object> getModel() {

       return model;

    }

}

下面设计具体的控制器。我们先设计一个LoginController,这是用来处理登录请求的控制器。

public class LoginController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request,

           HttpServletResponse response) {

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

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

        if("123".equals(username) && "123".equals(password)) {

            // 登录成功,将转入/welcome.jsp:

            Map<String, Object> model = new HashMap<String, Object>();

            model.put("username", username);

            model.put("password", password);

            model.put("time", new Date().toString());

            return new ModelAndView("/welcome.jsp", model);

        }

        // 登录失败,将转入/loginFailed.jsp:

        Map<String, Object> error = new HashMap<String, Object>();

        error.put("message", "Login failed.");

        error.put("time", new Date().toString());

        return new ModelAndView("/loginFailed.jsp", error);

    }

}

这个控制器实现了Controller接口,当我们以http://xxxxxx/login.do这种请求时。

Servlet根据url映射关系(下面会说到)会调用LoginController来处理。

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

取得/login.do?username=xxx这种形式传来的参数。进行用户名密码验证,如果成功就返回model(返回页面展示用的数据)和view(返回的页面名称),我们在这里用Map封装了返回的数据并和view(/welcome.jsp)一起返回给前置控制器(Servlet),最终由前置控制器来完成将页面传回给用户。

    接下来我们设计另一个控制器LogoutController,主要用来处理用户退出

public class LogoutController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request,

           HttpServletResponse response) {

        Map<String, Object> model = new HashMap<String, Object>();

        model.put("message", "loguot success...");

        model.put("time", new Date().toString());

        // 返回的JSP视图路径是"/logout.jsp":

        return new ModelAndView("/logout.jsp", model);

    }

}

    这个控制器和上面一样,也是返回一个modelview.view其实就是返回给用户的页面。Model就是页面上要用来显示的数据。

    接下来我们设计最重要的前端控制器servlet,它主要用来处理请求转发,根择不同的url选择合适的控制器来进行处理。我们给这个控制器命保为DispatcherServlet;

public class DispatcherServlet extends HttpServlet {

    private ServletContext context;

    private Map<String, Controller> controllers;

    //初始化DispatcherServet

    public void init(ServletConfig config) throws ServletException {

       context = config.getServletContext();

       // URL和对应的Controller关联起来:

       controllers = new HashMap<String, Controller>();

       //login.do的请求将交由LoginController控制器处理

       controllers.put("/login.do", new LoginController());

       //logou.do的请求将交由LogoutController控制器处理

       controllers.put("/logout.do", new LogoutController());

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       String contextPath = request.getContextPath();

       String uri = request.getRequestURI().substring(contextPath.length());

       Controller controller = controllers.get(uri);

       ModelAndView mv = controller.handleRequest(request, response);

       // Model绑定到Request:

       Map<String, Object> model = mv.getModel();

       Set<String> keys = model.keySet();

       for (String key : keys)

           request.setAttribute(key, model.get(key));

       // 获得JSP视图的路径:

       String jsp = mv.getView();

       // 转发给JSP视图渲染:

       context.getRequestDispatcher(jsp).forward(request, response);

      

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       doGet(request, response);

    }

}

从代码中可以看出DispatcherServlet继承HttpServet

里面的初始化方法中(init),创建了一个Map,controllers.put("/login.do", new LoginController());这句说明了url和控制器的映射关系。当/login.do的请求过来时。就会用LoginController来进行处理

String contextPath = request.getContextPath();

取得当前系统的路径。如你的访问是http://localhsot:8080/SampleMvc/login.do,那么会返回/SampleMvcString uri = request.getRequestURI().substring(contextPath.length());request.getRequestURI()取得当前系统请求的url,如你的访问是http://localhsot:8080/SampleMvc/login.do,那么会返回/SampleMvc/login.do调用.substring方法后就得到了/login.do.还记得我们上面controllers.put("/login.do", new LoginController())这句吗,这样我们得到了/login.do的请求,servlet根据此关系就能知道调用那个控制器来处理了

Controller controller = controllers.get(uri);

ModelAndView mv = controller.handleRequest(request, response);

得到具体的控制器。调用控制器进行处理后返回modelview。接下来把model中的数据绑定在request中,供页面展示这此数据。

context.getRequestDispatcher(jsp).forward(request, response);返回页面给用户

web.xml中的配置

<servlet>

       <servlet-name>dispatcherservlet</servlet-name>

       <servlet-class>com.lee.DispatcherServlet</servlet-class>

</servlet>

<servlet-mapping>

       <servlet-name>dispatcherservlet</servlet-name>

       <url-pattern>*.do</url-pattern

</servlet-mapping>

接下来我们可以分别用

http://localhost/SampleMvc/login.do?username=123&password=123

http://localhost/SampleMvc/logout.do测试

分享到:
评论
2 楼 crabboy 2008-05-08  
貌似 “雪峰”的东西。
1 楼 javachs 2008-05-08  
兄弟你太有才了。

相关推荐

    简单的MVC框架例子

    **简单的MVC框架例子** 在Web开发中,MVC(Model-View-Controller)模式是一种广泛应用的设计模式,它将应用程序的结构分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这个简单的MVC框架...

    简单mvc框架

    总的来说,这个自定义的简单MVC框架通过注解驱动、自动事务管理、AOP和IOC等技术,提供了一种轻量级的开发方式,简化了开发流程,提升了开发效率。对于初学者或希望深入理解MVC和相关概念的人来说,这是一个很好的...

    php简易MVC框架

    **PHP简易MVC框架详解** PHP简易MVC框架是由新浪的...总结,PHP简易MVC框架是一个学习MVC模式的良好起点,通过它,开发者可以深入理解Web开发的结构和流程,提升编程能力,并为将来使用更复杂的框架打下坚实的基础。

    MVC框架工程Myeclipse做的

    **MVC框架详解** 在软件开发领域,MVC(Model-View-Controller)框架是一种广泛应用于Web应用设计的架构模式。MVC将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller),以此实现业务...

    PHP 封装简单MVC框架

    通过这个简单的PHP MVC框架,新手可以逐步掌握Web开发的基本流程和最佳实践,为未来更复杂的项目打下坚实基础。在实际操作中,你可以尝试创建新的模型、控制器和视图,以熟悉整个流程。同时,不要忘记查阅相关文档和...

    .netmvc框架

    在处理表单提交时,MVC框架支持模型绑定,自动将表单数据映射到对应的模型属性,简化了数据验证和处理流程。配合DataAnnotations,可以在模型类上添加验证规则,实现客户端和服务器端的双重验证。 对于测试,.NET ...

    C# MVC权限框架 流程框架

    C# MVC框架提供了强大的工具和结构,使得开发者可以更加清晰地组织代码,提高代码的可维护性和测试性。 在C# MVC权限框架中,用户管理是一个核心功能。这通常包括用户注册、登录验证、密码重置、角色分配等。系统会...

    ET-MVC框架

    ET-MVC框架是一款基于MVC(Model-View-Controller)设计模式的轻量级开发框架,专为简化中小型项目的开发流程而设计。该框架遵循“约定优于配置”的原则,这意味着在开发过程中,开发者无需进行过多的配置,只需按照...

    MVC框架教程

    在使用MVC框架时,你需要按照特定的目录结构创建项目,包括模型、视图和控制器的文件夹,以便更好地组织代码。 2. **路由配置**: MVC框架中的路由系统负责将HTTP请求映射到相应的控制器方法。开发者可以自定义...

    Java mvc 框架例子

    这个Java MVC框架的例子为我们提供了一个直观的学习平台,帮助初学者理解MVC的运作机制。 **一、MVC模式介绍** Model-View-Controller(模型-视图-控制器)是一种分层架构,用于分离业务逻辑、数据处理和用户界面。...

    利用Java做的基本MVC框架

    "利用Java做的基本MVC框架"指的是使用Java编程语言实现的一个MVC架构,旨在简化Web应用的开发流程。下面我们将深入探讨这个话题。 首先,MVC模式的核心理念是: 1. **模型(Model)**:这是业务逻辑的载体,负责...

    Struts 2 自定义MVC 框架

    自定义Struts 2 MVC框架的过程有助于深入理解其工作原理,从而更好地应用和优化项目。 首先,我们来详细探讨Struts 2的核心组件和它们的角色: 1. **模型(Model)**:模型是应用的核心,负责处理业务逻辑和数据。在...

    很好的JAVA的MVC框架应用实例

    Java MVC框架是软件开发中广泛使用的模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这个标题所指的“很好的JAVA的MVC框架应用实例”很可能是提供了一个使用Java实现MVC...

    .net MVC框架的DEMO

    在本DEMO中,"OrderingMS"很可能是一个关于在线订餐或订单管理系统的示例应用,旨在帮助初学者理解MVC框架的工作原理和实际应用。 1. **MVC模式概述**: MVC模式是软件设计中的一种架构模式,由模型(Model)、...

    javaweb课程设计mvc框架

    通过这个课程设计,你可以全面了解JavaWeb应用的开发流程,同时掌握MVC框架的实践应用,为未来的Web开发工作打下坚实的基础。记得在实践中不断探索和学习,理论结合实际,才能更好地掌握这项技术。

    最简单的MVC框架源码

    4. **MVC框架的运行流程**: - 用户发起HTTP请求,请求到达`index.php`入口文件。 - 入口文件解析请求,通过路由规则决定调用哪个控制器方法。 - 控制器方法被调用,根据需求实例化相应的模型,执行数据操作。 -...

    简单的android mvc 框架

    下面将详细解释这个简单的Android MVC框架以及如何在实际项目中应用。 **模型(Model)** 模型组件负责处理数据和业务逻辑。在Android MVC框架中,Model通常包含数据对象、数据库访问对象(DAO)和与服务器交互的...

    ASP.NETMVC框架开发系列课程2_一个简单的ASP.NETMVC应用程序WebCast20080425Video

    本课程“ASP.NET MVC框架开发系列课程2_一个简单的ASP.NET MVC应用程序WebCast20080425Video”旨在深入讲解如何使用该框架来构建实际的Web应用程序。 首先,我们要理解MVC模式的基本概念。模型(Model)负责处理...

    MVC权限管理流程审批系统源码+文档.zip_MVC审批流程_MVC权限管理流程审批系统源码+文档_文档管理系统_权限管理_流程

    通过这个源码和文档,开发者可以深入了解如何在MVC框架下实现复杂的权限控制和审批流程,以及构建一个高效、安全的文档管理系统。源码分析和实践将有助于提升开发者在这些领域的技能,对于企业和个人都有很高的学习...

    nutz搭建的MVC框架

    本篇文章将详细介绍如何利用Nutz搭建MVC框架,并探讨其在实际开发中的优势。 **一、Nutz MVC框架介绍** Nutz MVC是Nutz框架的一部分,它基于Servlet容器运行,通过注解驱动,简化了Java Web应用的开发流程。Nutz ...

Global site tag (gtag.js) - Google Analytics