欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

快速了解SpringMVC的概念及如何使用

程序员文章站 2022-04-15 17:51:13
1. 什么是MVC模式MVC :是一种用于设计创建web应用表现层的模式。使用它可以将业务逻辑,数据,页面显示代码分离出来。Model(模式):数据模型,代表一个存取数据的对象View(视图):用于展示数据(html,jsp)Controller(控制器):用于程序业务逻辑处理1、封装请求:model2、调用service3、响应跳转视图2. MVC模式和三层架构的关系MVC把三层架构中的表现层再度进行了分化,分成了控制器、视图、模型。三层架构的目的是解耦,MVC的目的是实现w...

1. 什么是MVC模式

MVC :是一种用于设计创建web应用表现层的模式。使用它可以将业务逻辑,数据,页面显示代码分离出来。
Model(模式):数据模型,代表一个存取数据的对象

View(视图):用于展示数据(html,jsp)

Controller(控制器):用于程序业务逻辑处理
	1、封装请求:model
	2、调用service
	3、响应跳转视图

2. MVC模式和三层架构的关系

MVC把三层架构中的表现层再度进行了分化,分成了控制器、视图、模型。
三层架构的目的是解耦,MVC的目的是实现web系统的职责划分。

3. 什么是SpringMVC

SpringMVC是一个实现了MVC设计模式的轻量级框架,把三层架构的web层再度进行了分化,分成了模型、视图、控制器,实现了web层的职责划分,它可以通过一套注解,让一个简单的Java类成为控制器,而无须实现任何接口。

SpringMVC的功能就是封装了原来Servlet中的共有功能,例如请求参数解析处理、请求结果封装返回等。

4. SpringMVC的使用步骤

(1)创建web工程并引入坐标
(2)web.xml中配置前端控制器

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">

	<!--
		配置前端控制器
			DispatcherServlet
	-->
	<servlet>
		<servlet-name>mvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!--自动加载Springmvc的配置文件-->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
	</servlet>


	<servlet-mapping>
		<servlet-name>mvc</servlet-name>
		<!--
			处理所有请求
			不处理.jsp为后缀的请求
		-->
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

(3)springmvc主配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/aop
        https://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!--1、包扫描-->
    <context:component-scan base-package="包名"></context:component-scan>

    <!--2、配置SpringMVC的注解驱动
    	对三大组件中处理器映射器和处理器适配器进行功能加强-->
    <mvc:annotation-driven></mvc:annotation-driven>

	<!--视图解析器--> 
	<!--
		当我们需要返回一个视图的时候,只需写视图的名称。 
		视图解析器会自动在该名称上拼接前后缀。 
		比如:视图名为success 拼接后的为:/WEB-INF/pages/success.jsp
	--> 
	<bean id="internalResourceViewResolver"
	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			<property name="prefix" value="/WEB-INF/pages/"/> 
			<property name="suffix" value=".jsp"/>
	</bean>
</beans>

(4)请求页面发起请求

<a href="${pageContext.request.contextPath}/mvc/rm">入门--get请求方式</a>

(5)开发控制器接收请求

/**
 * 控制器:需要交给容器管理
 *    方法:接受请求,调用service,完成响应和页面跳转
 */
@Controller 
@RequestMapping("/mvc") 
public class MVCController { 
     /**
     * 控制器方法:
     *     接受请求,调用service,完成响应和页面跳转
     *     1、返回值String (跳转的页面路径)
     *     2、需要在方法上通过注解@RequestMapping配置进入此方法的url
     *
     */
	@RequestMapping("/rm") 
	public String rm(){ 
		return "success"; // /WEB-INF/pages/   +控制器返回值+   .jsp
	} 
}

(6)提供success响应页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
<head> 
	<title>success</title>
</head> 
<body> 
	请求成功!
</body> 
</html>

5. SpringMVC的四大组件

(1)前端控制器:DispatcherServlet
SpringMVC的核心组件(DispathcherServlet),协调所有组件的运行

(2)处理器映射器:HandlerMapping
根据URL请求去寻找对应的处理方法( Controller中的方法 )

(3)处理器适配器:HandlerAdapter
真正的去调用处理方法( 执行Controller中的方法 )

(4)视图解析器:ViewReslover
将逻辑视图翻译成物理视图
物理视图:jsp页面的完整路径

