springmvc 常用的绑定参数用法

来源:互联网 发布:mac上如何卸载软件 编辑:程序博客网 时间:2024/06/05 19:26

当请求路径和方法匹配之后,请求便进入方法体里面进行处理业务,在这之前,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();      }
0 0