首页 > 代码库 > Spring MVC HTTP请求数据绑定

Spring MVC HTTP请求数据绑定

package com.springmvc.controller;

import com.springmvc.model.UserInfo;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;

import java.io.IOException;
import java.io.OutputStream;

/**
 * <p>HTTP请求数据绑定</p>
 * <p>
 * 通过注解绑定:
 * 1.@RequestParam->绑定请求参数
 * 2.@PathVariable->绑定URL中的变量
 * 3.@RequestHeader->绑定请求头参数
 * 4.@CookieValue->绑定Cookie值
 * 使用Servlet API对象作为入参:
 * 1.HttpServletRequest
 * 2.HttpServletResponse
 * 3.HttpSession
 * 使用Spring的Servlet API代理类
 * 1.WebRequest
 * 使用IO对象作为入参
 * 1.java.io.InputStream/java.io.Reader
 * 2.java.io.outputStream/java.io.Write
 * 其它:Local
 * <p>
 * <p>
 * </p>
 * <p>
 * Created by liaody on 2017/4/30.
 */
@Controller("dataBindController")
public class DataBindController {

    /**
     * default constructor
     */
    public DataBindController() {

    }

    /**
     * <p>@RequestParam->绑定请求参数。</p>
     * <p>RequestMapping限定中不需要写明参数,当参数中含有指定的参数名时会实现自动绑定。</p>
     * <p>
     *     需要注意的是@RequestParam有三个参数,分别是默认的value、required(默认为true)、defaultValue默认值(不推荐使用)。
     *     当请求中不存在对应的参数时,会抛出异常。如果参数不是必须的可以将required设置为false(例子中的userEmail)。
     * </p>
     * <p>
     * 请求URL:http://localhost:8080/requestParamBind?userName=ldy&userPassword=123
     * </p>
     * @return
     */
    @RequestMapping(value = "/requestParamBind")
    public ModelAndView requestParamBind(@RequestParam("userName") String userName, @RequestParam("userPassword") String userPassword, @RequestParam(value = "http://www.mamicode.com/userEmail", required = false) String userEmail) {
        ModelAndView mv = new ModelAndView();
        System.out.println("使用@RequestParam绑定请求参数中的userName、userPassword、userEmail");
        System.out.println("userName:" + userName);
        System.out.println("userPassword:" + userPassword);
        mv.setViewName("/success");
        mv.addObject("message", "userName/userPassword" + userName + "/" + userPassword);
        return mv;
    }

    /**
     * <p>@PathVariable->绑定URL中的变量。</p>
     * <p>示例:
     * value="http://www.mamicode.com/user/**/{userId},匹配/user/aa/123、/user/aa/bb/abc、/user/aa/bb/cc/ddd>http://localhost:8080/user/aa/123、http://localhost:8080/user/aa/bb/abc、http://localhost:8080/user/aa/bb/cc/ddd
     * </p>
     *
     * @return
     */
    @RequestMapping(value = "user/**/{userId}")
    public ModelAndView requestParamBindVariable(@PathVariable("userId") String userId) {
        ModelAndView mv = new ModelAndView();
        System.out.println("使用@PathVariable注解绑定参数userId:" + userId);
        mv.addObject("message", "绑定参数userId" + userId);
        mv.setViewName("/success");
        return mv;
    }

    /**
     * <p>使用命令/表单对象绑定</p>
     * <p>
     * 所谓命令/表单对象并不需要实现任何接口,仅是一个拥有若干个属性的POJO,SpringMvc按照:“HTTP请求参数名=命令/表单对象的属性名”的
     * 的规则,自动绑定请求请求数据,支持级联属性名,自动进行基本数据类型的转换。
     * </p>
     * <p>
     * 请求URL:http://localhost:8080/requestParamBindPojo?userName=YY&userPassword=ZZ&userLoginFlag=1&userLoginflag=1&userEmail=22@.qq.com
     * </p>
     * <p>
     * userName=YY&userPassword=ZZ&userLoginFlag=1&userLoginflag=1&userEmail=22@.qq.com->自动映射到UserInfo类型实例userInfo上
     * </p>
     *
     * @return
     */
    @RequestMapping(value = "/requestParamBindPojo")
    public ModelAndView requestParamBindPojo(UserInfo userInfo) {
        ModelAndView mv = new ModelAndView();
        System.out.println(userInfo.toString());
        mv.setViewName("/success");
        mv.addObject("message", "命令/表单对象绑定" + userInfo.toString());
        return mv;
    }

    /**
     * <p> @RequestHeader->绑定请求头参数、@CookieValue->绑定Cookie值</p>
     * <p>
     * 请求URL:http://localhost:8080/requestParamBindCookieAndHeader
     * </p>
     *
     * @return
     */
    @RequestMapping(value = "/requestParamBindCookieAndHeader")
    public ModelAndView requestParamBindCookieAndHeader(@CookieValue("JSESSIONID") String sessionId,
                                                        @RequestHeader("Accept-Language") String language) {
        ModelAndView mv = new ModelAndView();
        System.out.println("sessionid:" + sessionId);
        System.out.println("language:" + language);
        mv.setViewName("/success");
        mv.addObject("message", "sessionId" + sessionId);
        mv.addObject("message2", "language:" + language);
        return mv;
    }

    /**
     * <p> 使用Spring的Servlet API代理类/p>
     * <p>
     * Spring MVC 在org.spirngframework.web.context.request包中定义了若干个可代理的Servlet原生API,
     * 例如WebRequest和NativeWebRequest,他们也允许作为处理类的入参,通过这些代理类可以访问到请求对象的任何信息。
     * </p>
     * <p>
     * 请求URL:http://localhost:8080/requestParamBindWebRequest?user=liaody
     * </p>
     *
     * @return
     */
    @RequestMapping(value = "/requestParamBindWebRequest")
    public ModelAndView requestParamBindWebRequest(WebRequest request) {
        ModelAndView mv = new ModelAndView();
        String userName = request.getParameter("userName");
        System.out.println("通过使用Spring的Servlet API代理类访问到原生的Servlet API,获取参数userName:" + userName);
        mv.setViewName("/success");
        mv.addObject("message", "userName" + userName);
        return mv;
    }

    /**
     * <p> 使用IO对象作为入参/p>
     * <p>
     * Spring MVC允许控制器的处理方法使用java.io.InputStream/java.io.Reader及java.io.OutputStream/java.io.Writer作为方法的入参。
     * Spring MVC将获取ServletRequest的InputStream/Reader或ServletResponse的OutputStream/Writer,然后按类型匹配的方式,传递给控制器的处理方法。
     * 入参。
     * </p>
     * <p>
     * 请求URL:http://localhost:8080/requestParamBindIO
     * </p>
     *
     * @return
     */
    @RequestMapping(value = "/requestParamBindIO")
    public void requestParamBindIO(OutputStream os) throws IOException {
        Resource res = new ClassPathResource("/image.jpg");//读取类路径下的图片文件
        FileCopyUtils.copy(res.getInputStream(), os);//将图片写到输出流中
    }
}

 

Spring MVC HTTP请求数据绑定