6. SpringMVC执行流程

  1. 用户通过浏览器发送请求至前端控制器(DispatcherServlet)

  2. 前端控制器(DispatcherServlet)收到请求调用处理器映射器(HandlerMapping)

  3. 处理器映射器(HandlerMapping)找到具体的处理器链返回给前端控制器(DispatcherServlet)

  4. 前端控制器(DispatcherServlet)会根据返回的处理器链调用处理器适配器(HandlerAdapter)

  5. 处理器适配器(HandlerAdapter)经过适配调用具体的控制器(Controller)

  6. 控制器(Controller)执行完成返回一个执行结果

  7. 处理器适配器(HandlerAdapter)将控制器(Controller)的结果ModelAndView对象返回给前端控制器(DispatcherServlet)

  8. 前端控制器(DispatcherServlet)将ModelAndView对象传给视图解析器(ViewReslover)

  9. 视图解析器(ViewReslover)解析后得到具体View,并返回给前端控制器(DispatcherServlet)

  10. 前端控制器(DispatcherServlet)根据View进行视图渲染(即将模型数据填充至视图中)

  11. 前端控制器(DispatcherServlet)会将渲染后的视图响应给浏览器

7. @RequestMapping注解的理解

@RequestMapping 注解用来进行URL和方法的绑定。常用的选项有
value或者path:用来指定URL,默认选项
method:用来限定请求的方式
params:用来限定请求参数
上面的选项可以单独使用,也可以组合使用,组合使用时,必须同时满足才行。
此注解可以标注在方法上,也可以标注在类上,标注在类上代表类中的所有方法都可以共用一段URL。

8. 如何接收请求参数

接收基本类型参数:只需要保证前端传递的参数名称跟方法的形参名称一致就好。

接收对象类型参数:只需要保证前端传递的参数名称跟pojo的属性名称一致就好。

接收数组类型参数:只需要保证前端传递的参数名称跟方法中的数组形参名称一致就好。

接收集合类型参数:将前端传入的数据自动的封装成集合,需要将集合包装到一个对象中才行。
获取集合参数时,要将集合参数包装到一个实体中才可以。
List集合页面input标签name属性:集合属性名[索引].属性
Map集合页面input标签name属性:集合属性名[‘key’].属性

接收日期类型参数:SpringMVC默认只能封装yyyy/MM/dd格式的日期类型,其余格式需要自定义日期转换器。

9. 如何接收日期类型参数(自定义类型转换器)

(1)自定义一个类型转换器,实现类型转换的方法

public class StringToDateConverter implements Converter<String, Date> {

    /**
     * 日期转化
     *   参数:source请求参数
     *          yyyy-MM-dd
     *   返回值:处理之后的日期
     */
    public Date convert(String source) {
        Date date = null;
        try {
            date = new SimpleDateFormat("yyyy-MM-dd").parse(source);
        }catch (Exception e) {
            e.printStackTrace();
        }
        return date;
    }
}

(2) 将自定义的类型转换注册到SpringMVC的转换服务中,然后再将服务注册到SpringMVC的注解驱动

 <!--将自定义的类型转化器加入Springmvc的转化器集合中-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="cn.itcast.converter.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

    <!--
        配置springmvc的注解驱动
            内置了处理器映射器和处理器适配器
    -->
    <!--注册到springmvc驱动中-->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

10. SpringMVC如何解决中文乱码问题

SpringMVC提供了一个中文乱码过滤器,我们只需要在web.xml配置SpringMVC中中文乱码过滤器即可。

<!--在web.xml中配置过滤器,设置编码即可 CharacterEncodingFilter-->
	<filter>
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

11. SpringMVC如何实现文件上传

(1)加入文件上传的依赖坐标
(2)请求页面

<%--
	上传文件三要素: 
	当前form表单必须为post 
	当前form表单类型必须为multipart/form-data 
	必须提供一个文件上传项<input type="file" name="fileParam"><br/>
--%> 
<form action="${pageContext.request.contextPath}/mvc/fileUpload" 
	  method="post" enctype="multipart/form-data">
	  上传一个文件:<input type="file" name="fileParam"><br/> 
	  再传一个文件:<input type="file" name="fileParam"><br/> 
	  <input type="submit" value="上传文件">
</form>

(3)编写控制器

通过SpringMVC提供 MultipartFile对象,表示上传的文件

