springmvc 常用的绑定参数用法

当请求路径和方法匹配之后,请求便进入方法体里面进行处理业务,在这之前,springmvc会做一些参数绑定,格式化,已经校验。springmvc在参数绑定方面,给我们带来巨大便利,现在我们来看看支持哪些参数类型

用原生的servlet api做为参数

 @RequestMapping("/mvc1")
    public void mvc1(HttpServletRequest request,HttpServletResponse response,HttpSession session) {

        ServletContext context = request.getServletContext();
    }

springmvc还专门为HttpServletRequest 封装了俩个类,这俩个类也可以作为参数传进来,

@RequestMapping("/mvc2")
public void mvc2(WebRequest webRequest,NativeWebRequest nativeWebRequest) {

}

利用java.util.Locale获取本地化信息,Locale本地化信息由LocaleResolver / LocaleContextResolver配置

@RequestMapping("/mvc3")
public void mvc3(Locale local) {
        System.out.println("首都:" + local.getCountry() + " 国语" + local.getLanguage() + " ");
}

利用java.util.TimeZone解析时区,由LocaleContextResolver配置

@RequestMapping("/mvc4")
public void mvc4(TimeZone zone) {

}

用输入流作为参数,可处理上传文件文件

@RequestMapping("/mvc5")
    public void mvc5(InputStream is ,Reader reader) throws IOException{

        FileUtils.copyInputStreamToFile(is, new File("D://color.png"));   //将输入流保存成文件

    }

用输出流做参数,可处理下载文件

@RequestMapping("/mvc6")
    public void mvc6(OutputStream os ,Writer  write,InputStream is) throws IOException{     
        os.write(FileCopyUtils.copyToByteArray(is));   //将输入流写到客户端,可用于下载文件

    }

利用org.springframework.http.HttpMethod读取请求方法

@RequestMapping(“/mvc7”)
public void mvc7(HttpMethod reqMethod) throws IOException{

    System.out.println(reqMethod.name());

}

利用java.security.Principal 获取当前登录用户的一些信息

    @RequestMapping("/mvc8")
    public void mvc8(Principal principal) throws IOException{

        System.out.println(principal.getName());

    }

利用@PathVariable获取请求变量

@RequestMapping("/mvc9/{id}")
    public void mvc9(@PathVariable Long id) throws IOException{

        System.out.println(id);

    }

利用@MatrixVariable 获取矩阵请求变量,需要在配置文件将矩阵请求打开,请求类似/cars;color=red;year=2012

@RequestMapping("/mvc10/")
    public void mvc10(@MatrixVariable Long id) throws IOException{

        System.out.println(id);

    }

//在dispatch-content.xml配置打开允许矩阵请求格式
<mvc:annotation-driven enable-matrix-variables="true">
</mvc:annotation-driven>

利用@RequestParam来绑定请求参数,不能绑定content-type为application/xml和application/json的媒体类型

/**
     * 默认required为true,当为true时,如果请求参数没有name,则报错
     * @param name
     * @throws IOException
     */
    @RequestMapping("/mvc11/")
    public void mvc11(@RequestParam(value = "name", required = false ,defaultValue = "我是谁") String name) throws IOException{


    }

利用@RequestPart除来绑定multipart/form-data

    @RequestMapping("/mvc21")
    public void mvc21(@RequestPart("file") MultipartFile file) {

    }

利用@CookieValue除来绑定cookie值

@RequestMapping("/mvc22")
public void  mvc22(@CookieValue("JSESSIONID") String sessionId) {

    }

利用@RequestHeader获取头部信息

@RequestMapping("/mvc12/")
    public void mvc12(@RequestHeader("Accept-Encoding") String encoding,
            @RequestHeader("Keep-Alive") long keepAlive) {
        //...
    }

利用@RequestBody来绑定类似application/json,application/xml的媒体类型请求,目前测试的springmvc的版本是4.1.4,直接加入jackson-annotations-2.7.3.jar,jackson-core-2.7.3.jar,jackson-databind-2.7.3.jar,jackson-dataformat-xml-2.7.3.jar,前端在请求的时候,需要加入需要的content-type

@RequestMapping(value = "/mvc13", method = RequestMethod.POST, consumes="application/json")
    public void mvc13(HttpServletRequest req ,@RequestBody(required = false) List<Task> task) {

    }


    @RequestMapping(value = "/mvc14", method = RequestMethod.POST, consumes="application/xml")
    public void mvc14(HttpServletRequest req ,@RequestBody(required = false) List<Task> task) {


    }

