zoukankan      html  css  js  c++  java
  • Spring MVC学习1

    Spring MVC

    Spring MVC是目前主流的实现MVC设计模式的企业级开发框架,Spring框架的一个子模块,无需整合,开发起来更加便捷。

       

    什么是MVC设计模式

    将应用程序分为Control、Model、View三层,Controller接受客户端请求,调用Model生成业务数据,传递个View。

    Spring MVC就是对这套流程的封装,屏蔽了很多底层代码,开放出接口,使开发者更加轻松和便捷的开发出web应用

       

    Spring MVC的核心组件

    • DispatcherServlet:前置控制器,是整个流程控制的核心,控制其他组件的执行,进行统一调度,降低组件之间的耦合性,相当于总指挥。
    • Handler:处理器,完成具体的业务逻辑,相当于Servlet和Action。
    • HandlerMapping:DispatcherServlet接受请求之后,通过HandlerMapping将不同的请求映射到不同的Handler。
    • HandlerInterceptor:处理器拦截器,是一个接口,如果需要完成一些拦截器处理,可以实现该接口。
    • HandleExecutionChain:处理器执行链,包括两部分内容:Handler和HanlerInterceptor(系统会有一个默认HanlerInterceptor,如果需要各位设置拦截,可以添加拦截器)。
    • HandlerAdapter:处理器适配器,Handler执行业务方法之前,需要进行一系列的操作包括表单数据的验证、数据类型的转换、将表单数据分装到javabean等。这些操作都是由HandlerAdapter完成,开发者注意力集中在业务逻辑的处理上,DispatcherServlet通过HandlerAdapter执行不同的Handler.
    • ModelAndView: 装载了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet。
    • ViewResolver:视图解析器,DispatcherServlet通过它将逻辑视图解析为物理视图。

       

    Spring MVC的工作流程

    • 客户端请求被DispatcherServlet接受。
    • 根据HandlerMapping映射到Handler
    • 生成Handler和HandlerInterceptor。
    • Handler和HandlerInterceptor以HandleExecutionChain的形式一并返回给DispatcherServlet。
    • DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理。
    • Handler返回ModelAndView给DispatcherServlet。
    • DispatcherServlet将获取的ModelAndView对象传给ViewResolver视图解析器,将逻辑视图解析为物理视图View。
    • ViewResolver返回一个View给DispatcherServlet。
    • DispatcherServlet根据View进行视图渲染(将模型数据Model填充到视图View中)。
    • DispatcherServlet将渲染后的结果上传服务器。

       

    SpringMVC流程非常复杂,实际开发起中很简单,因为大部分的组件不需要开发者创建、管理,只需要通过配置文件的方式完成配置即可。真正需要开发者进行处理的只有Handler、View。

       

    如何使用?

    1.创建maven工程,pom.xml

        1       <dependency>

        2             <groupId>org.springframework</groupId>

        3             <artifactId>spring-webmvc</artifactId>

        4             <version>5.0.11.RELEASE</version>

        5         </dependency>

       

    2.在web.xml添加一个servlet。

        1 <!DOCTYPE web-app PUBLIC

        2   "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

        3   "http://java.sun.com/dtd/web-app_2_3.dtd" >

        4 

        5 <web-app>

        6     <display-name>Archetype Created Web Application</display-name>

        7     <servlet>

        8         <servlet-name>dispatcherServlet</servlet-name>

        9         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

       10         <init-param>

       11             <param-name>contextConfigLocation</param-name>

       12             <param-value>classpath:springmvc.xml</param-value>

       13         </init-param>

       14     </servlet>

       15     

       16     <servlet-mapping>

       17         <servlet-name>dispatcherServlet</servlet-name>

       18         <url-pattern>/</url-pattern>

       19     </servlet-mapping>

       20 </web-app>

       

    3.springmvc.xml中进行配置

        1 <?xml version="1.0" encoding="UTF-8"?>

        2 <beans xmlns="http://www.springframework.org/schema/beans"

        3               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        4               xmlns:context="http://www.springframework.org/schema/context"

        5               xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

        6                 

        7         <!-- 自动扫描 -->

        8         <context:component-scan base-package="com.wiggin"></context:component-scan>

        9         

       10         <!-- 视图解析器(逻辑视图解析成物理视图) -->

       11         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

       12                 <!-- 前置字符和后置字符 -->

       13                 <property name="prefix" value="/"></property>

       14                 <property name="suffix" value=".jsp"></property>

       15         </bean>

       16 </beans

       

    4.创建Handler

        1 package com.wiggin.controller;

        2 

        3 import org.springframework.stereotype.Controller;

        4 import org.springframework.web.bind.annotation.RequestMapping;

        5 

        6 @Controller // 交给了ioc以及包含了控制器功能

        7 public class HelloHandler {

        8         @RequestMapping("/index") // 返回给index视图

        9         public String index(){

       10                 System.out.printf("执行了index..");

       11                 return "index";

       12         }

       13 }

       

    注解:

    • @RequestMapping

      Spring MVC通过@RequestMapping注解将URL请求与业务方法进行映射,在Handler的类定义处以及方法定义处都可以添加@RequestMapping,在类定义处添加,相当于客户端多了一层访问路径。

      相关参数:

      1.value:指定URL请求地实际地址,是@RequestMapping的默认值

        1 @RequestMapping("/index") // 返回给index视图

        2 public String index(){

        3         System.out.printf("执行了index..");

        4         return "index";

        5 }

    等于

        1   @RequestMapping(value = "/index") // 返回给index视图

        2         public String index(){

        3                 System.out.printf("执行了index..");

        4                 return "index";

        5         }

    2.method: 指定请求method类型,GET,POST,PUT,DELET。

        1 @RequestMapping(value = "/index",method = RequestMethod.GET) // 返回给index视图

        2 public String index(){

        3         System.out.printf("执行了index..");

        4         return "index";

        5 }

    index的方法只能使用GET请求。

    3.parms: 请求中必须包含的参数,否则无法调用该方法

        1 @RequestMapping(value = "/index",method = RequestMethod.GET,params = {"name","id=10"}) // 返回给index视图

        2 public String index(){

        3         System.out.printf("执行了index..");

        4         return "index";

        5 }

    关于参数绑定,在形参列表中通过添加@RequestParam注解完成Http请求参数与业务方法的形参的映射。

        1 @RequestMapping(value = "/index",method = RequestMethod.GET,params = {"name","age=10"}) // 返回给index视图

        2 public String index(String name,@RequestParam("age") int id){

        3         System.out.println(name);

        4         System.out.println(id);

        5         System.out.println("执行了index..");

        6         return "index";

        7 }

    上述代码的中的请求参数name和age分别赋值给了形参name和age,HandlerAdaptor请求参数name和age的类型自动转型为形参name和age的形式。

       

       

    • @Controller

    @Controller在类的定义处添加,将该类交给IoC容器来管理(结合springmvc.xml的自动扫描配置使用),同时使其成为一个控制器,可以接收客户的请求

    补充:Spring MVC也支持RESTful风格的URL。

    传统类型 http://localhost:8080/hello/index?name=wiggin&age=10

    REST:http://localhost:8080/hello/index/wiggin/10

        1 @RequestMapping("/rest/{name}/{age}")

        2 public String rest(@PathVariable("name") String name,@PathVariable("age") int age){

        3         System.out.println(name);

        4         System.out.println(age);

        5         return "index";

        6 }

    REST风格URL必须要加@PathVariable来完成参数映射数映射

       

       

    执行原理:DispatcherServlet捕获url,根据HandlerMapping映射到Handler,即有@RequestMapping("/index")@Controller由springmvc执行方法,最后返回逻辑视图到DispatcherServlet中,由ViewResolver将返回视图名添加前后缀,变为物理视图,最后找到target文件所对应的jsp文件,将其返回给客户端。

       

  • 相关阅读:
    MYSQL 日志参数与性能的关系
    mybatis 中 foreach collection的三种用法
    SqlServer查找引用存储过程的地方_字段在哪些表中
    ubuntu中sudo不用输入密码配置
    matlab练习程序(罗德里格斯变换)
    matlab练习程序(多边形扩展算法)
    matlab练习程序(生成gif图片)
    python3 mac环境 生成pdf
    requests 爬取 台州市 履行中状态的合同附件
    个人支付方案(免签约)-支付宝当面付
  • 原文地址:https://www.cnblogs.com/wigginess/p/13423769.html
Copyright © 2011-2022 走看看