//注意处理器参数必须和页面input中name属性一致 
@RequestMapping("/fileUpload") 
public String fileUpload(MultipartFile[] fileParam) throws IOException { 
	//指定上传文件的路径 
	File targetFile = new File("D:\\file"); 
	for (MultipartFile multipartFile : fileParam) { 
		//指定上传文件名 
		String filename = UUID.randomUUID()+multipartFile.getOriginalFilename(); 		 //把fileParam文件上传到targetFile文件下名字叫filename 			
		multipartFile.transferTo(new File(targetFile, filename));
	} 
	return "success";
}

12. @RequestParam注解的理解

@RequestParam标注在方法参数之前,用于对传入的参数做一些限制, 支持三个属性:
value:默认属性,用于指定前端传入的参数名称
required:用于指定此参数是否必传
defaultValue:当参数为非必传参数且前端没有传入参数时,指定一个默认值

13. 如何接收请求头

 /**
     * 在控制器中获取,当前请求的请求头
     *      1、@RequestHeader配置到方法参数上 : 前端控制器自动获取头信息
     *          @RequestHeader Map map : 获取所有的请求头
     *          @RequestHeader("cookie") String cookie : 根据key从所有头信息中获取指定头信息
     *      2、@CookieValue("key"):
     *          从cookie中根据key获取指定value数据
     *
     */
    @RequestMapping(value="/demo")
    public String demo(@RequestHeader Map map,
                         @RequestHeader("cookie") String cookie,
                         @CookieValue("JSESSIONID") String sessionId) {
        System.out.println(map);
        System.out.println(cookie);
        System.out.println(sessionId);
        return "success";
    }

14. 如何获取Servlet原生API

Servlet原生API对象:HttpServletRequest,HttpSevletResponse,HttpSession

语法规则:
1、将对象以方法参数的形式配置到Controller方法中
2、将需要的API对象通过@Autowired的方式注入进来
@Autowired方式底层使用了ThreadLocal来保证每次请求不同的控制器方法使用的都是不同的对象,避免了线程安全问题。

15. SpringMVC中的携带数据请求转发

请求页面

<a href="${pageContext.request.contextPath}/demo/forwardMvcView">请求转发经过视图解析器</a><br/> 
<a href="${pageContext.request.contextPath}/demo/forwardMvc">请求转发不经过视图解析器</a><br/> 
<a href="${pageContext.request.contextPath}/demo/forwardOld">请求转发传统的方式</a><br/>

控制器

//请求转发经过视图解析器 
@RequestMapping("/forwardMvcView") 
public String forwardMvcView(){ 
	return "success";
}

//forward:关键字后面的路径表示不再经过视图解析器 
@RequestMapping("/forwardMvc") 
public String forwardMvc(){ 
	return "forward:/WEB-INF/pages/success.jsp";
}

//请求转发传统的方式 @RequestMapping("/forwardOld") 
public void forwardOld(HttpServletRequest request, HttpServletResponse response) throws Exception { 
	request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
}

请求转发时携带数据

 *  方式一:绑定到request域
 *      1、将数据绑定到request域
 *      2、在页面上通过EL表达式获取
 *  方式二:通过Model对象
 *      * Model对象:底层是springmvc封装的request
 *      * 将Model对象配置到方法参数上
 *  方式三:通过ModelAndView的返回值
 *      * Model:数据对象(响应数据)
 *      * View:视图(逻辑视图和物理视图)
 *		ModelAndView : 模型视图对象,通过此对象可以指定返回的视图地址和数据绑定
 *		语法规则
 *		* 方法的返回值:ModelAndView
 *		* 在方法中通过ModelAndView的setViewName指定跳转的页面
 *		* 在方法中通过ModelAndView的addObject指定需要存入request域中的数据

16. SpringMVC中的重定向

请求页面

<a href="${pageContext.request.contextPath}/demo/redirectMvc">mvc方式的重定向</a><br/> 
<a href="${pageContext.request.contextPath}/demo/redirectOld">传统方式的重定向</a><br/>

编写控制器

//注意:WEB-INF下的所有页面都必须经过请求转发,而不能直接访问。 

//1、通过redirect:/重定向地址
@RequestMapping("/redirectMvc") 
public String redirectMvc(){ 
	//return "redirect:forwardMvcView"; 
	return "redirect:/demo/forwardMvcView";
}

//2、使用ServletAPI对象
@RequestMapping("/redirectOld") 
public void redirectOld(HttpServletRequest request, HttpServletResponse response) throws Exception { 
	response.sendRedirect(request.getContextPath()+"/demo/forwardMvcView");
}

17. 如何释放静态资源

当有静态资源需要加载时,比如jquery.js,通过谷歌开发者工具抓包发现,没有加载到jquery.js。

