目录
1. 什么是springMVC?
2. 请求流程
3、开发步骤:
4、SpringMVC组件
5、SpringMVC注解解析
6、方法返回值
7、跳转方式
8、静态资源访问设置
1. 什么是springMVC?
Spring Web MVC是一种基于Java的实现了MVC设计模式的、请求驱动类型的、轻量级Web框架,已经融合在 Spring Web Flow 中。
相比于MVC,M就是模型model,主要用于数据封装和业务逻辑处理,而V是view,叫视图,主要用于数据的展示,而C就是controller,控制器,主要用于分发和指派的一个工作。 )
2. 请求流程
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找 Handler可以根据xml配置、注解进行查找,生成处理对象及处理器拦截器(如果有则生成)一并返回前端控制器
第三步:处理器映射器HandlerMapping向前端控制器返回Handler(抽象)
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器根据Handler规则执行不同类型的Handler(处理器(Controller),后端控制器)
第六步:Handler执行完成给适配器返回ModelAndView(模型视图)
ModelAndView是springmvc框架的一个底层对象
Model:即将被渲染的数据 包含了要在页面中展示的数据
View:跳转的页面(只包含页面名称:逻辑视图名) 例:index
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析(DispatcherServlet将ModelAndView传递给ViewResolver)
根据逻辑视图名解析成真正的视图(jsp)
在视图解析器中(拼接出完整的请求地址 例:jsp/book/index.jsp)
第九步:视图解析器向前端控制器返回具体View
第十步:前端控制器根据View进行视图渲染(即将模型数据填充至视图中)
视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
3、开发步骤:
第一步:导入SpringMVC相关依赖
第二步:配置SpringMVC核心文件 spring-mvc.xml
第三步:配置SpringMVC核心控制器DispathcerServlet
第四步:创建Controller类和视图页面
第五步:使用注解配置Controller类中业务方法的映射地址
第六步:客户端发起请求测试
具体如下:
1、导入SpringMVC相关坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- ********************** JSTL依赖 ********************** -->
<!-- 缺少下面的这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config-->
<!-- 原因:org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
2、配置SpringMVC核心文件 spring-mvc.xml
创建此配置文件 存放目录 webapp/WEB-INF/spring-mvc.xml
在配置扫描时,只需要扫描Controller层,不需要扫描其他
<!--1、开启扫描-->
<context:component-scan base-package="com.zking.ssm" use-default-filters="false">
<!--只扫描Controller层,其他层都扫描-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!--2、注册处理器映射器(HandlerMapping)和处理器适配器(HandlerAdapter)-->
<!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,-->
<!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)-->
<mvc:annotation-driven/>
<!--3、配置视图解析器(ViewRsolver)-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
<!--ModelView:View部分 只包含了页面名称(逻辑视图名) 例如:index.jsp -》index
ViewResolver:进行视图解析 前缀(prefix)+视图名+后缀(suffix)
例:index.jsp -》index
/WEB-INF/jsp/index.jsp
-->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--4、配置静态资源访问,例如js/cs/images等等-->
<!--4) 单独处理图片、样式、js等资源 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/images/" mapping="/img/**"/>
<mvc:resources location="/WEB-INF/images/" mapping="/images/**"/>
3、配置SpringMVC核心控制器DispathcerServlet
<!--3、配置SpringMVC的核心控制器(DispatcherServler),类似于自定义MVC中的DispatcherAction-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--需要手动去维护-->
<!--在初始化SpringMVC的核心控制器并将spring-mvc.xml一起初始化-->
<param-value>/WEB-INF/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--web.xml 3.0的新特性,是否支持异步-->
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 拦截所有带有/的路径请求
/index.jsp
公共资源:js/css/images 无需要拦截 在spring-mvc的第四步设置静态资源访问
/js/index.js
/css/index.css
/images/1.png
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
注:<load-on-startup>代表服务器启动时就去加载这个Servlet去创建对象,不配的话就默认第一次访问时再创建对象,配置映射地址的/就代表缺省,就是每次在访问时,任何请求都要走这个Servlet。
再配置Spring中自带的中文乱码过滤器
<!--2、配置中文乱码过滤器,spring自带的-->
<!-- 中文乱码处理 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、创建Controller和业务方法
package com.zking.ssm.book.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
public class IndexController {
public String toIndex(){
return "";/
}
}
创建页面,存放目录
5、注解配置Controller类中业务方法的映射地址
package com.zking.ssm.book.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
@RequestMapping("/")
public String toIndex(){
//视图解析器=前缀+逻辑视图名+后缀
//前缀 /WEB-INF/jsp
//逻辑视图名 index
//后缀 .jsp
return "index";//逻辑视图名
}
}
注:在请求时,请求的地址跟我们的方法之间有一个映射关系,这个映射关系,我们用@RequestMapping注解去替代。那么就是访问/时,就会帮你映射到toIndex方法,然后执行对应的逻辑,最终返回一个index,然后在视图解析器中进行拼接。
6、测试
4、SpringMVC组件
1、前端控制器DispatcherServlet(不需要程序员开发)
作用接收请求,响应结果,相当于转发器,中央处理器,不做具体的核心业务处理。
有了DispatcherServlet减少了其它组件之间的耦合度。
2、处理器映射器HandlerMapping(不需要程序员开发)
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
作用:根据请求的url(配置或者注解)查找到最终要执行的Handler
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
ModelAndView:包含了模型数据(即将没展示的数据)和视图页面(即将跳转的具体页面,逻辑视图名)
4、处理器或者页面控制器(Handler|Controller)(需要程序员开发)
它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
5、视图解析器View resolver(不需要程序员开发)
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
6、视图View(需要程序员开发jsp)
SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)
8、验证器(Validator)
9、命令对象(Command 请求参数绑定到的对象就叫命令对象)
10、表单对象(Form Object提供给表单展示和提交到的对象就叫表单对象)
5、SpringMVC注解解析
1、@RequestMapping:
请求到处理器功能方法的映射规则(只要被标记的方法叫做请求处理方法)
作用范围:类和方法上
含义:
类:起到窄化路径的作用
方法:表示该方法为请求处理方法
类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录
方法上,请求 URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径
例如:
访问路径:
访问路径:
属性:
value:作用在类上,叫做窄化路径 ,在方法上,叫做请求路径;
注意:如果value单独使用,那么value可以省略,如果与其他属性一起使用,则必须指定value属性
method:请求方式 GET或者POST
支持POST和GET请求方式
注:method是枚举类型的,如果只支持POST方式,你要访问这个toIndex,请求方式必须是PSOT方式。如果默认是GET方式,来访问这个资源的话就会报405的错误,Method Not Allowed,方法不被允许
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
注:params是用于限定请求参数条件的,就是你请求我时,必须给我什么格式的参数,都能进行相应的限制
例:
params = {“accountName”},表示请求参数必须有accountName
params = {“money!=100”},表示请求参数中money不能是100
2、 参数传递
1)String和八大基础类型直接在方法上加参数,访问时路径上的参数名要与方法的参数名相同
访问路径:
2) 传递对象类型的参数 在路径上写对象中的属性名及对应的属性值
访问路径:
3)传递 HttpServletRequest HttpServletResponse HttpSession
4)传递集合类型的参数
请使用@RequestParam接受map类型的参数
使用@RequestBody传递list或者Map类型的的参数,但是参数的格式必须是json
同时还需要导入json的依赖
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
6、方法返回值
1)String:逻辑视图名
直接返回逻辑视图名(页面名称 index)
2) ModelAndView
在方法中创建此对象
1、设计逻辑视图名
modelAndView.setViewName("book/addBook");
2、设置参数(与前端交互的数据)
modelAndView.addObject("bookName",bookName);
3) String+ModelAndView
在参数中加入Model接口
在方法中设置参数
model.addAttribute("bookName",bookName);
以上三种方式都需要跳转到视图解析器中进行视图解析操作:
4) json
7、跳转方式
1) forward:转发 "forward:path"
2) redirect:重定向 "redirect:path"
注意
1)这两种跳转方式将会绕开视图解析器的前后缀
2)还有就是如果是在同一个Controller中则不使用"/"从根目录开始,而是如果是在不同的Controller则一定要从根目录开始
3)转发和重定向的路径是请求方法名,不是逻辑视图名
3.1)如果在本Controller跳转,不需要使用"/"开头
3.2)如果在不同的Controller里面跳转,则需要使用"/"开头,假如有窄化路径必须加上窄化路径+请求路径
例如:redirect/forward:/order/addOrder
8、静态资源访问设置
在配置DispatcherServler的时候,设置了拦截所有"/"的请求,所以需要设置资源访问
设置的mapping的属性值可以不唯一
代码地址 提取码:umw5
至此,SpringMVC 简介介绍完毕,由于作者水平有限难免有疏漏,欢迎留言纠错。
更多推荐
SpringMVC---- SpringMVC 简介
发布评论