SpringMVC的请求处理详解

1. 绑定表单参数

    /**
     * 接收表单参数:用注解@RequestParam
     *  作用:把一个表单参数,绑定给方法的一个形参。实现参数绑定
     *  属性:
     *      name/value:表单参数名称
     *      required:表单参数是否必须有值。
     *          如果required设置为true,表示必须传这个表单参数(允许传空值),否则报错400(bad request)
     *      defaultValue:参数的默认值。如果没有传递这个表单参数,就取默认值
     *
     * 客户端提交路径:
     * 服务端接收参数:
     *      1. 在方法上加形参,一个形参对应一个表单参数
     *      2. 在方法形参上加注解@RequestParam("表单参数名")
     */
    @RequestMapping("/param1")
    public String param1(@RequestParam("username") String name,
                         @RequestParam(value = "age", required = false, defaultValue = "80") Integer age){}

2.绑定简单参数

/**
 * 参数的直接绑定:
 *  如果表单参数名称,和方法形参名称相同,SpringMVC会自动进行参数绑定。不需要再加@RequestParam
 *
 * 提交的参数: /req/param2?username=tom&age=20   与形参名一致
 */
@RequestMapping("/param2")
public String param2(String username, Integer age){}

3.自定义类型转换

类型转换器

说明:

  • 如果表单参数是简单类型,SpringMVC能够自动转换类型并绑定到方法形参上

  • 如果表单参数是yyyy/MM/dd格式的日期:SpringMVC能够自动转换成为Date对象,绑定到方法形参上

  • 但是如果表单是其它格式的日期,SpringMVC不能自动转换类型

解决:

  • 自定义类型转换器,把参数转换成想要的类型,再绑定到形参上

  • 步骤:

    1. 创建类,实现类型转换器接口:Converter<S, T>, 重写convert()方法

      • S:源数据的类型

      • T:目标数据的类型

    2. springmvc.xml中注册类型转换器,语法如下:

<mvc:annotation-driver conversion-service="conversionService"/>

<bean id="conversionService" 
      class="org.springframework.context.support.ConversionServiceFactoryBean">
	<property name="converters">
    	<set>
        	<bean class="自定义类型转换器的全限定类名"/>
        </set>
    </property>
</bean>

                  3.自定义的类型转换器,示例:

public class MyDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        if (source == null || "".equals(source)) {
            return null;
        }

        SimpleDateFormat format = new SimpleDateFormat();

        //1.尝试按照yyyy/MM/dd格式解析;如果解析成功,就直接返回结果;如果解析失败,往后继续执行
        try {
            format.applyPattern("yyyy/MM/dd");
            return format.parse(source);
        } catch (ParseException e) {}

        //2.再尝试以yyyy-MM-dd格式解析;如果解析成功,就直接返回结果;如果解析失败,输出错误信息
        try {
            format.applyPattern("yyyy-MM-dd");
            return format.parse(source);
        } catch (ParseException e) {
            System.err.println("不支持的日期格式:" + source);
        }

        return null;
    }

4.绑定pojo对象

绑定简单POJO

SpringMVC可以帮我们自动把表单参数,封装成POJO对象,但是要求:

  • 客户端提交的表单参数名称,必须等于JavaBean的属性名

 

绑定复杂POJO

要求

  • 通常把List、Map等放到POJO对象里

  • 客户端提交的表单参数名称,必须和POJO里的属性名称相等

    • 设置List的数据时,表单参数名称:属性名[索引].属性名

    • 设置Map的数据时,表单参数名称:属性名['key'].属性名

5. 中文参数乱码的解决

在web.xml中,配置过滤器CharacterEncodingFilter

<filter>
    <filter-name>characterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

6. 其它常用注解

6.1:@RequestBody【重点】

注解说明

  • 作用:用于接收请求体数据;通常用于接收json,并还原成JavaBean对象

  • 语法:@RequestBody(requried=是否必须有请求体)

  • 要求:POST方式提交;因为GET方式提交,没有请求体

使用前提条件

pom.xml中添加jackson的依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.6</version>
</dependency>

springmvc.xml中,配置处理静态资源,并开启mvc的注解驱动

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

<!--处理静态资源-->
<mvc:default-servlet-handler/>

6.2:@PathVariable【重点】

RESTful编程风格

  • REST:Representational State Transfer,是一种编程风格,没有明确的标准。Spring提供的@PathVariable,是其支持RESTful风格的一个重要标志

  • 特点:

    • 资源Resources:每个资源有独一无二的URL

    • 表现Representation:资源呈现的形式。例如:文本可以呈现为html、json、xml等等

    • 状态转换State Transfer:使用HTTP协议的不同请求方式,表示对资源的不同的操作

  • 优点:结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多的网站采用

  • 示例:

    • URI:/user/1, 请求方式:HTTP GET, 表示获取id为1的用户

    • URI:/user/1, 请求方式:HTTP DELETE, 表示删除id为1的用户

    • URI:/user, 请求方式:HTTP PUT, 表示更新用户

    • URI:/user,请求方式:HTTP POST,表示新增用户

注解说明

  • 作用:Spring3.0提供的,用于获取请求路径中的值,需要配合@RequestMapping使用

  • 语法:@PathVariable(value="占位符名称", required=是否必须)

  • 作用位置:用在方法参数上,表示获取请求路径中占位符的值,赋值给方法参数

  • 例如:

    • 客户端请求:http://localhost:8080/mvc01/delete/100

    • @RequestMapping("/delete/{id}"):定义了占位符{id}

    • @PathVariable("id"):要获取占位符{id}位置的值100

使用示例:

@RequestMapping(value = "/{xxx}", method = RequestMethod.GET)
public String findUserById(@PathVariable("xxx") Integer id){
    System.out.println("根据id查询用户,id值:" + id);
    return "success";
}

6.3:@RequestHeader

注解说明

  • 语法:@RequestHeader(value="请求头名称", required=是否必须)

  • 作用位置:用在方法参数上,把指定请求头的值,赋值给方法参数

6.4:@CookieValue

注解说明

  • 语法:@CookieValue(value="cookie名称", requried=是否必须)

  • 作用位置:用在方法参数上,把指定名称的Cookie值,赋值给方法参数

6.5:@ModelAttribute

注解说明

注解@ModelAttribute的功能很强,但是大部分功能已不再适用。

@ModelAttribute注解标记的方法,会在当前Controller里每个方法被调用之前,先执行一次。有点类似于Junit里的@Before

7.使用原始Servlet的API

说明:

  • 在Controller的方法中,可以使用Servlet的原始API,只要在方法中直接定义参数即可,SpringMVC框架会提供对应的实参

  • SpringMVC支持的Servlet原始API有:

    • HttpServletRequest :代表HTTP请求

    • HttpServletResponse :代表HTTP响应

    • HttpSession :代表会话

    • java.security.Principal :Java的授权认证接口,当前已认证的用户

    • Locale :当前请求的语言环境

    • InputStream :请求体的字节流对象

    • OutputStream :响应体的字节流对象

    • Reader :请求体的字符流对象

    • Writer:响应体的字符流对象

示例:

@RequestMapping("/servletApi")
public String servletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session){
    request.setAttribute();
    session.setAttribute();

    ServletContext context = request.getServletContext();

    String host = request.getHeader("Host");
    System.out.println(host);

    return "";
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值