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

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等,它是不拦截的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值