基础2-MVC注解映射请求、请求参数、请求头

@Controller(类)

标记这个类是Handler处理器,即MVC中的C部分。

@RequestMapping映射请求(方法)

Spring MVC使用@RequestMapping注解来为@Controller指定可以处理哪些URL请求;在@Controller的类定义、方法定义处均可使用该注解:

①类定义处:提供初步的请求映射信息,相对于WEB应用的根目录;

②方法定义处:提供更进一步的细分映射信息,相对于类定义处的URL;若类定义处未标注@RequestMapping,则方法处标记的URL就相对于WEB应用的根目录;

当DispatcherServlet截获请求后,就通过@Controller上的@RequestMapping提供的URL映射信息来确定请求所对应的处理方法;

@RequestMapping除了可以使用请求URL映射请求外,还可以使用请求方法、请求参数、请求头来映射请求;@RequestMapping的value、method、params、headers分别表示请求URL、请求方法、请求参数、请求头的映射条件,他们之间是“与&”的关系,可以联合使用多个条件来让请求映射更加精确化;

params和headers支持简单的表达式,常用方法如下:

①param1:表示请求中必须包含名为param1的请求参数;

②!param1:表示请求中不能包含名为param1的请求参数;

③param1 != value1:表示请求包含名为param1的请求参数,但其值不能为value1;

④{“param1=value1”,”param2”}:表示必须包含名为param1和param2的2个请求参数,且param1参数的值必须为value1;

个人觉得,@RequestMapping可以基本映射HTTP请求的所有属性,个人建议先把HTTP协议了解清楚,或者借用浏览器的F12监控下HTTP请求也可以;

至于value属性来映射请求URL,@RequestMapping注解还有更多的方式来映射:

①支持Ant风格资源地址支持3种匹配符,例如:

?:匹配文件名中的一个字符;

*:匹配文件名中的任意字符;

**:匹配多层路径;

②还支持Ant风格的URL,例如:

/org/*/create:匹配/org/任意数量字符/create;

/org/**/create:匹配/org/任意层级路径/create;

/org/create??:匹配/org/任意以create开头的字符串;

@PathVariable映射URL绑定的占位符(入参)

带占位符的URL是Spring3.0新增的功能,在Spring MVC向REST目标过滤时具有关键作用;通过@PathVariable可以将URL中占位符参数绑定到@Controller类的处理方法的入参中,即URL中的{xxx}占位符可以通过@PathVariable(“xxx”)直接绑定到操作方法的入参中,例如:

@RequestMapping(“/org/{orgcode}”)

Public Org getOrgById(

@PathVariable(“orgcode”) String orgcode){

编写业务逻辑,这里orgcode就是通过URL传入的参数,可以直接拿来使用

}

注意:@PathVariable中的占位符,要与URL中的占位符完全一致;

为了让浏览器的<form/>支持delete与put请求,Spring3.0新增了一个HiddenHttpMethodFilter过滤器,从而让form表达支持get、post、delete、put请求;下面是该过滤器关键代码:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        HttpServletRequest requestToUse = request;

        if ("POST".equals(request.getMethod()) && request.getAttribute("javax.servlet.error.exception") == null) {

            String paramValue = request.getParameter(this.methodParam);

            if (StringUtils.hasLength(paramValue)) {

                String method = paramValue.toUpperCase(Locale.ENGLISH);

                if (ALLOWED_METHODS.contains(method)) {

                    requestToUse = new HiddenHttpMethodFilter.HttpMethodRequestWrapper(request, method);

                }

            }

        }

        filterChain.doFilter((ServletRequest)requestToUse, response);

    }

<input type=”hidden” name=”_method”>

@RequestParam绑定请求参数值(入参)

Spring MVC通过分析处理方法的签名,将HTTP请求中被映射的信息绑定到处理方法对应的入参中;Spring MVC对@Controller中处理方法的签名限制是很宽松的,几乎可以按喜欢的任何方式来对方法进行签名,也正因为比较宽松,必要时可以对方法、方法入参来标注@PathVariable、@RequestParam、@RequestHeader等注解,届时Spring MVC会将HTTP请求信息绑定到对应的方法入参中,并根据方法的返回值类型作出相应的后续处理;

在处理方法入参时使用@RequestParam则可以把请求参数传递给请求方法,其中value属性表示参数名,required属性表示是否必须,该属性默认为true,表示请求参数中必须包含对应的参数,如不存在,则抛出异常;defaultValue属性指定默认值,当对应的value没有时,可以配置该属性;

@RequestHeader绑定请求头的属性值(入参)

请求头包含了若干个属性,服务器可据此来获知客户端的值,通过@RequestHeader来把请求头中的属性值绑定到处理方法的入参中;

@CookieValue绑定请求中的Cookie值(入参)

@CookieValue可以让处理方法的入参绑定到某个Cookie值;

使用POJO对象绑定请求参数值(入参)

Spring MVC会按照请求参数名与POJO的属性名进行自动匹配,自动为该对象填充属性值,且支持级联属性;(之前的时候,这项工作是Struts来完成填充)

直接把POJO对象作为入参即可,不需要任何注解来注解该POJO;

直接传入Servlet API类型的参数(入参)

Handler方法可以直接接受如下Servlet API类型的参数:

HttpServletRequest/HttpServletResponse

HttpSession/java.security.Principal

Locale/InputStream/OutputStream/Reader/Writer

与POJO一样,不需要任何注解,可以直接作为方法入参;

请求/响应的Json格式

SpringMVC3.0以后新增HttpMessageConverter<T>接口,该接口负责将请求信息转换为一个对象(类型为T),或者将对象(类型为T)输出位响应信息;

使用HttpMessageConverter<T>将请求信息转化并绑定到处理方法的入参中或者将响应结果转化为对应类型的响应信息中,Spring提供了2种途径:

①使用@RequestBody/@ResponseBody对处理方法的进行注解;

②使用HttpEntity<T>/ResponseEntity<T>作为处理方法的入参或返回值;

当控制器处理方法使用到@RequestBody/@ResponseBody或HttpEntity<T>/ResponseEntity<T>时,Spring首先根据请求头或者响应头的Accept属性来选择匹配的HttpMessageConverter,进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter,若找不到可用的HttpMessageConverter则抛出异常;

@RequestBody与@ResponseBody不需要成对出现;

@RequestBody用于注解入参,@ResponseBody用于注解类、方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值