黄金的导电性最好,为什么电脑主板还是要用铜? 飞机最快,为什么还有人做火车? 清华大学最好,为什么还有人去普通学校? 因为资源都是有限的,我们现实生活中必须兼顾成本与产出的平衡
上文 介绍了<code>spring mvc</code>用于处理入参的处理器:<code>handlermethodreturnvaluehandler</code>它的作用,以及介绍了最为常用的两个参数处理器子类:<code>pathvariablemethodargumentresolver</code>和<code>requestparammethodargumentresolver</code>。由于该体系的重要以及庞大,本文将接着继续讲解~
<code>@requestheader</code>注解,可以把request请求header部分的值绑定到方法的参数上。
此处理器能处理的是我们这么来使用:
请求头截图:
结果打印(集合封装成功了,证明逗号分隔是可以被封装成集合/数组的):
tip:注解指定的value值(key值)是<code>不</code>区分大小写的
处理必须标注有<code>@requestattribute</code>注解的参数,原理说这一句话就够了。
同上(注解不一样,scope不一样而已)
对解析标注有<code>@cookievalue</code>的做了一层抽象,子类负责从request里拿值(该抽象类不合请求域绑定)。
指定了从<code>httpservletrequest</code>去拿cookie值。
一般我们这么来用:
手动设置一个cookie值,然后请求
控制台打印如下:
tips:在现在restful风格下,cookie使用得是很少的了。一般用于提升用户体验方面~
标注有<code>@matrixvariable</code>注解的参数的处理器。<code>matrix:矩阵</code>,这个注解是spring3.2新提出来的,增强restful的处理能力(配合<code>@pathvariable</code>使用),比如这类url的解析就得靠它:<code>/owners/42;q=11/pets/21;s=23;q=22</code>。
关于<code>@matrixvariable</code>它的使用案例,我找了两篇靠谱文章给你参考:
参考一
参考二
它用于处理标注有<code>@value</code>注解的参数。对于这个注解我们太熟悉不过了,没想到在web层依旧能发挥作用。本文就重点来会会它~
通过<code>@value</code>让我们在配置文件里给参数赋值,在某些特殊场合(比如前端不用传,但你想给个默认值,这个时候用它也是一种方案)
说明:这就相当于在controller层使用了@value注解,其实我是不太建议的。因为@value建议还是只使用在业务层~
根本原理其实只是利用了<code>defaultvalue</code>支持占位符和<code>spel</code>的特性而已。给个使用示例:
请求:<code>/test</code>,打印:<code>28</code>。
注意:若你写成<code>@value("#{'${test.myage:10}' + 10}</code>,那你得到的答案是:<code>1810</code>(成字符串拼接了)。
另外,我看到网上有不少人说如果把这个<code>@propertysource("classpath:my.properties")</code>放在根容器的config文件里导入,controller层就使用<code>@value</code>/占位符获取不到值了,其实这是**<code>不正确</code>**的。理由如下:
<code>spring mvc</code>子容器在创建时:<code>initwebapplicationcontext()</code>
这就是为什么说即使你是在根容器里使用的<code>@propertysource</code>导入的外部资源,子容器也可以使用的原因(因为子容器会把父环境给<code>merge</code>一份过来)。
但是,但是,但是:如果你是使用形如<code>propertyplaceholderconfigurer</code>这种方式导进来的,那是会有容器隔离效应的~
数据来源同上,只是参数类型是map
这类解析器我认为是对第一类的有些处理器的一种补充,它依赖上面的相关注解。
你是否想过通过<code>@requestparam</code>一次性全给封装进一个<code>map</code>里,然后再自己分析?同样的本类处理器给<code>@requestheader</code>、<code>@pathvariable</code>、<code>@matrixvariable</code>都赋予了这种能力~
它依赖的方法是:<code>httpservletrequest#getparametermap()</code>、<code>multipartrequest#getmultifilemap()</code>、<code>multipartrequest#getfilemap()</code>等,出现于<code>spring 3.1</code>。
演示一把:
请求:<code>/test?name=fsx&age=18&age=28</code>。打印
从结果看出:
它不能传一key多值情况
若出现相同的key,以在最前面的key的值为准。
map实例是一个<code>linkedhashmap<string,string></code>实例
一次性把请求头信息都拿到:数据类型支出写<code>multivaluemap(linkedmultivaluemap)/httpheaders/map</code>。实例如下:
请求打印:
不过强烈不建议直接使用<code>map</code>,而是使用<code>httpheaders</code>类型。这么写<code>@requestheader httpheaders headers</code>,获取的时候更为便捷。
略。
它处理map类型,但没有标注任何注解的情况,它的执行顺序是很靠后的,所以有点兜底的意思。
使用案例:略。
这个处理器同时也解释了:为何你方法入参上写个<code>map、hashmap、modelmap</code>等等就可以非常便捷的获取到模型的值的原因~
参数比如是<code>sessionstatus, servletresponse, outputstream, writer, webrequest, multipartrequest, httpsession, principal, inputstream</code>等
这种方式使用得其实还比较多的。比如平时我们需要用servlet源生的api:<code>httpservletrequest, httpservletresponse</code>肿么办? 在<code>spring mvc</code>内就特别特别简单,只需要在入参上声明:就可以直接使用啦~
看到这你应该明白,以后你需要使用这些参数的话,直接在方法上申明即可,不需要自己再去get了,又是一种依赖注入的效果体现有木有~
支持<code>sessionstatus</code>。值为:<code>mavcontainer.getsessionstatus();</code>
通过<code>uricomponentsbuilder</code>来得到url的各个部分,以及构建url都是非常的方便的。
和重定向属性<code>redirectattributes</code>相关。
如果涉及到重定向:多个视图见传值,使用它还是比较方便的。
允许你入参里写:<code>org.springframework.ui.model</code>、<code>redirectattributes</code>、<code>redirectattributesmodelmap</code>、<code>concurrentmodel</code>、<code>extendedmodelmap</code>等等
在本文末尾,说一个特殊的处理器:<code>modelattributemethodprocessor</code>:主要是针对 被 <code>@modelattribute</code>注解修饰且不是普通类型(通过 <code>!beanutils.issimpleproperty</code>来判断)的参数。
关于<code>@modelattribute</code>这块的使用,参见这里
本文介绍完了四大类的前面三种类型,其中最为常用的是前两种类型的使用,希望大家可以掌握,和好好发挥~
handlermethodargumentresolver:controller入参自动封装器(将方法参数parameter解析为参数值)【享学spring mvc】
从原理层面掌握@modelattribute的使用(核心原理篇)【享学spring mvc】
从原理层面掌握@modelattribute的使用(使用篇)【享学spring mvc】
handlermethodargumentresolver(一):controller方法入参自动封装器(将参数parameter解析为值)【享学spring mvc】
handlermethodargumentresolver(二):map参数类型和固定参数类型【享学spring mvc】
handlermethodargumentresolver(三):基于httpmessageconverter消息转换器的参数处理器【享学spring mvc】