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文件,将其返回给客户端。

   

原文地址:https://www.cnblogs.com/wigginess/p/13423769.html