前端这里利用jquery的ajax

function getXmlStr(){

 var xml = "<?xml version = '1.0'?>" + 
            "<ArrayList>" + 
            "   <item>" + 
            "       <taskName>taskName</taskName>" + 
            "       <createTime>1460195925557</createTime>" + 
            "       <taskDetail>taskDetail</taskDetail>" + 
            "   </item>" + 
            "   <item>" + 
            "       <taskName>taskName</taskName>" + 
            "       <createTime>1460195925557</createTime>" + 
            "       <taskDetail>taskDetail</taskDetail>" + 
            "   </item>" + 
            "</ArrayList>" ;

 return xml;

}

function getJsonStr(){

    var customerArray = new Array();
    customerArray.push({taskName: "任务1"});
    customerArray.push({taskName: "任务2"});
    var jsonStr = JSON.stringify(customerArray);

    return jsonStr;

}

//xml的请求,后台直接直接用list<Task>接收

$.ajax({       
        url : "/whats/task/mvcTest10",
        contentType : "application/xml",
        data : getXmlStr(),
        type : "post",
        success : function(data){

        },
        error : function(error){

        }
    });

//json请求,后台直接直接用list<Task>接收
$.ajax({       
        url : "/whats/task/mvcTest10",
        contentType : "application/xml",
        data : getJsonStr(),
        type : "post",
        success : function(data){

        },
        error : function(error){

        }
    });

@requestBody在实现上是利用HttpMessageConverters实现,HttpMessageConverter默认注册了了以下

ByteArrayHttpMessageConverter 转化字节.
StringHttpMessageConverter 转化字符串
FormHttpMessageConverter 转化数据到MultiValueMap

<mvc:annotation-driven>
     <mvc:message-converters>
      <bean                 class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
                <bean                   class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter" />
     </mvc:message-converters>
</mvc:annotation-driven>

但这里其实,我们不需要注册,因为当我们在配置文件配置spingmvc会检测com.fasterxml.jackson.databind.ObjectMapper和com.fasterxml.jackson.dataformat.xml.XmlMapper类是否存在,存在则自动注册MappingJackson2HttpMessageConverter和MappingJackson2XmlHttpMessageConverter。所以我们只需要按常规配置就可以了

<mvc:annotation-driven />

springmvc的参数默认编码是iso-8859-1消息转化器的作用还能帮我们解决乱码问题

<mvc:annotation-driven>
         <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json;charset=UTF-8</value>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/xml;charset=UTF-8</value>
                    </list>
                </property>
            </bean>
         </mvc:message-converters>
    </mvc:annotation-driven>

除了@RequestBody利用HttpMessageConverter处理之外,HttpEntity

@RequestMapping(value = "/mvc15", method = RequestMethod.POST, consumes="application/json")
    public void mvc15(HttpEntity<List<Task>>  task) {

        List<Task> tasks = task.getBody();

        HttpHeaders headers = task.getHeaders();

    }

利用@ModelAttribute 来将参数绑定到模型中

@RequestMapping("/mvc23")
public void  mvc23(@ModelAttribute Task task) {

}

利用java.util.Map / org.springframework.ui.Model / org.springframework.ui.ModelMap读写模型数据

/**
     * 任何请求进入方法之前,都会先进入这个方法,将task放到模型数据中
     * @return
     */
    @ModelAttribute
    public Task getTask() {
        Task task = new Task();
        task.setTaskDetail("mydetai");
        task.setTaskName("mytaskName");
        return task;
    }


    @RequestMapping("/mvc16")
    public void mvc16(ModelMap modelMap) {

        modelMap.get("task"); //获取模型数据
        modelMap.addAttribute("task", new Task()) ; //添加模型数据

    }

利用@Validated校验参数,利用org.springframework.validation.Errors / org.springframework.validation.BindingResult 获取参数校验结果

@RequestMapping("/mvc17")
public void mvc17(@Validated Task task,BindingResult  result) {

        if (result.hasErrors()) {
             //..
        }

    }

利用org.springframework.web.util.UriComponentsBuilder 这个类能用于构建和编码URI,包括支持URI模板

@RequestMapping("/mvc19")
    public void mvc19(UriComponentsBuilder  ucb) {

        UriComponents uriComponents = ucb.scheme("http").host("example.com").path("/hotels/{hotel}/bookings/{booking}").build()  
                .expand("42", "21")  
                .encode();  

        URI uri = uriComponents.toUri();  

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值