Spring MVC 的九大组件

本文详细介绍了Spring MVC的九大组件:HandlerMapping、HandlerAdapter、HandlerExceptionResolver、ViewResolver、RequestToViewName Translator、LocaleResolver、ThemeResolver、MultipartResolver和FlashMapManager,包括它们各自的作用和工作原理。了解这些组件有助于深入理解Spring MVC的设计和实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HandlerMapping

HandlerMapping是用来查找Handler 的,也就是处理器,具体的表现形式可以是类,也可以是方法。比如,标注了@RequestMapping的每个方法都可以看成一个 Handler。Handler 负责实际的请求处理,在请求到达后,HandlerMapping的作用便是找到请求相应的处理器Handler和Interceptor.

HandlerAdapter

从名字上看,HandlerAdapter 是一个适配器。因为Spring MVC中Handler 可以是任意形式的,只要能够处理请求便可。但是把请求交给Servlet 的时候,由于Servlet 的方法结构都是
doService(HttpServletRequest req, HttpServletResponse resp)形式的,要让固定的Servlet 处理方法调用Handler来进行处理,这一步 工作便是HandlerAdapter要做的事。

小结:Handler是用来干活的工具;HandlerMapping用于根据需要干的活找到相应的工具;HandlerAdapter是使用工具干活的人

HandlerExceptionResolver

其它组件都是用来干活的。在干活的过程中难免会出现问题,出问题后怎么办呢?这就需要有一个专门的角色对异常情况进行处理,在SpringMVC中就是HandlerExceptionResolver。

HandlerExceptionResolver 是用来处理Handler 产生的异常情况的组件。具体来说,此组件的作用是根据异常设置ModelAndView, 之后交给渲染方法进行渲染,渲染方法会将ModelAndView渲染成页面。

不过要注意,HandlerExceptionResolver 只用于解析对请求做处理阶段产生的异常,渲染阶段的异常不归它管,这也是SpringMVC组件设计的一大原则一分工明确、互不干涉。

ViewResolver

ViewResolver 的主要作用是将String 类型的视图名和Locale解析为View 类型的视图,只有一个resolveViewName()方法。从方法的定义可以看出,Controller层返回的String 类型的视图名viewName最终会在这里被解析成为View。

View 是用来渲染页面的,也就是说,它会将程序返回的参数和数据填入模板中,生成HTML文件。ViewResolver在这个过程中主要做两件大事: ViewResolver 会找到渲染所用的模板(第一件大事)和所用的技术(第二件大事,其实也就是找到视图的类型,如JSP)并填入参数。

默认情况下,Spring MVC会为我们自动配置一个InternalResourceViewResolver,是针对JSP类型视图的。

RequestToViewName Translator

RequestToViewNameTranslator组件的作用是从请求中获取ViewName。因为ViewResolver根据ViewName查找View,但有的Handler处理完成之后,没有设置View,也没有设置ViewName,
便要通过这个组件来从请求中查找ViewName。

RequestToViewNameTranslator在Spring MVC容器里只可以配置一个,所以所有request到ViewName的转换规则都要在一个Translator里面全部实现。

LocaleResolver

解析视图需要两个参数:一是视图名,另一个是Locale。视图名是处理器返回的,Locale是从哪里来的?这就是LocaleResolver要做的事情。LocaleResolver用于从request解析出Locale,Locale就是zh-cn之类,表示一个区域,有了这个就可以对不同区域的用户显示不同的结果。
SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。

ThemeResolver

用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源、如图片、css样式等。

SpringMVC的主题也支持国际化,同一个主题不同区域也可以显示不同的风格。SpringMVC中跟主题相关的类有 ThemeResolver、ThemeSource和Theme。主题是通过一系列资源来具体体现的,要得到一个主题的资源,首先要得到资源的名称,这是ThemeResolver的工作。然后通过主题名称找到对应的主题(可以理解为一个配置)文件,其抽象也就是Theme,这是ThemeSource的工作。最后从主题中通过Theme来获取主题和具体的资源。

MultipartResolver

用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File,如果上传多个文件,还可以调用getFileMap得到FileName->File结构的Map。此组件中一共有三个方法,作用分别是判断是不是上传请求,将request包装成MultipartHttpServletRequest、处理完后清理上传过程中产生的临时资源。

