SpringMVC基础入门详解
- 环境搭建
- 经典三层
1.经典三层和mvc模式
经典三层:web表现层,(view+controller),service业务层,持久层(数据接入访问层)
MVC模式:model+view+Controller
2.springMvc是一种基于java的实现mvc设计模式的web 框架,属于spring FrameWork的后续产品.springMv从框架提供了构建web应用程序的全功能的mvc模块,是目前最流行的mvc框架
3.总体来说,就是在spring的基础上加入了mvc的支持 ,springMvc=Ioc+mvc.
4.SpringMvc的处理流程,全局只需要一个servlet [DispatcherServlet]
下面来介绍一下执行流程:
1.前端接收用户请求
2.前端控制器分发 请求
3.控制器返回处理结果
4.前端控制器将处理结果交给jsp[前端页面其中一种]去渲染数据
5.将渲染后的Html页面在返回给前端控制器
6.在由前端控制器将渲染后的html页面交给用户浏览器
入门案例
环境搭建和简单业务的完成(将后端服务器的时间发送到前端页面上)
1.构建web项目
2.配置tomcat启动插件
build>
<plugins>
<!--tomcat启动插件-->
<plugin>
<artifactId>tomcat7-maven-plugin</artifactId>
<groupId>org.apache.tomcat.maven</groupId>
<version>2.2</version>
<configuration>
<path>/</path>
<port>80</port>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
配置端口号为80 以及地址栏编码 UTF-8 方便之后操作.
3.导入依赖
<dependencies>
<!--配置servlet、jsp依赖jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!--spring的mvc核心jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
</dependencies>```
注意:servlet-api 和jsp-api 必须设置依赖范围为provided 为生产环境中使用
4.配置文件的编写
spring-mvc.xml
<!--配置spring mvc 的注解驱动 自动选择最优的处理器映射器,处理适配器-->
<!--类型转换器工厂对象需要使用 mvc注解驱动加载-->
<mvc:annotation-driven conversion-service="ConversionServiceFactoryBean"/>
<!--配置组件扫描,让spring 容器加载组件-->
<context:component-scan base-package="com.wnz"/>
```xml
在这里插入代码片
5.集成springmvc
配置web.xml 文件 ,使用前端控制器
DispatcherServlet是springmvc处理http请求的入口
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--配置SpringMVC的核心控制器-->
<servlet>
<servlet-name>DispacherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置初始化的配置文件springmvc.xml路径地址-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<!--表示容器在应用启动时就加载并初始化这个servlet,如果是负数或没有,随意时机加载servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--设置Servlet拦截的请求路径-->
<servlet-mapping>
<servlet-name>DispacherServlet</servlet-name>
<!--
当前servlet拦截的请求路径
含义:拦截所有以.do结尾的请求url地址
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
6.编写处理器Controller
package com.wnz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;
/**
* 全部注入到spring中
*/
@Controller
@RequestMapping("/hello")
public class HelloController {
/**
* 配置虚拟路径
* 处理器里有多个使用 @RequestMapping 注解的方法
* 每个方法映射为一个HTTP 接口
* modelAndView 是spring提供的数据视图对象
* 用于指定视图(html/jsp)以及所需的数据
* @return
*/
//@RequestMapping("/sayHello")
@GetMapping("/sayHello")
//@PostMapping("/sayHello")
public ModelAndView sayHello(ModelAndView modelAndView) {
//设置数据模型
modelAndView.addObject("nowDate",new Date());
modelAndView.addObject("msg", "hello springMvc");
modelAndView.setViewName("message");
return modelAndView;
}
}
7.编写视图页面
src/main/webapp/pages目录下创建message.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>服务器时间:${nowDate}</p>
<p>消息:${msg}</p>
</body>
</html>
编辑index.jsp页面
测试的请求地址写在页面中
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>welcome to test springmvc</title>
</head>
<body>
<fieldset>
<h2>入门案例测试</h2>
<a href="/hello/sayHello.do">message get测试</a>
<p>请求方式Post</p>
<form method="post" action="/hello/sayHello.do">
<input type="submit" value="测试post">
</form>
</fieldset>
8.测试
快速启动
访问:http://localhost
左下角 显示实际访问地址 ,测试页面 自己写的 也就是后端 实际做的操作
入门案例工作流程:
处理请求
springMvc 架构
架构流程:
1.发送请求到DispatchServlet
2.DispatcherServlet 请求HandlerMapping [注解或者xml配置]
3.处理映射器HandlerMapping 向前端控制器返回Handler,HandlerMapping把请求映射为HandlerExcutionChain对象
(包含 一个Handler 对象,多个handlerInterceptor拦截器对象)
4.DispatcherServlet 调用HandlerAdapter去执行handler
5.HandlerAdapter 将根据设配的结果执行Handler
6. :Handler执行完成后,会给适配器返回ModelAndView
7:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
8.前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp),通过这种策略很容易更换其他视图技术。
9.视图解析器向前端控制器返回View
10. 前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)
11. 前端控制器向用户响应结果
Spring 组件 (一个核心、三个组件)
一个核心:DispatcherServlet(前端控制器)
三个组件:HandlerMapping 处理器映射器
handlerAdapter 处理器适配器[找到更好的执行的Handler的适配器],ViewResolver视图解析器
- DispatcherServlet:前端控制器 (SpringMVC框架提供)
作用:接收用户请求,响应结果,相当于中央处理器,DispatcherServlet是整个流程控制的中心,由它调用其它组件完成用户请求的处理。DispatcherServlet的存在降低了组件之间的耦合性。 - HandlerMapping:处理器映射器 (SpringMVC框架提供)
作用:根据请求的url查找Handler。
理解为一个Map<url,Handler>,HandlerMapping负责根据用户请求的Url找到Handler即处理器,SpringMVC提供了不同的映射器来实现不同的映射方式,例如:实现接口方式,注解方式等。 - HandlerAdapter:处理器适配器 (SpringMVC框架提供)
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler。 - Handler:处理器 (需要程序员开发)
在SpringMVC当中有两层意思:Controller或者Controller当中的方法,Handler相对于前端控制器DispatcherServlet来说是后端控制器(子控制器),执行具体业务处理的,它在DispatcherServlet的控制下处理用户的具体请求。 - ViewResolver:视图解析器 (SpringMVC框架提供, 需要配置)
作用:进行视图解析,根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象。 - View:视图 (需要程序员开发jsp)
SpringMVC框架提供了很多的View视图类型的支持,包括:jsp、velocity、freemarker、Thymeleaf…等。- jsp 功能强大,但繁琐,互联网行业使用越来越少
- freemarker 功能强大,语法简单,使用很广泛,当前主流
- Thymeleaf spring官方推荐
注意1:开发的组件仅有handler(Controller层代码)和view(Jsp页面)
注意2:对初学者而言,完全理解SpringMvc的所有组件有些困难,这需要在后续的使用中慢慢体会,我们可以先只关注handler(Controller层代码)和view(Jsp页面)这两部分是如何协作的。
3.2 视图解析器配置
Controller每次都要返回视图(jsp)页面地真实路径,非常繁琐,我们还可以对视图解析器进行一些配置,来简化操作。在spring-mvc配置文件中新增如下配置
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--路径名称前缀-->
<property name="prefix" value="/pages/"/>
<!--路径名称后缀-->
<property name="suffix" value=".jsp"/>
</bean>```
```java
配置mvc:annotation-driven
<!--
配置Spring MVC的注解驱动
作用:自动选择最优的处理器映射器,处理器适配器
-->
<mvc:annotation-driven/>
动为我们注册多个SpringMVC框架提供的Bean
我们主要说明里面的两个RequestMappingHandlerMapping和RequestMappingHandlerAdapter。
第一个是HandlerMapping的实现类,它会处理@RequestMapping 注解,并将其注册到请求映射表中。
第二个是HandlerAdapter的实现类,它是处理请求的适配器,就是确定调用哪个类的哪个方法,并且构造方法参数,返回值。
为什么入门案例中没配置mvc:annotation-driven/ 仍然可以正常使用呢?
即使没有配置mvc:annotation-driven/,springmvc容器启动时会加载默认的RequestMappingHandlerMapping和RequestMappingHandlerAdapter,所以不会影响简单地使用。对于后续要学习的复杂请求,就必须要配置这个标签了。