zoukankan      html  css  js  c++  java
  • SpringMVC 思想介绍

    MVC 思想简介

    博客园好像不支持发布markdown的时序图, 如果你会markdown并且不太熟悉Springmvc执行流程, 照着图在Markdown上面敲一遍执行流程,这是我经历过的最快的记忆和熟悉方式!

    1.分为三层 Model(模型层) Controller(控制层) View(视图层)

    最基本的MVC思想结构

    2. Mvc架构特点

    1.1 三层架构,分工明确,相比于传统的五层架构来说,Mvc将数据层和业务逻辑层都囊括在了模型层中

    1.2 SpringMvc的优势
    Spring 框架提供了一整套MVC设计模式的所需组件--Spring Mvc
    Spring Mvc 提供了一个DispatcherServlet ,用作前端控制器用来控制请求,同事提供灵活的配置处理**程序映射**,**视图解析**,**语言环境**,**主题解析**,**文件上传**.
    Spring Mvc 还包含多种视图技术,例如**Java Server Pages(JSP)**,**Velocity**,**iText**,和**POI**等;

    3. SpringMvc的优点

    • 拥有强大的灵活性,非侵入性,和可配置性;
    • 提供了一个前端控制器DispatcherServlet ,开发者不用再开发控制器;
    • 分工明确,包括 控制器,验证器,命令对象,模型对象,处理程序映射视图解析器,等,每一个功能实现由一个专门的对象负责,低耦合;
    • 自动解析,它可以自动绑定用户输入,并且转换输入类型,如:自动解析前端字符串,并自动将其解析为映射对象所需要的类型;
    • 数据传输模式是Map类型,前端JSON获取;
    • 支持国际化,支持更具用户区域显示多国语言,并且国际化的配置非常简单;
    • 支持多种视图技术;

    4. SpringMVC框架流程图

    但是在开发中,我们需要做的没有这么多,只需要开发MVC部分,其他组件由SpringMVC提供

    • SpringMVC框架提供: 中央控制器,处理适配器,处理映射器,视图解析器
    • 其他组件: 浏览器,数据库,模型层,视图层,控制器由我们开发

    5. 开发流程

    5.1. 配置中央控制器(DispatcherServlet)

    • 这一层直接和浏览器接触,需要对浏览器发出的请求进行处理
    • 它最主要,整个spring框架依赖它来启动,所以需要将它设置成在服务器启动时加载
      • web.xml中配置中央控制器
    <!--中央处理器,最最最最最最最重要的部分-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
     
        <!--初始化就素要去读取spring的配置文件,用来初始化-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/spring-*.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--拦截所有以av结尾的请求-->
        <url-pattern>*.av</url-pattern>
    </servlet-mapping>
    

    5.2 配置全局过滤器

    • 用于过滤要进入中央控制器的请求
    <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <!--初始化时指定编码-->
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <!--加强参数-->
    <!--强制设置请求request和响应response的数据信息为encoding-->
    <!--无论客户端是否有指定编码,到了这边全是encoding的编码-->
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
    </filter>
    
    • 注意 : web.xml中的配置信息是有顺序要求的, 详见2.3.dtd

    5.3 配置DispatcherServlet的必须组件

    三大接口是必须的,通常根据不同需求选择他们中的不同实现

    • 处理映射器(HandlerMapping)
      • BeanNameUrlHandlerMapping
        • 如果使用这个映射器,那么就需要实现Controller接口来完成请求分发
    • 处理适配器(HandlerAdapter)
      • SimpleControllerHandlerAdapter
    • 视图解析器(ViewResolver)
      • InternalResourceViewResolver
    <!--配置处理器映射器-->
    <!--这大哥-->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
     
        <!--配置处理器适配器-->
     
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
        <!--配置视图解析器-->
     
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
    
    • 方式二 处理映射器和处理适配器要配套使用
    <bean id="hello2Action" class="com.lyuweigh.action.Hello2Action"/>
    <!--处理映射器-->
        <!--SimpleUrlHandlerMapping 通过Controller的id来找-->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
            <property name="mappings">
                <props>
                    <!--请求的url对应Controller的Bean对象-->
                    <prop key="/demo">hello2Action</prop>
                </props>
            </property>
        </bean>
        <!--处理适配器-->
        <!--Controller需要实现HttpRequestHandler-->
        <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
        <!--视图解析器,不需要配套使用-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
    

    作用的话留待补充

    6. 开发具体的功能控制器Action(Controller)

    • 开发Controller层,这一层主要功能是请求分发和适配
    public class HelloAction implements Controller {
     
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            //可以同时返回视图+数据
            ModelAndView mv = new ModelAndView();
            mv.setViewName("/index.jsp");
            return mv;
        }
    }
    

    7. moudle层,让mybatis做

    6. 使用注解和XML混合配置SpringMVC

    • web.xml 的配置是死的,不用改变
    6.1 基于注解的处理映射器和处理适配器

    老样子,视图解析器不变 还是InternalResourceViewResolver

     <!--注解的配置方案-->
        <!--注解映射器-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
     
        <!--注解适配器-->
        <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
     
    
    • 并且,这注解的配置方按,有简单的方式可以替换手动配置的映射器,适配器
    6.2 Controller的配置方式
    @Controller
    @RequestMapping("hello.do")
    public class Hello3Action {
        //方法可自定义
        @RequestMapping("/demo")
        public ModelAndView helloWorld(HttpServletRequest request, HttpServletResponse response) {
            ModelAndView mv = new ModelAndView();
            mv.addObject("demo", "lyuweigh3");
            mv.setViewName("/index.jsp");
            return mv;
        }
    }
    
    • @RequestMapping()
      • 可以配置在方法上表示该方法的请求路径
      • 也可以配置在类名上表名该模块的请求路径

    可以每个方法都加上一个URL和方法对应

    7. Controller/Action自定义方法设置

    • 注解配置的方法有两种返回方式
      • String
      • ModelAndView
    • 返回的ModelAndView中,返回字符串前面加上
      • redirect: ->表示重定向
      • forward: ->表示转发
    • 返回字符串的方式就和直接了,处理直接弄成JSON格式
    7.1 传值
    1. 功能方法之间的传值(c-c)

      • request
      • session
      • cache(分布式缓存)
    2. 从具体功能方法到页面(c-v)

      • MoudleAndView 的 addObject()
      • String
    3. 从页面到功能方法(v-c)

      • request.getParmeter()

    一共是五种传参方式:

    • 一:直接将请求参数名作为Controller中方法的形参
      举例:public String login (String username,String password) :

      解释:括号中的参数必须与页面Form 表单中的name 名字相同

    • 二:使用@RequestParam 绑定请求参数参数值
      举例:public String login(RequestParam ("username") String name) :

      解释:双引号中的username 必须与页面vlaue名字相同,String name 中的name可以随便写

    • 三:用注解@RequestMapping接收参数的方法

      • 如果后面参数里面的字符串前没有"/",那么会默认加上字符串
    @RequestMapping(value="/login/{username}/{password}")
    public String login(@PathVariable("username") String name,@PathVariable("password") String name)   
    


    解释:上面的 @RequestMapping(value="/login/{username}/{password}") 是以注解的方式写在方法上的。注解上的usernname和 password 必须好页面上value 相同

    • 四:使用Pojo对象(就是封装的类,类中封装的字段作为参数)绑定请求参数值,原理是利用Set的页面反射机制找到User对象中的属性
      举例:
        @ReauestMapping(value=/login”)
        public String login(User user){
    }
    

    解释:就是把封装的一个类当成一个参数放在方法中,封装类中的属性就是就是参数。

    • 五:使用原生的Servlet API 作为Controller 方法的参数
      举例:
    public String login(HttpServletRequest request){
    String usernma=Request.getParameter("username");
    }
    
    解释:使用request 请求页面参数的方式获取从页面传过来的参数
  • 相关阅读:
    Python 函数内变量的作用域
    python return 及lambda函数
    python 函数的定义及传参
    Python 集合
    python 内置函数
    Python 字典
    Python 元组
    LoaRunner性能测试系统学习教程:Windows计数器(2)
    LoaRunner性能测试系统学习教程:操作系统监控(1)
    LoaRunner性能测试系统学习教程:结果分析实践之Summary View(8)
  • 原文地址:https://www.cnblogs.com/lyuweigh/p/10080065.html
Copyright © 2011-2022 走看看