SpringMVC架构
Spring web mvc介绍
Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来:
Web MVC
mvc设计模式在b/s系统下的应用
流程:
1、用户发起request请求至控制器(Controller)
控制器接收用户请求的数据,委托给模型进行处理
2、控制器通过模型(Model)处理数据并得到处理结果
模型通常是指业务逻辑
3、模型处理结果返回给控制器
4、控制器将模型数据在试图中展示
web中模型无法将数据直接在视图上显示,需要通过控制器完成。但如果是在c/s应用中模型是可以将数据在试图中展示的
5、控制器将视图response响应给用户
通过视图展示给用户要的数据或处理结果
Spring web mvc 架构
架构图
架构流程
1、用户发送请求至前端控制器DispatcherServlet
2、前端控制器DispatcherServlet收到请求调用HandlerMapping处理映射器
3、处理映射器(HandlerMapping)根据请求url找到具体的处理器(Handler),生成处理器对象及处理器拦截器(如果有则生成),一并返回给前端控制器(DispatcherServlet)
4、前端控制器DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)
6、Controller执行完成后返回ModelAndView
7、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewResolver视图解析器
9、ViewResolver解析后返回具体的View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
11、DispatcherServlet响应用户
架构组件说明
以下组件通常使用框架提供实现
- DispatcherServlet:前端控制器
用户请求到达前端控制器,它既相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性 - HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式、实现接口方式、注解方式等 - Handler:处理器(后端控制器)
Handler是继DispatcherServlet前段控制器的后端控制器,在DispatcherServlet的控制下,Handler对具体的用户请求进行处理 - HanlderAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多的处理器进行执行
由于HandlerAdapter涉及到具体的用户业务请求,因此一般情况下需要程序员根据业务需求开发Handler - ViewResolver:试图解析器
ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染,将处理结果通过页面展示给用户。SpringMVC框架爱提供了很多的View视图,包括jstlView、freemarkerView、pdfView等
一般情况下,需要通过页面标签或页面模板技术奖模型数据通过页面展示给用户,需要有程序员根据业务需求开发具体的页面
入门程序
1、导包
- spring-aop-4.0.0.RELEASE.jar
- spring-beans-4.0.0.RELEASE.jar
- spring-context-4.0.0.RELEASE.jar
- spring-core-4.0.0.RELEASE.jar
- spring-expression-4.0.0.RELEASE.jar commons-logging-1.1.3.jar
- spring-web-4.0.0.RELEASE.jar
- spring-webmvc-4.0.0.RELEASE.jar
2、配置DispatcherServlet
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>SpringMVC_01</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<!--配置Spring核心控制器:前端控制器
springmvc思想是一个前端控制器,能拦截所有请求,并智能派发-->
<servlet-name>SpringMvcDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置DispatcherServlet的初始化参数:设置文件的路径以及文件名称 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- servlet启动加载:servlet原先是第一次访问才创建对象
load-on-startup:服务器启动的时候就创建对象,值越小优先级别越高,越先创建对象
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMvcDispatcherServlet</servlet-name>
<!-- /和/*都是拦截所有请求
/:拦截所有请求,但是不会拦截.jsp请求,保证jsp访问正常
/*:范围更大,还会拦截.jsp请求,一旦拦截jsp页面就不能显示
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
解释配置文件的名称定义规则:
实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的.
默认的配置文件为: /WEB-INF/<servlet-name>-servlet.xml
3、加入SpringMVC的配置文件
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
<!-- 设置扫描组件的包: -->
<context:component-scan base-package="com.atguigu"></context:component-scan>
<!-- 配置映射解析器:如何将控制器返回的结果字符串,转换为一个物理的视图文件-->
<bean id="internalResourceViewReslove"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/page/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4、创建一个入口页面
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="hello">helloworld</a>
</body>
</html>
5、编写处理请求的处理器,并标识为处理器
FirstController.java
package com.atguigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class FirstController {
/**
*映射请求的名称:用于客户端请求;类似 Struts2 中 action 映射配置的 action 名称
*1. 使用 @RequestMapping 注解来映射请求的 URL
*2. 返回值会通过视图解析器解析为实际的物理视图, 对于 InternalResourceViewResolver 视图解析器,
*会做如下的解析:
通过 prefix + returnVal + suffix 这样的方式得到实际的物理视图, 然后做转发操作.
/WEB-INF/page/success.jsp
*/
//代表当前项目下开始,处理当前项目下的hello请求
@RequestMapping("/hello")
public String firstController() {
System.out.println("收到请求,正在处理。");
return "success";
}
}
6、编写视图
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>成功</h1>
</body>
</html>
helloworld深入解析:
1、helloworld请求流程图解:
1)、客户端点击链接会发送Http://localhost:8080/springmvc/hello
2)、来到tomcat
3)、SpringMVC的前端控制器收到所有请求
4)、来看请求地址和@RequsetMapping标注的哪个匹配,来找到使用哪个类的哪个方法
5)、前端控制器找到了目标处理器类和目标方法,直接利用返回执行目标方法
6)、方法执行完成以后会有一个返回值;SpringMVC认为这个返回值就是要去的页面地址
7)、拿到方法返回值后,用视图解析器进行拼串得到完成的页面地址
8)、拿到页面地址,前端控制器转发到页面
2、一般请求的映射路径名称和处理请求的方法名称最好一致(实质上方法名称任意)
3、错误演示
配置上错误,经常会把“/WEB-INF/views/”配置成了 “/WEB-INF/views”
4、处理请求方式有几种
public enum RequestMethod {
**GET**, HEAD, **POST**, PUT, PATCH, DELETE, OPTIONS, TRACE
}
5、@RequestMapping
用来告诉SpringMVC,方法用来处理什么请求
/是可以省略不写,默认从当前项目下开始,但是一般都加上
例如:@RequestMapping(“hello”)
6、如果不指定配置文件位置
实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的.
默认的配置文件为: /WEB-INF/-servlet.xml
7、url-pattern
/和/*都是拦截所有请求
/:拦截所有请求,但是不会拦截.jsp请求,保证jsp访问正常
/*:范围更大,还会拦截.jsp请求,一旦拦截jsp页面就不能显示
处理.jsp是tomcat做的事,所有项目的web.xml都是继承于tomcat的大web.xml
DefaultServlet是Tomcat中处理静态资源的
除了.jsp和servlet外剩下的都是静态资源
例如:index.html:静态资源,tomcat就会在服务器下找到这个资源并返回
当我们将url-pattern=/:就相当于我们前端控制器的/禁用了tomcat中的DefaultServlet(静态资源)
1)服务器(tomcat)的web.xml(大)中有一个DefaultServlet 的 url-pattern=/
2)我们自己配置的前端控制器的url-pattern=/
静态资源就会来到DispatcherServlet看哪个方法的RequestMapping是这个(index.html)
最终是找不到RequestMapping("index.html")相对应的方法
3)为什么jsp可以访问?
这是因为我们配置的url-pattern=/,而tomcat的web.xml文件中的JspServlet配置的url-pattern=.jsp。并没有覆盖服务器重的JspServlet的配置
4)/*就是拦截所有的请求;一般情况下都是写/,同时是为了迎合Rest风格的URL地址
web.xml
<servlet-mapping>
<servlet-name>SpringMvcDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>