之所以发生这种情况,是因为: 现在SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /(缺省),代表除了jsp请求不拦截, 其他的所有请求都会拦截,包括一些静态文件(js html css jpg等等), 而拦截住之后, 它又找不到对应的处理器方法来处理, 因此报错。

我们可以通过配置释放静态资源:(不交给SpringMVC处理)
(1)在SpringMVC的配置文件中添加释放静态资源(配置繁琐不推荐)

 <!--
        释放静态资源的方式一
            mapping : 请求路径的URL的映射规则
            location: 静态资源的物理目录
            当静态资源请求到SpringMVC的前端控制器时,根据释放资源的配置
                1、不再查找具体的controller处理
                2、从location路径中查找匹配的资源
    -->
    <mvc:resources mapping="/js/*" location="/js/"></mvc:resources>
    <mvc:resources mapping="/image/*" location="/image/"></mvc:resources>
    <mvc:resources mapping="/css/*" location="/css/"></mvc:resources>

(2)在SpringMVC的配置文件中添加释放静态资源(推荐)

 <!--
        统一释放所有的静态资源文件
            当SpringMVC处理静态资源时,委托给默认的Servlet处理
            默认Servlet:tomcat中的默认Servlet
    -->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>

(3)修改web.xml中前端控制器的URL映射规则,以特殊字符串结尾的请求会交给前端控制器处理。

<!--
    需要进入SpringMVC的所有请求,都需要以.do结尾
    控制器方法中@RequestMapping不需要做额外的配置,和之前一模一样
 -->
<servlet-mapping>
	<servlet-name>mvc</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

18. 如何使用Ajax+json实现异步交互

在SpringMVC中进行ajax的数据交互,需要通过两个注解简化开发。
@RequestBody : 自动的将请求的json字符串,转化为指定java对象(处理请求)
@ResponseBody:自动的将java对象,转化为json字符串并响应(处理响应)
注意: Springmvc默认用MappingJackson2HttpMessageConverter对json数据进行转换,需要加入jackson的坐标依赖。

19. 自定义异常处理器的两种方式

方式一:自定义一个类实现HandlerExceptionResolver接口,将异常处理器交给spring容器管理即可。

方式二:以通过@ControllerAdvice 和 @ExceptionHandler注解定义全局异常处理。
使用方式:
@ControllerAdvice:配置到java类
定义一个异常处理方法:
返回值String (视图)
参数:Model
方法上通过@ExceptionHandler配置(处理的异常类型)

20. 什么是拦截器

拦截器是SpringMVC提供的一种技术, 它的功能似于过滤器Filter,它会在进入Controller之前,离开Controller之后以及页面渲染完毕之后进行拦截。

21. 如何自定义拦截器

方式一:自定义一个类实现HandlerInterceptor接口,实现其中三个方法

  • preHandle() : 在目标方法之前执行,一般用于预处理
  • postHandle():在目标方法执行之后执行,一般用于后处理
  • aterCompletion():整个请求处理完毕,在视图渲染完毕时回调,一般用于资源的清理或性能的统计

在SpringMVC的配置文件中,添加拦截器配置(配置拦截器对应需要拦截的URL和方法规则)


    <!--配置SpringMVC的拦截器-->
    <mvc:interceptors>
        <!--配置具体的拦截器和拦截器的拦截规则-->
        <mvc:interceptor>
            <!--
                mapping : 配置拦截规则
                /** 表示拦截所有
                请求  /hello/demo1
            -->
            <mvc:mapping path="/**"/>
            <!--
                exclude-mapping: 配置不拦截的规则
            -->
            <mvc:exclude-mapping path="/hello/demo2"/>
            <!--创建对象:在当前拦截器中有效-->
            <bean class="cn.itcast.interceptors.MyInterceptor01"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

22. 如何自定义拦截器链

开发中拦截器可以单独使用,也可以同时使用多个拦截器形成一条拦截器链。

开发步骤和单个拦截器是一样的,只不过注册的时候注册多个,注册的顺序就代表拦截器执行的顺序。

23. 拦截器和过滤器的区别

过滤器是Servlet 规范中的一部分,任何java web工程都可以使用。

拦截器是SpringMVC框架的,只有使用了SpringMVC框架的工程才能用。

过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截。

拦截器只会拦截访问的控制器方法,如果访问的是jsp,js,html,css,image等,它是不拦截的。

本文地址:https://blog.csdn.net/ggh0314/article/details/109581744