spring整合SpringMVC

本文详细介绍了SpringMVC的框架概述、在系统中的位置、核心组件,包括DispatcherServlet、Handler、HandlerMapping、HandlerAdapter、ViewResolver以及请求处理流程。此外,还探讨了SpringMVC的配置、简单示例、SSM整合步骤、Handler参数映射和RESTful相关概念,包括RESTful的无状态性和好处。最后,讲解了如何在SpringMVC中实现RESTful风格的接口。
摘要由CSDN通过智能技术生成

SpringMVC

一、SpringMVC框架概述

首先SpringMVC是一个MVC构架模式的web框架,是基于Servlet的。传统web框架,指的是SpringMVC依然使用多线程同步并发的方式来处理请求。

二、SpringMVC在系统中的位置

在这里插入图片描述
可以看出:SpringMVC并没有代替Servlet,他只是在Servlet上提供了一套封装好的组件,提高开发效率;还是得开发出的项目更加规范。

三、SpringMVC核心组件

如果没有SpringMVC框架,我们想要实现一个web项目,会出现大量Servlet,因为一个请求地址就需要一个Servlet,使得项目体积变大,且Servlet的生命周期,使得Servlet长期存在;


第一步,我们希望用一个Servlet来处理多个请求甚至是所有请求,就需要事先能根据请求路径查找出来请求方法的逻辑,这也是SpringMVC要做的第一件事:

  • DispatcherServlet:前端控制器
    用户请求首先到达前端控制器,他就相当于mvc模式中的controller,DispatcherServlet是整个流程控制的调度中心,由它调用其他组件处理用户的请求。

  • Handler:处理器
    Handler是继DispatcherServlet前端控制器的后端控制器,DispatcherServlet会将请求发送至对应的Handler来处理。Handler是处理业务逻辑的地方,需要我们自己来编写具体代码。

  • HandlerMapping:处理器映射器
    HandlerMapping负责根据用户的请求路径找到Handler,SpringMVC提供了不同的映射器实现不同的映射方式。例如:BeanName映射,配置文件映射,注解映射等。

  • HandlerAdapter:处理器适配器
    通过HandlerAdapter来执行Handler,因为Handler有不同形式,意味着调用方式是不同的,这是适配器模式的应用,我们也可以扩展适配器来实现新的Handler。
    如果前后不分离,还要返回jsp页面等

  • ViewResolver:视图解析器
    ViewResolver负责从Handler中获取数据和视图,根据逻辑视名称查找物理视图文件,并查找View对象,再生成View对象

  • View:视图
    View的职责就是装配数据,SpringMVC框架提供了很多的View视图类型的支持,包括jstlView、freemarkerView、pdfView等。常用的视图就是jsp。我们需要根据业务需求,通过页面标签或页面模板技术将模型数据展示给用户。

  • 其他组件:

类型 说明
HandlerExceptionResolver Handler异常处理器
LocaleResolver 提供国际化的视图。根据不同地区显示不同内容
ThemeResolver 根据不同地区提供个性化的布局
MultipartResolver 解析multipart请求数据,如浏览器表单文件上传
FlashMapManager 常用于通过重定向将属性从一个请求传递到另一个请求

请求处理流程简述

在这里插入图片描述

总的来说就是:
前端发送请求给Servlet,Servlet要通过HandlerMapping找能处理的Handler,但是HandlerMapping又不知道通过什么方式调用Handler,就去找HandlerAdapter找处理方式,最后处理Handler。经过Handler处理后返回数据或页面给DispatcherServlet,DispatcherServlet去找视图解析器,来解析视图产生结果,再返回给客户端。

四、简单demo

pom.xml

	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-webmvc</artifactId>
  		<version>5.2.2.RELEASE</version>
  	</dependency>
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>jstl</artifactId>
  		<version>1.2</version>
  	</dependency>
  	<dependency>
  		<groupId>javax.servlet.jsp</groupId>
  		<artifactId>javax.servlet.jsp-api</artifactId>
  		<version>2.3.3</version>
  		<scope>provided</scope>
  	</dependency>
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>javax.servlet-api</artifactId>
  		<version>4.0.1</version>
  		<scope>provided</scope>
  	</dependency>

SpringMVC最小依赖包。
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_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>hljsWeb</display-name>
  <servlet>
  	<!-- 给Servlet起别名 -->
  	<servlet-name>dispatcherServlet</servlet-name>
  	<!-- 指定具体类 -->
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<!-- 设置初始化参数 -->
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>classpath:springmvc.xml</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<!-- 给TestServlet类添加URL映射 -->
  	<servlet-name>dispatcherServlet</servlet-name>
  		<!--
  		/			除了.jsp结尾以外的所有请求
  		/*			所有请求	不常用(如果有.jsp结尾的请求也会进入DispatcherServlet) 
  		*.action	所有以.action结尾的请求
  		 -->
  	<url-pattern>*.action</url-pattern>
  </servlet-mapping>
</web-app>

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	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/context
	http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 开启注解扫描 -->
	<context:component-scan base-package="com.ttc.controller" />
</beans>

Controller.java

@Controller
public class UserController {
   
	@RequestMapping("/a.action")
	public ModelAndView getMsg() {
   
		ModelAndView mav = new ModelAndView();
		mav.addObject("msg", "Hello World");
		mav.setViewName("index.jsp");
		return mav;
	}
}

jsp

<html>
<body>
${msg}
</body>
</html>

五、配置

SpringMVC默认配置

DispatcherServlet.properties

// 本地化相关
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
// 本地化相关
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
// 默认匹配方式
org.springframework.web.servlet.HandlerMapping=
	// 继承Controller后,注册Bean,根据BeanName匹配URL
	org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\	
	// 使用注解时的映射器
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
	org.springframework.web.servlet.function.support.RouterFunctionMapping
// 默认调用Handler的处理方式
org.springframework.web.servlet.HandlerAdapter=
	// 实现HttpRequestHandler时候使用的处理方法
	org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
	// 实现Controller时候使用的处理方法
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
	// 方法注解的时候使用的处理方法
	org.springframework.web.servl
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值