SpringMVC
-
MVC:
Model:模型、View:视图、Control:控制器
-
SpringMVC 是Spring框架的一部分,是基于Java实现MVC的轻量级Web框架
-
特点:
- 基于请求响应的高效MVC框架
- 约定优于配置
- 轻量、简洁、灵活、功能强大
中心控制器
Spring的web框架围绕DispatcherServlet
前置控制器(请求分发器)设计,是整个SpringMVC的控制中心,DispatcherServlet
的作用是将请求分发到不同的处理器
用户请求:
url:http://localhost:8080/SpringMVC/hello
http://localhost:8080
:服务器域名
SpringMVC
:部署于服务器上的WEB站点名称
hello
:注册于WEB站点上的控制器
基础流程
- 用户发起请求,被
DispatcherServlet
接收 DispatcherServlet
根据请求调用对应的HandlerMapper:
处理器映射器,HandlerMapper
处理器映射器根据请求url查找Handler
处理器,HandlerExecution
表示为具体的Handler,主要用于url查找控制器HandlerExution
将查找到的Handler
解析后的信息传递给DispatcherServlet
DispatcherServlet
调用HandlerAdapter
:处理器适配器,按照特定的规则执行HandlerHandler
让具体的Controller
执行,Controller
通过Service
层Business Logic
业务逻辑操作Repository
:对象仓库实现Data Access
:数据存取,完成对数据库的持久化操作Controller
将具体的执行信息返回给HandlerAdapter
,一般为ModelAndView
:模型与视图HandlerAdapter
处理器适配器将获取的ModelAndView
(包含视图逻辑名或模型)传递给DispatcherAdapter
:前端控制器DispatcherAdapter
调用ViewResolver
:视图解析器解析HandlerAdapter
传递的逻辑视图名ViewResolver
:视图解析器将解析得的逻辑视图名返回给DispatcherServlet
DispatcherServlet
根据视图解析器解析的结果调用具体的视图
原理开发
-
在父项目中新建模块,右键添加框架支持,添加WEB应用支持,创建一个基础web应用
-
在web.xml中注册servlet:
DispatcherServlet
,自定义servlet-name
,在<servlet-mapping>
中配置/
表示匹配所有的请求,不匹配jsp
;若配置为/*
会匹配所有的请求包括JSP页面请求,可能无法响应JSP页面请求<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
DispatcherServlet
作为Spring-MVC的中心,在servlet的定义中必须绑定SpringMVC的配置文件;在配置中即设置参数contextConfigLocation
,value值为我们创建的SpringMVC配置文件,该文件可以import
方式合并到Spring配置文件中去<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name></param-name> <param-value>classpath:SpringMVC-servlet.xml</param-value> </init-param> <!--启动级别--> <load-on-startup>1</load-on-startup> </servlet>
当Web应用启动时可能就会发送一些请求,故需配置
DispatcherServlet
的启动级别为1,使得服务器启动的同时启动该Servlet -
编写创建的SpringMVC配置文件中,添加官方的Spring头文件命名空间及约束
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
在配置文件中添加SpringMVC核心三要素
添加处理器映射器
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
添加处理器适配器
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
添加视图解析器:视图解析器可定义其他的模板引擎,在此处使用的SpringMVC官方提供的视图解析器的配置中,定义url的前缀与后缀,用于拼接全路径
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean>
-
定义Controller,在实现原始Controller接口的Controller控制器中,固定实现一个方法,其中包含业务代码与视图跳转,返回一个
ModelAndView
public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { ModelAndView mav = new ModelAndView(); //业务代码 //假定业务返回 String result = "Hello SpringMVC"; mav.addObject("msg",result); //设置视图跳转 mav.setViewName("hello"); return mav; } }
ModelAndView
常用方法:mv.addObject("msg",result);
添加一个业务消息msg值为result,且该值可以为空,result常为业务代码的返回值mv.setViewName("name");
设置视图名参数,与视图解析器前缀后缀拼接为跳转请求 -
在SpringMVC配置文件中配置Controller控制器对应的请求映射,当
DispatcherServlet
调用选择的处理器适配器BeanNameUrlHandlerMapping
时,处理器适配器根据配置的bean名称找到对应的Controller执行<bean id="/hello" class="com.flagling.controller.HelloController"/>
注解开发
-
项目配置
创建一个空白Maven模块,在pom.xml中配置maven资源过滤
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
模块右键添加web应用模块支持;点击项目结构
Project Structure
在Artifacts中选择当前模块在WEB-INF下新建lib文件夹,添加所有的library文件
-
在web.xml文件中注册
DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--1.注册servlet--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--通过初始化参数指定SpringMVC配置文件的位置,进行关联--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMVC-servlet.xml</param-value> </init-param> <!-- 启动顺序,数字越小,启动越早 --> <load-on-startup>1</load-on-startup> </servlet> <!--所有请求都会被springmvc拦截 --> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
-
编写注册的
DispatcherServlet
关联的SpringMVC配置文件SpringMVC-servlet.xml
,进行SpringMVC的注解配置-
配置controller注解扫描包,使得该包下的controller中的注解生效,由IOC容器管理
<context:component-scan base-package="com.flagling.controller"/>
-
配置SpringMVC不处理静态页面资源
<mvc:default-servlet-handler />
-
配置SpringMVC的注解支持
<mvc:annotation-driven />
-
配置视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 后缀 --> <property name="suffix" value=".jsp" /> </bean>
-
最终配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 --> <context:component-scan base-package="com.flagling.controller"/> <!-- 让Spring MVC不处理静态资源 --> <mvc:default-servlet-handler /> <!-- 支持mvc注解驱动 在spring中一般采用@RequestMapping注解来完成映射关系 要想使@RequestMapping注解生效 必须向上下文中注册DefaultAnnotationHandlerMapping 和一个AnnotationMethodHandlerAdapter实例 这两个实例分别在类级别和方法级别处理。 而annotation-driven配置帮助我们自动完成上述两个实例的注入。 --> <mvc:annotation-driven /> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 后缀 --> <property name="suffix" value=".jsp" /> </bean> </beans>
-
-
在配置的注解支持的Controller包下编写一个Controller类,添加
@Controller
注解后,自动装配到IOC容器@Controller//将当前类标记为Controller类 @RequestMapping("/helloController") /* @RequestMapping请求映射注解可以标记控制器的类与类中方法,设置前端请求地址,标记在控制器上时,请求控制器中的方法时地址前必须先加上控制器的地址 */ public class HelloController { @RequestMapping("/hello")//标记当前方法的请求地址,Handler处理器运行凭此让具体的controller方法运行 public String hello(Model model1){ //封装数据到model model1.addAttribute("msg","Hello Annotation"); //返回跳转视图名,视图控制器由此拼接获得全限定地址返回给前端控制器调用 return "hello"; } }
-
创建视图层,视图层名称与controller中方法返回的参数需一致才可以调用成功,视图中设置参数数据在model封装的数据中取得
Controller解析
- 控制器负责定义访问应用程序的行为
- 负责解析用户的请求并将其转换为一个模型
- SpringMVC中一个控制器可以包含多个方法
开发步骤
-
- 创建Maven项目模块
- 添加web应用框架支持,
- 项目结构WEB-INF下新建lib目录用于Jar包打包
-
- web.xml注册
DispatcherServlet
- 设置关联SpringMVC配置文件
ContextConfigLocation
- 设置启动级别
<load-on-startup>
为1, - 设置
ServletMapping
接收所有前端请求
- web.xml注册
-
-
配置
DispatcherServlet
关联的SpringMVC配置文件 -
配置
Controller
包组件扫描context:component-scan
-
配置静态资源过滤
<mvc:default-servlet-handler/>
-
配置MVC注解驱动支持
<mvc:annotation-driven/>
-
配置视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 后缀 --> <property name="suffix" value=".jsp" /> </bean>
-
-
- 创建视图解析器中注册的静态页面目录
- 编写静态页面
-
- 在Controller包下创建Controller类
- 注解开发控制前端请求与静态页面的逻辑
Controller实现
-
实现Controller接口:
-
实现Controller接口后则该类为一个控制器
-
实现接口的方法默认实现一个方法返回一个ModelAndView
-
方法的实现中包含业务处理,封装页面数据到ModelAndView,封装视图跳转参数名
-
在Spring配置文件注册Controller的bean,name为前端请求参数路径;只有注册后
HandlerAdapter
处理器适配器在执行Handler
时才能获取对应的Controller
执行<bean name="/c1" class="com.flagling.controller.Controller1"/>
-
特点:
- 不需要在Spring配置文件中配置注解驱动、组件扫描包使注解生效
- 方式较老,一个
Controller
类中只能实现一个方法,定义的方式比较麻烦 - 每一个
Controller
方法实现均需在Spring配置文件中注册,无法自动装配
-
-
注解
@Controller
@Controller
注解类型用于声明Spring类的实例是一个控制器,标记与注解开发的Controller
类上,常与@RequestMapping
请求地址映射注解搭配使用- Spring可使用扫描机制使得指定的包中注解生效,故需在Spring配置中配置
Controller
包的组件扫描与注解驱动支持 @Controller
注解的类会自动添加到Spring上下文context
中,由IOC容器管理- 在Controller包下创建类,用
@Controller
注解声明当前类为一个控制器 - 在类中可配置多个方法,每个方法可用
@RequestMapping
注解标记方法请求映射地址,当请求映射地址与前端请求对应则调用方法;若方法返回值为String,且有对应返回值名称的具体页面时,就会被视图解析器解析‘ - 在方法中常用Model对象封装跳转页面数据
RequestMapping
@RequestMapping
注解用于映射url到控制器类或一个特定的处理程序方法,即控制器类中的方法- 在
Controller
类中同时标记类与方法,二者存在上下级的关系,前端地址必须加上类的请求地址才能请求到对应控制器方法
RestFul风格
-
Restful是一个定义资源定位及资源操作的风格,基于该风格设计的软件可以更简洁、更有层次、更易于实现缓存机制
-
使用Resful操作资源,一个请求url地址可通过不同的请求方式实现不同的效果
-
后端:
在
Controller
类的方法上可通过@RequestMapping
设置请求地址与请求方式 ,@PathVariable
注解匹配前端请求参数@RequestMapping(value = "hello/{a}/{b}",method = RequestMethod.GET) public String Add(@PathVariable Integer a, @PathVariable String b, Model model){ String res = a+b; model.addAttribute("msg",res); return "hello"; }
也可通过
@RequestMapping
的变体,各个请求方式的Mapping来设置请求地址,默认为注解对应的请求方式@GetMapping("M1")//get请求方式注解 @PostMapping("M1")//Post请求方式注解 @DeleteMapping("M1")//Delete请求方式注解 @PutMapping("M1")//Put请求方式注解
标记不同请求方式的方法,设置的地址映射一致;依靠前端请求该地址的请求方式决定调用具体的
Controller
方法,达到地址复用的效果
= a+b;
model.addAttribute(“msg”,res);
return “hello”;
}也可通过`@RequestMapping`的变体,各个请求方式的Mapping来设置请求地址,默认为注解对应的请求方式 ```java @GetMapping("M1")//get请求方式注解 @PostMapping("M1")//Post请求方式注解 @DeleteMapping("M1")//Delete请求方式注解 @PutMapping("M1")//Put请求方式注解
标记不同请求方式的方法,设置的地址映射一致;依靠前端请求该地址的请求方式决定调用具体的
Controller
方法,达到地址复用的效果
-