FlashMapManager

说到FlashMapManager组件,得先说一下FlashMap。

FlashMap用于重定向时的参数传递,比如在处理用户订单时,为了避免重复提交,可以处理完post请求后重定向到一个get请求,这个get请求可以用来显示订单详情之类的信息。这样做虽然可以规避用户重新提交订单的问题,但是在这个页面上要显示订单的信息,这些数据从哪里获取呢?因为重定向是没有传递参数这一功能的,如果不想把参数写进URL(其实也不推荐这么做,除了URL有长度限制,把参数都直接暴露也不安全),那么就可以通过FlashMap来传递。只需要在重定向之前将要传递的数据写入请求(可以通过ServletRequesttributes getRequest(方法获得)的属性OUTPUT_ FLASH_ MAP ATTRIBUTE中,这样在重定向之后的Handler中Spring就会自动将其设置到Model中,在显示订单信息的页面上就可以直接从Model中获得数据。

FlashMapManager就是用来管理FlashMap的。

总结

通过对此9大组件的宏观认识,对分析SpringMVC的设计、原理与实现都会有很大的帮助作用。

参考

(1)https://www.cnblogs.com/wkcto/p/13827331.html
(2)https://blog.youkuaiyun.com/Apeopl/article/details/84372771
(3)《Spring5核心原理与30个类手写实战》

### 调整 Android 中 ImageButton 的图像尺寸或缩放属性 在 Android 开发中,`ImageButton` 是一种特殊的 `ImageView` 子类,主要用于通过点击事件触发操作。为了调整其内部图像的尺寸或实现特定的缩放行为,可以利用 XML 属性和 Java/Kotlin 方法来完成。 #### 使用 XML 设置缩放属性 可以通过设置 `android:scaleType` 来控制图像如何适应 `ImageButton` 的边界。默认情况下,`ImageButton` 不会自动缩放图像以适应按钮大小[^1]。因此,建议显式定义 `android:scaleType="centerInside"` 或其他合适的值: ```xml <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/your_image" android:scaleType="fitXY" /> ``` 上述代码中的 `android:scaleType="fitXY"` 将确保图像完全填充 `ImageButton` 的区域,而不会保留多余的空白边缘[^5]。 #### 动态设置图像资源及其缩放方式 除了在 XML 文件中配置外,还可以通过编程的方式动态更改图像源以及应用不同的缩放逻辑。例如,使用以下方法加载图像并调整其比例: ```java ImageButton imageButton = findViewById(R.id.image_button); imageButton.setImageResource(R.drawable.your_image); // 加载图像资源[^2] // 应用 fitXY 缩放模式 imageButton.setScaleType(ImageView.ScaleType.FIT_XY); ``` 如果希望进一步自定义图像的显示效果,则可能需要手动处理位图(Bitmap)。这通常涉及创建一个新的 Bitmap 对象,并将其作为参数传递给 `setImageBitmap()` 函数。 #### 处理点击时的效果变化 有时开发者还期望当用户按下某个按钮时能够看到视觉反馈,比如轻微缩小动画。这种需求可通过继承 `ZoomButton` 类或者单独编写触摸监听器达成目标[^3]。下面是一个简单的例子展示如何响应触碰动作改变当前状态下的呈现样式: ```kotlin val imageButton = findViewById<ImageButton>(R.id.image_button) imageButton.setOnTouchListener { _, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { imageButton.scaleX = 0.9f imageButton.scaleY = 0.9f true } MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> { imageButton.scaleX = 1f imageButton.scaleY = 1f false } else -> false } } ``` 以上片段实现了按压期间减少控件规模的功能,从而模拟出更直观的操作体验。 #### 防止不必要的扩展现象 值得注意的是,在某些场景下即使已经设置了合理的 scale type 参数仍然可能出现意料之外的结果——即图片被过度拉伸甚至超出预期范围。此时应该重新审视布局文件里关于父容器宽度高度设定部分是否存在冲突之处;另外也可以考虑引入额外约束条件限制最大最小宽高比率等因素影响最终渲染成果[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值