Springmvc架构详解

框架结构

框架结构如下图:

这里写图片描述

架构流程

1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户

组件说明

以下组件通常使用框架提供实现:
 DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

 HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

 Handler:处理器(自己写)

Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
这里写图片描述

 HandlAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
下图(略,粘贴太累..)是许多不同的适配器,最终都可以使用usb接口连接

 ViewResolver:视图解析器

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

 View:视图(自己写)

springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

说明:在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
需要用户开发的组件有handler、view

默认加载的组件

我们没有做任何配置,就可以使用这些组件
因为框架已经默认加载这些组件了,配置文件位置如下图:
这里写图片描述

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolverorg.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolverorg.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMappingorg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapterorg.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolverorg.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslatororg.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolverorg.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

组件扫描器

使用组件扫描器省去在spring容器配置每个Controller类的繁琐。
使用自动扫描标记@Controller的控制器类,
在springmvc.xml配置文件中配置如下:

<!-- 配置controller扫描包,多个包之间用,分隔 -->
<context:component-scan base-package="cn.itcast.springmvc.controller" />

注解映射器和适配器

配置处理器映射器

注解式处理器映射器,对类中标记了@ResquestMapping的方法进行映射。根据@ResquestMapping定义的url匹配@ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器。
HandlerMethod对象中封装url对应的方法Method。

从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。

在springmvc.xml配置文件中配置如下:

<!-- 配置处理器映射器 -->
<bean
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

注解描述:
@RequestMapping:定义请求url到处理器功能方法的映射

配置处理器适配器

3.6.2. 配置处理器适配器
注解式处理器适配器,对标记@ResquestMapping的方法进行适配。

从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。
这里写图片描述
在springmvc.xml配置文件中配置如下:

<!-- 配置处理器适配器 -->
<bean
    class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

注解驱动

直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。
SpringMVC使用自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter
可以在springmvc.xml配置文件中使用替代注解处理器和适配器的配置。

<!-- 注解驱动 -->
<mvc:annotation-driven />

视图解析器

视图解析器使用SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器支持JSP视图解析
在springmvc.xml配置文件中配置如下:

<!-- Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" -> "/WEB-INF/jsp/test.jsp" --><!-- 配置视图解析器 --><bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 配置逻辑视图的前缀 --><property name="prefix" value="/WEB-INF/jsp/" /><!-- 配置逻辑视图的后缀 --><property name="suffix" value=".jsp" /></bean>

逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为ItemList,则最终返回的jsp视图地址:
“WEB-INF/jsp/itemList.jsp”

最终jsp物理地址:前缀+逻辑视图名+后缀

修改ItemController

修改ItemController中设置视图的代码

// @RequestMapping:里面放的是请求的url,和用户请求的url进行匹配
// action可以写也可以不写
@RequestMapping("/itemList.action")
public ModelAndView queryItemList() {// 创建页面需要显示的商品数据List<Item> list = new ArrayList<>();list.add(new Item(1, "1华为 荣耀8", 2399, new Date(), "质量好!1"));list.add(new Item(2, "2华为 荣耀8", 2399, new Date(), "质量好!2"));list.add(new Item(3, "3华为 荣耀8", 2399, new Date(), "质量好!3"));list.add(new Item(4, "4华为 荣耀8", 2399, new Date(), "质量好!4"));list.add(new Item(5, "5华为 荣耀8", 2399, new Date(), "质量好!5"));list.add(new Item(6, "6华为 荣耀8", 2399, new Date(), "质量好!6"));// 创建ModelAndView,用来存放数据和视图ModelAndView modelAndView = new ModelAndView();// 设置数据到模型中modelAndView.addObject("itemList", list);// 设置视图jsp,需要设置视图的物理地址// modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");// 配置好视图解析器前缀和后缀,这里只需要设置逻辑视图就可以了。// 视图解析器根据前缀+逻辑视图名+后缀拼接出来物理路径modelAndView.setViewName("itemList");return modelAndView;
}

效果

效果和之前一样,如下图:
这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区间覆盖问题

