springmvc

简介:
SpringMVC:是表现层框架和struts2一样,但它和struts2也有不同之处首先springMVC是基于方法来进行开发的即它的每一个请求路径都会对应一个方法并且将请求路径带过来的参数通过参数解析器解析然后绑定到方法的形参,可以设计为单例模式也可以设计成多例模式,但struts2它是基于类来进行开发的参数的传递是通过类的属性来完成的它对于数据的响应是通过OGNL语言完成的且只能是多例模式.
springMVC的流程:
1. 客户端传过来的指定url会被前端控制器DispatcherServlet所拦截
2. 前端控制器会将url发送给处理器映射器HandlerMapping,HandlerMapping会根据url去查找对应的处理器handle,找到后会生成具体的Handler对象和Handler拦截器返回给DispatcherServlet
3. DispatcherServlet会去通过处理器适配器HandlerAdapter处理Handler
4. Handler执行完毕以后会返回一个ModelAndView,HandlerAdapter会将这个ModelAndView返回给DispatcherServlet
5. DispatcherServlet会将这个ModelAndView交给视图解析器ViewReslover,ViewReslover会根据逻辑视图名产生对应的View并返回给DispatcherServlet
6. DispatcherServlet 会对View进行渲染然后填充到request域然后响应到客户端
springMVC使用了基于组件技术,就是将整个业务划分为几个不同的组件来完成,主要由以下几个组件构成:
1. DispatcherServlet:前端控制器,DispatcherServlet是用来调控整个业务流程的,它调用别的组件来实现这个的业务流程,可以说它将这个业务划分为了几个部分让这几个部分解耦和,DispatcherServlet做为核心控制器它在创建时会默认的从DispatcherServlet.properties中加载别的组件,如果在springmvc.xml中配置了组件就加载配置的组件,为了可以在启动服务时加载组件我们需要将DispathcerServlet配置到web.xml中并设置成加载时创建,需要将配置的springmvc.xml通过初始化参数加载.
2. HandlerMapping:处理器映射器,HandlerMapping根据传过来的请求去找到对应的Handler,然后将Handler和Interceptor拦截器封装到HandlerExceutionChain中返回给DispatcherServlet.
3. Handler:处理器,用来处理用户具体的请求
4. HandlerAdapter:处理器适配器,用来执行Handler,HanlderAdapter会通过适配器接口对Hanlder进行适配,适配后就可以执行Handler,通过HandlerAdapter可以执行多种类型的Handler,使用的是适配器设计模型.
5. ViewResolver:视图解析器:ViewResolver负责将HandlerAdapter返回给DispathcerServlet的ModelAndView通过指定的逻辑视图名生成相应的View然后返回给DispatcherServlet.
参数绑定:HandlerAdapter在执行Handler之前会将请求所携带的参数绑定到方法的形式参数上,我们的Handler上的形式参数可以是:
1. HttpServletRequest:通过request对象获取请求
2. HttpservletResponse:通过response处理响应信息
3. HttpSession:通过session对象获得里面存放的对象
4. ModelMap/Model:通过Model向页面传数据
5. 基本数据类型:如果用基本类型那么请求发送过来的参数名要和Hanlder的形参名一样.如果两个名字不一样要绑定的话需要在Handler指定形参前面添加@RequestParam,它可以指定请求发送过来的参数名字,默认值,是否必须要传值.
6. Pojo类:只要pojo类的属性名和请求发过来的参数名相同就可以如果pojo类的属性是一个类那么请求发过来的参数名必须符合OGNL表达式的写法,(类.属性)
7. 自定义参数:如果我们需要将传过来的参数进行简单的转换那么就需要自定义参数,自定义参数我们需要创建一个类去实现Converter接口
8. 字符串数组:只需要请求发过来的参数名和字符串的名字相同就可以.
9. List集合:如果List的泛型是引用类型则传过来的参数名称要是集合名字[].泛型的属性名itemList[0].id
10. Map:传过来的参数名字必须是map类型的参数名[key]
Controller的返回值:
1. ModelAndView:里面包含有model数据和逻辑视图名
2. void:如果形参中有request,response那么就可以用它们来进行转发和重定向,不用将数据返回给DispatcherServlet
3. String:String可以返回一个逻辑视图名,也可以通过redirect,forward来进行转发和重定向
数据回显:当我们请求失败时有可能需要将数据回显,对于简单数据类型会使用Model将参数放到request中model.addAttribute("id", id); springmvc默认支持pojo数据回显,springmvc自动将形参中的pojo重新放回request域中,request的key为pojo的类名,如果参数名和key对应不上我们可以使用@ModelAttribute(key)来讲参数回显.
Json交互:如果Handler要接受一个json数据那么在参数名前面加上@RequestBody,如果要返回一个json数据要在返回值类型上加@ResponseBody
拦截器:是用来对Handler进行预处理和后处理的,拦截器类需要实现HandlerInterceptor接口.
springmvc.xml配置:

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
		
		<!-- 处理对静态资源访问,不走前端控制器-->
		<mvc:resources location="/js/" mapping="/js/**"/>
		<mvc:resources location="/css/" mapping="/css/**"/>
		
		<!--配置处理器适配器:用于执行处理器(handle) 所有实现的controller接口的都可以被他执行 
		<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 
		
		配置处理器适配器:用于执行处理器(handle) 所有实现的HttpRequestHandler接口的都可以被他执行
		<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
		
		配置处理器映射器:用来找到处理器
		根据bean的name进行查找Handler 将action的url配置在bean的name中
		<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
		
		simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id进行统一映射配置
		<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
			<property name="mappings">
				<props>
					<prop key="/items1.action">itemList</prop>
					<prop key="/items2.action">itemList</prop>
					<prop key="/items3.action">itemList1</prop>
				</props>
			</property>
		</bean>
		
		Handler配置
		<bean name="/items.action" id="itemList" class="cn.itcast.springmvc.controller.ItemList"/>
		
		Handler配置
		<bean name="/items3.action" id="itemList1" class="cn.itcast.springmvc.controller.ItemList2"/>-->		
		
		<!-- 注解开发,上面的Handler,HandlerMapping,HandlerAdapter都用注解代替-->
		<!-- 扫描controller注解,完成controller注入-->
		<context:component-scan base-package="cn.itcast.springmvc.controller"/>

		<!--注解适配器 
		<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
			json转换器 
			<property name="messageConverters">
				<list>
					<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
				</list>
			</property>
		</bean>-->
		
		<!--注解映射器 -->
		<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> -->
