. 映射请求参数&请求参数,前面提到PathVariable映射URL绑定的占位符可以携带参数,但是并非真正意义上的请求参数。
请求处理方法签名
. SpringMVC通过分析处理方法的签名,将HTTP请求信息绑定到处理方法的相应入参中。
. SpringMVC对控制器处理方法签名的限制是宽松的,几乎可以按喜欢的任何形式对方法进行签名。
. 必要时可以对方法和方法入参标注相应的注解(@RequestParam,@PathVariable,@RequestHeader),SpringMVC 框架会将HTTP请求的信息绑定到对应的方法入参中,并根据方法的返回值类型做出后续的处理。
index.jsp
<a href="springmvc/testRequestParam?username=少校&age=20">Test RequestParam</a>
SpringMVCTest.java
/*
* @RequestParam 来映射请求参数
* value 值即为请求参数的参数名
* required 改参数是否必须,默认值为TRUE(必须)
* defaultValue 请求参数的默认值
*/
@RequestMapping(value="/testRequestParam")
public String testRequestParame(@RequestParam(value="username") String un,@RequestParam(value="age") Integer age) {
//也可写成(@RequestParam value="age",required=false, defaultValue="20") int age)
//但是这样写,出现的问题是,当age是空值是,会出现错误。
System.out.println("RequestParam username: " + un +" age: " + age);
return SUCCESS;
}
这些进行一切顺利,但是当我把href="springmvc/testRequestParam?username=少校&age=20"时,将shaoxiao写成“少校”有趣的一幕出现了:
报错显示:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
在查阅资料得知改成:
<a href="springmvc/testRequestParam?username=encodeURI(少校)&age=20">Test RequestParam</a>
URL编码与两次encodeURI
当使用地址栏提交查询参数时,如果不编码,非英文字符会按照操作系统的字符集进行编码提交到服务器,服务器会按照配置的字符集进行解码,所以如果两者不一致就会导致乱码。
encodeURI函数采用UTF-8对URL进行编码,所以如果服务器在进行解码时使用的是其他的编码方式就会出现乱码,默认的服务器配置的解码字符集都不是UTF-8,所以大部分情况下地址栏提交中文查询参数时会产生乱码;针对这种情况,可以连续使用两次encodeURI在客户端(主要指浏览器)对非英文字符进行编码,然后在服务端使用java.net.URLDecoder(String."UTF-8")解码,即可得到正确的中文。