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>
 * 通过注解绑定:
 * [email protected]>绑定请求参数
 * [email protected]>绑定URL中的变量
 * [email protected]>绑定请求头参数
 * [email protected]>绑定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 = "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="/user/**\/{userId},匹配/user/aa/123、/user/aa/bb/abc、/user/aa/bb/cc/ddd
     * </p>
     * <p>
     * 请求URL: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&[email protected]
     * </p>
     * <p>
     * userName=YY&userPassword=ZZ&userLoginFlag=1&userLoginflag=1&[email protected]>自动映射到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);//将图片写到输出流中
    }
}
时间: 2024-12-25 16:58:49

Spring MVC HTTP请求数据绑定的相关文章

spring mvc get请求也可以接受DTO对象

spring mvc get请求也可以接受DTO对象,比如:url上面你还是将参数&符号连接起来,并自动封装进一个DTO对象里. 只有@RequestBody注解spring mvc才会从http body里去拿数据. 默认不填注解的参数都会从url上面去拿. @ApiOperation(value = "查询卡券详情接口", consumes = "application/x-www-form-urlencoded") @RequestMapping(va

研究 Spring MVC 将请求分发到 Spring 依赖注入的类实例

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 一上午时间,碰了 N 个钉子,不断地把钉子拨掉,记录一下选择的工具和方法: 1.首先 Spring Mvc 框架的下载,那么有三个包是必不可少的:

Spring Mvc——处理请求过程

1.概述 下面这张图是Spring mvc处理请求的整体流程,其中Front controller指的是DispatcherServlet类. 1.客户端所有的请求都会发送到DispatcherServlet,由DispacherServlet处理. 2.DispacherServlet将请求分发到不同的Controller类,由Controller类去处理对应的请求. 3.Controller类将对应的请求处理完后,将处理后对应的model或者视图信息给将DispatcherServlet类.

Spring MVC http请求地址映射(三)

Spring MVC框架通过扫描将带有@Controller的类中的@RequestMapping的方法进行映射,然后调用映射的方法处理请求,这个分发过程默认是由DispaterServlet处理的. http请求映射原理 Spring MVC进行映射的依据 通过URL限定:URL表达式 Spring MVC的地址映射支持标准的URL,同时默认支持是ant风格的URL.列如: URL 说明 /account/*/create 匹配/account/aaa/create./account/bbb/

spring mvc get请求中文乱码问题

使用Spring MVC进行get请求时发现get请求带上中文参数,后台收到的是乱码,即使加了encoding filter也没用. 原因是,encoding filter 是针对post请求的,tomcat对get请求的处理方式不一样,需要修改tomcat 的server.xml配置文件 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirec

跟踪spring MVC的请求

当我们点击一个超链接时,spring MVC在后台都做了些什么呢,今天就来看看后台都干了啥 首先需要在web.xml里配置一下: 上面的配置就是spring的核心控制器,所有根路径下的请求都会被拦截进行处理.当我们点击一个超链接时,首先会被这个过滤器拦截到,然后就是去查找哪些类被配置为Controller控制器了. 上面就是一个注解方式的定义控制器的.这个控制器会处理根路径下的所有匹配的请求,哪些是相匹配的请求呢.就以你访问网站首页为例 这个initIndex方法会处理{"/", &q

spring mvc ajax请求

jar包中增加 jackson-annotations-2.5.0.jar jackson-core-2.5.0.jar jackson-databind-2.5.0.jar springmvx.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="

Spring MVC 中请求返回之后的页面没法加载css、js等静态文件

1.是否被拦截,这个在Web.xml配置中servlet拦截是“/”,如果是则 a.使用spring MVC 的静态资源文件 <!-- 静态文件访问,主要是针对DispatcherServlet的拦截是/的--> <mvc:annotation-driven /> <mvc:resources location="/image/" mapping="/image/**"/> <mvc:resources location=&

Spring MVC HTTP请求地址映射

package com.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annota