<!-- 上边的注解处理器映射器和适配器配置可以使用下边mvc:annotation-driven代替,conversion-service用于开启自定义参数
			 使用annotation-driven 不需要配置json转换器-->
		<mvc:annotation-driven conversion-service="conversionService"/>
		
		<!-- 自定义参数 -->
		<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
			<property name="converters">
				<list>
                                        <!-- 自定义参数必须实现Converter接口 -->
					<bean class="cn.itcast.spring.converter.DateConverter"/>
				</list>
			</property>
		</bean>

		<!-- 配置视图解析器:用来将modelAndView解析成符合要求的view -->
		<!-- ViewResolver -->
		<!-- InternalResourceViewResolver:支持JSP视图解析 -->
		<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			<!-- viewClass : JstlView表示JSP模板页面需要使用JSTL标签库 -->
			<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
			<!--前缀与后缀用来组成最终视图的地址-->
			<property name="prefix" value="/WEB-INF/jsp/"/>
			<property name="suffix" value=".jsp"/>
		</bean>
		<!-- 配置异常处理器 -->
		<!-- 自定义异常处理器必须要实现HandlerExceptionResolver  -->
		<bean id="handlerExceptionResolver" class="cn.itcast.spring.exception.CustomExceptionResolver"/>
		<!--拦截器 -->
		<mvc:interceptors>
			<mvc:interceptor>
				<!-- 拦截器拦截路径,/**拦截所有url -->
				<mvc:mapping path="/**"/>
				<!-- 自定义拦截器必须要实现HandlerInterceptor-->
				<bean class="cn.itcast.spring.handlerinterceptor.HandlerInterceptor1"/>
			</mvc:interceptor>
		</mvc:interceptors>
		
		<!-- 文件上传 -->
		<!-- Multipart解析器-->
		<!-- 配置好以后,在Handler的形式参数中加入 MultipartFile参数  -->
		<bean id="multipartResolver"
			class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
			<!-- 设置上传文件的最大尺寸为5MB -->
			<property name="maxUploadSize">
				<value>5242880</value>
			</property>
		</bean>
</beans>


目录
相关文章
|
1天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
3月前
|
JSON 前端开发 Java
spring mvc Rest风格
spring mvc Rest风格
31 0
|
26天前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
30天前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
28天前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
1月前
|
JSON 前端开发 Java
Spring MVC返回JSON数据
综上所述,Spring MVC提供了灵活、强大的方式来支持返回JSON数据,从直接使用 `@ResponseBody`及 `@RestController`注解,到通过配置消息转换器和异常处理器,开发人员可以根据具体需求选择合适的实现方式。
83 4
|
1月前
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
69 3
|
1月前
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
67 2
|
2月前
|
前端开发 Java 应用服务中间件
我以为我对Spring MVC很了解,直到我遇到了...
所有人都知道Spring MVC是是开发的,却鲜有人知道Spring MVC的理论基础来自于1978 年提出MVC模式的一个老头子,他就是Trygve Mikkjel Heyerdahl Reenskaug,挪威计算机科学家,名誉教授。Trygve Reenskaug的MVC架构思想早期用于图形用户界面(GUI) 的软件设计,他对MVC是这样解释的。MVC 被认为是解决用户控制大型复杂数据集问题的通用解决方案。最困难的部分是为不同的架构组件想出好的名字。模型-视图-编辑器是第一个。
我以为我对Spring MVC很了解,直到我遇到了...
|
2月前
|
前端开发 Java API
Spring Boot 中的 MVC 支持
### Spring Boot 注解摘要 - **@RestController** - **@RequestMapping** - **@PathVariable** - **@RequestParam** - **@RequestBody**
26 2