用i来表示x坐标轴上坐标为[i-1&#xff0c;i]的长度为1的区间&#xff0c;并给出n&#xff08;1≤n≤200&#xff09;个不同的整数&#xff0c;表示n个这样的区间。 现在要求画m条线段覆盖住所有的区间&#xff0c;条件是&#xff1a;每条线段可以任意长&#xff0c;但是要求所…

Windows驱动开发如何入门

http://blog.csdn.net/charlessimonyi/article/details/50904854 http://blog.csdn.net/charlessimonyi/article/details/50904956

springmvc整合mybatis之准备阶段与文件配置

文章出处&#xff1a;课程资料 web.xml等配置文件的解释&#xff1a;打开博客 为了更好的学习 springmvc和mybatis整合开发的方法&#xff0c;需要将springmvc和mybatis进行整合。 整合目标&#xff1a;控制层采用springmvc、持久层使用mybatis实现。 步骤详解&#xff1a; …

悼念512汶川大地震遇难同胞

Problem Description 时间&#xff1a;2008年5月16日&#xff08;震后第4天&#xff09; 地点&#xff1a;汶川县牛脑寨人物&#xff1a;羌族老奶奶【转载整理】牛脑寨是一个全村600多人的羌族寨子&#xff0c;震后几天&#xff0c;这里依然能常常听到隆隆的声音&#xff0c;那…

Win10下VS2015(WDK10)驱动开发环境配置

1、 概述 微软在”WDK7600“以后就不再提供独立的内核驱动开发包了&#xff0c;而是必须首先安装微软集成开发环境VisualStudio&#xff0c;然后再从微软官网下载集成的WDK开发包、或者离线安装包&#xff0c;但是安装后Visual Studio就集驱动程序开发&#xff0c;编译&…

懒虫小鑫

roblem Description 小鑫是个大懒虫&#xff0c;但是这一天妈妈要小鑫去山上搬些矿石去城里卖以补贴家用。小鑫十分的不开心。不开心归不开心&#xff0c;小鑫还是要做这件事情的。我们把这个事情简化一下。有n块矿石&#xff0c;设第i块矿石由两个数字wi和pi表示。分别表示这块…

springmvc与mybatis整合之实现商品列表

需求 实现商品查询列表&#xff0c;从mysql数据库查询商 品信息。. DAO开发 使用逆向工程&#xff0c;生成代码 注意修改逆向工程的配置文件 ItemService接口 public interface ItemService {/*** 查询商品列表* * return*/List<Item> queryItemList();}. ItemServi…

中断处理程序与中断服务例程

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[-] 1 什么是中断2中断处理程序3中断服务例程4request_irq函数分析 1. 什么是中断 简单来说中断就是硬件设备与处理器的一种交流方式&#xff0c;比如当我按下一个键时&#xff0c;只有当处…

Windows驱动程序开发语言

Windows驱动程序和Win32应用程序一样&#xff0c;都是PE格式&#xff0c;所以说&#xff0c;只要某种语言的编译器能够编译出PE格式的二进制格式文件&#xff0c;并且能够设置驱动程序的入口地址&#xff0c;那么这种语言就可以用来开发Windows驱动程序&#xff0c;所以可以选择…

java 正则表达式 手机号 邮箱(转载)

转载地址&#xff1a;https://www.cnblogs.com/go4mi/p/6426215.html package com.modules.plateform.tool;import java.util.regex.Pattern; /*** 账户相关属性验证工具**/ public class AccountValidatorUtil {/*** 正则表达式&#xff1a;验证用户名*/public static final …

商人小鑫

Problem Description 小鑫是个商人&#xff0c;当然商人最希望的就是多赚钱&#xff0c;小鑫也一样。 这天&#xff0c;他来到了一个遥远的国度。那里有着n件商品&#xff0c;对于第i件商品需要付出ci的价钱才能得到。当然&#xff0c;对于第i件商品&#xff0c;小鑫在自己心中…

Windows驱动程序调用约定

调用约定是指在函数进行调用的时候&#xff0c;会根据不同的调用规则&#xff0c;翻译成不同的汇编代码。不同的调用约定&#xff0c;会有不同的参数的入参顺序&#xff0c;和调用堆栈的处理方式。比较常用的分为C语言调用约定_cdecl&#xff0c;和标准调用约定_stdcall. Wind…

装船问题

Problem Description 王小二毕业后从事船运规划工作&#xff0c;吉祥号货轮的最大载重量为M吨&#xff0c;有10种货物可以装船。第i种货物有wi吨&#xff0c;总价值是pi。王小二的任务是从10种货物中挑选若干吨上船&#xff0c;在满足货物总重量小于等于M的前提下&#xff0c;运…

获得Class引用的三种方式?Class.forName()、getClass以及.class的使用

上代码!!! package com.spring.partise;class A{static{System.out.println("I am A");} } public class helllo {public static void main(String[] args) throws Exception {System.out.println("------------得到Class对象的两种方式---------------")…

Windows驱动程序运行时函数的调用

编译器厂商一般在发布其编译器的时候&#xff0c;会连同运行时函数一同发布。Windows驱动程序不能再代码中使用编译器提供的运行时函数&#xff0c;因为大部分运行时函数是基于Win32 API实现的&#xff0c;由于Win 32 API运行在用户模式&#xff08;RIng3层&#xff09;&#x…

活动选择问题

Problem Description sdut 大学生艺术中心每天都有n个活动申请举办&#xff0c;但是为了举办更多的活动&#xff0c;必须要放弃一些活动&#xff0c;求出每天最多能举办多少活动。Input 输入包括多组输入&#xff0c;每组输入第一行为申请的活动数n(n<100)&#xff0c;从第2…

java加载类时静态代码块、构造代码块、构造方法执行顺序

构造代码块作用&#xff1a;https://blog.csdn.net/hspingcc/article/details/54893853 package com.spring.partise;class A{A(){System.out.println("无参构造方法");}A(String str){System.out.println("带参数构造方法");}static{System.out.println(…

为什么可以通过类名调用静态方法?

JVM加载类&#xff1a; 所有的类都是在对其第一次使用时&#xff0c;动态加载到JVM中的。当程序创建第一个类的静态成员的引用时&#xff0c;就会加载这个类&#xff0c;进而可以得到该类的类型信息&#xff0c;而类型信息可以在程序运行时发现和使用类型信息。这个证明构造器…

小鑫去爬山

Problem Description 马上就要放假了&#xff0c;小鑫打算去爬山。 小鑫要去爬的这座山有n个海拔区间。为了清楚描述我们可以从上到下标号1到n。第i个区间有i个落脚点&#xff0c;每一个落脚点都有一个危险值。小鑫需要在第n个海拔区间挑选一个点向上爬&#xff0c;爬到第1个海…

NT驱动程序和WDM驱动程序的区别

1. Windows驱动程序分为两类&#xff0c;一类是不支持即插即用功能的NT式的驱动程序&#xff1b;另一类是支持即插即用功能的WDM式的驱动程序。2. NT式的驱动程序要导入的头文件时NTDDK.H&#xff0c;而WDM式的驱动要导入的头文件为WDM.H.3. DriverEntry需要放在INIT标志的内存…