zoukankan      html  css  js  c++  java
  • [SpringMVC]SpringMVC学习笔记一: springmvc原理及实例解析.

    前言:
    今天来回顾下SpringMVC的开发原理, 使用图文并茂的方式 来解析其中的内幕, 我相信懂了其中的运行机制后, 对于面试中SpringMVC大家都可以说so easy了. 

    一, 图示法



    第二张图的前端控制器应为DispatcherServlet. 看完图中的整体流程后, 我们再使用实际代码来说明每一步需要处理 的事情.

    二. 代码示例

    第一步: 用户发送请求, 前端控制器DispatcherServlet开始处理.
    在web.xml中配置前端控制器:

     1 <servlet>
     2       <servlet-name>springmvc</servlet-name>
     3       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     4       <!-- 默认加载springmvc配置文件: 但是springmvc配置文件必须符合规范
     5           名称规范:servelt-name-servlet.xml======springmvc-servlet.xml
     6           路径规范:springmvc-servlet.xml必须在WEB-INF下面
     7           但是自己可以通过配置init-param属性来指定springmvc配置文件的名称和路径. 
     8       -->
     9       <init-param>
    10           <param-name>contextConfigLocation</param-name>
    11           <param-value>classpath:springmvc.xml</param-value>
    12       </init-param>
    13   </servlet>
    14   
    15   <servlet-mapping>
    16       <servlet-name>springmvc</servlet-name>
    17       <url-pattern>*.do</url-pattern>
    18   </servlet-mapping>

    第二步:请求寻找Action(处理映射器处理)
    处理映射器有三种, 这三种在配置和代码实现中稍有不同, 下面给出三种不同模式下的springmvc.xml的配置:
    BeanNameUrlhandlerMapping:
    功能:默认的映射器,复杂寻找Controller根据beanController)的name属性的匹配daoController. 需要在springmvc定义

    SimpleUrlHandlerMapping:简单处理映射器, 功能: 寻找Controller,把url进行集中处理.

    通过prop中的value值区 对应找到具体的Controller, 当在浏览器中输入abc.do 或者wangmeng.do或者barrywang.do都会映射到这个Controller去执行. 

    ControllerClassNameUrlHandlerMapping:类名映射器: 通过类名访问, 首字母需要小写. 类名如果有三个单词以上: 除了最后一个, 其他的单词首字母都小写.
    如果配置了 就可以在浏览器上直接访问controller的名字.在浏览器直接使用userController去访问即可 .

    如若使用注解开发, 那么注解的处理器映射器的写法是: springmvc.xml

    1 <!-- 配置注解的处理器映射器 -->
    2 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

    第三步:处理器映射器返回chain给前端控制器.

    第四步:请求执行Action.

    第五步:处理器适配器HandlerAdapter 执行Action. 

    处理器适配器也有两种.
    SimpleControllerHandlerAdapter
    功能:执行Controller。调用Controller方法。默认的处理使配置

    如果使用简单处理器适配器, 那么我们自定义的Handler方法则需要实现Controller接口.
    自定义Handler:

     1 public class UserController implements Controller{
     2 
     3     @Override
     4     public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
     5         //接受请求,封装参数,验证参数,调用业务方法,返回执行结果
     6         //返回视图。
     7         ModelAndView mv = new ModelAndView();
     8         //设置数据,任意pojo,在页面回显
     9         mv.addObject("Hello", "凤姐喜欢你,非常喜欢你!");
    10         //指定返回页面,指定物理视图
    11         //mv.setViewName("/WEB-INF/jsps/index.jsp");
    12         //指定返回页面, 指定逻辑视图
    13         mv.setViewName("index");
    14         return mv;
    15     }
    16 }

     

    在springmvc中的配置:

    1 <!-- 配置处理器适配器
    2   功能: 执行Controler,调用Controller方法.
    3   SimpleControllerHandlerAdapter:默认的处理使配置
    4 -->
    5 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    6 
    7 <!-- 配置自定义bean -->
    8 <bean id="user" name="/hello.do" class="cn.augmentum.controller.UserController"></bean>

    HttpRequestHandlerAdapter:执行实现接口HttpRequestHandlerController
    自定义的Handler需要实现HttpRequestHandler接口.

     1 public class ItemsController implements HttpRequestHandler{
     2 
     3     public void handleRequest(HttpServletRequest request, HttpServletResponse response)
     4             throws ServletException, IOException {
     5         //给request域中设置值
     6         request.setAttribute("hello", "奥巴马喜欢凤姐!");
     7         
     8         //使用Request转发
     9         request.getRequestDispatcher("/WEB-INF/jsps/index.jsp").forward(request, response);
    10         
    11     }
    12 }

    spring.xml中的配置:

    1 <!-- 创建执行实现HttpRequestHandler接口适配器 -->
    2 <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>


    如若使用注解开发, 那么注解形式的处理器适配器写法为: springmvc.xml:

    1 <!-- 配置注解的处理器适配器 -->
    2 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

    第六步:自定义Handler(Controller)返回ModleAndView
    这里有两种方式, 一种是指定返回页面,指定物理视图. 另一种是指定返回页面, 指定逻辑视图. 如果是指定逻辑视图, 我们还需要在springmvc中配置视图解析器.

    第七步:处理器适配器将ModleAndView返还给前端控制器进行处理.

    第八/九步: 前端控制器像视图解析器发送请求, 请求解析ModleAndView, 并将解析后的物理视图返回.(如果本身定义的就是物理视图则无需解析)
    在springmvc.xml中需要配置:

    这里是解析UserController.java从传递过来的: index, 经过解析后得到物理视图为: /WEB-INF/jsps/index.jsp.

    第十/十一 步: 将解析后的物理视图 渲染, 然后展示index.jsp给用户.

    第十二步: 响应页面.

     到了这里SpringMVC的整个执行流程就非常清晰明了啦, 这里严格的使用了MVC的设计思想, 如果面试中遇到springmvc执行流程的问题, 相信大家再也不用担心了.

     更多的推荐大家有时间的话看看springmvc的源码解析: http://my.oschina.net/lichhao/blog?catalog=285356

  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/wang-meng/p/5723601.html
Copyright © 2011-2022 走看看