@RequestMapping(value = {"/param_yuansheng"})
public String get_param(HttpServletRequest request)
{ //servlet原生的方式 注意不能使用占位符方式传递参数,因为在传值时,
// 占位符参数没办法获得参数名,只能是获得之后再赋名字
//原生方式一般都不用,太麻烦
String uname= request.getParameter("username");
System.out.println(uname);
return "test_param";
}
参数名和name要一一对应
点我跳转到形参获取参数值测试方法
// 通过请求的形参来获得请求参数 形参的参数名 和控件的name名一定要对应
@RequestMapping(value = {"/param_xingcan"})
public String get_param(String username,String password)
{
System.out.println(username);
System.out.println(password);
return "test_param";
}
可以用一个map集合来接收所有的请求参数
@RequestMapping(value = {"/param_xingcan"})
public Map get_param(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam Map allparam)
{
return allparam;
}
在javaweb基础中,
获取前端页面传过来的数据是 request.getparamer(不管是get还是post请求)
String name= request.getParameter("name");
String pwd=request.getParameter("pwd");
对应的是@RequestParam注解
// /param_xingcan?username=mike&password=pwd
@RequestMapping(value = {"/param_xingcan"})
public Map get_param(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam Map allparam) {
return allparam;
}
获得request请求的setattribute参数,需要 request.getparamer,对应@RequestAttribute注解
@RequestMapping("/testrequestattribute2")
public String test_requestattribute2(HttpServletRequest request) {
request.setAttribute("msg","msg");
return "forward:/testrequestattribute3";
}
@RequestMapping("/testrequestattribute3")
@ResponseBody
public String test_requestattribute3(@RequestAttribute("msg") String msg) {
return msg;
}
发送的get请求会是这样的
http://localhost:8080/Springmvcdemo2/param_duogetongmingcanshu?uname=123&upwd=123&hobbis=b&hobbis=c&hobbis=a
发送的post请求会是这样
html页面:
多个同名参数
1.可以用string接收,会得到选中的控件的value b,a,c的字符串 中间用,号隔开
2.可以用数组接收,会得到选中控件的value的数组[b, c,a]
@RequestMapping(value = {"param_duogetongmingcanshu"})
public String get_duogetongmingcanshu1(
String uname, String hobbis, String[] hobbis2)
{System.out.println("------传递多个参数-----");
System.out.println("uname:"+uname);
System.out.println("字符串获取hobbis:"+hobbis);
System.out.println("数组获取hobbis2:"+Arrays.toString( hobbis2));
return "test_param";
}
如果要传输的数据可以写成一个类时,可以新建一个user类,类中声明这三个参数和无参构造
注意类中的属性名和我要传的参数的名字一定要一一对应
@RequestMapping(value = {"/param_class"})
public String get_params(User user, HttpServletResponse response)
{
PrintWriter out = null;
try {
out = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
out.println(user);
System.out.println(user);
return "target";
}
直接传输类
@RequestMapping("/register_check")
public String register_check(user user1)
{
System.out.println(user1);
return null;
}
当user类中有int类型的属性,会自动将该属性强转为int类型,如果可以转换,不报错。如果不能转换,比如输入了一个字符串,会报400
tomcat有提示 (阿达是我输入的字符串,没有特定意思)
Field error in object 'books' on field 'bookCounts': rejected value [阿达]; codes [typeMismatch.books.bookCounts,typeMismatch.bookCounts,typeMismatch.java.lang.Integer,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [books.bookCounts,bookCounts]; arguments []; default message [bookCounts]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Integer' for property 'bookCounts'; nested exception is java.lang.NumberFormatException: For input string: "阿达"]]
原始方式:/deleteUser?id=1
restful方式:/deleteUser/1
SpringMVC路径中的占位符常用于Restful风格中,当请求路径中将某些数据通过路径的方式传输到服务器中,就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,在通过@PathVariable注解,将占位符所表示的数据赋值给控制器方法的形参
@RequestMapping("/testRest/{id}/{username}")
public String testRest(@PathVariable("id") String id, @PathVariable("username") String username){
System.out.println("id:"+id+",username:"+username);
return "success";
}
//最终输出的内容为-->id:1,username:uanme1
测试路径中的占位符-->/testRest
如果路径中两个有参数中间夹着一个不是参数的,也是可以的
@RequestMapping("/pathvarible/{name1}/and/{name2}")
public String post(@PathVariable("name1")String name1,@PathVariable("name2") String name2)
{
return name1+name2;
}
@RequestMapping("/pathvarible/{name1}/and/{name2}")
public Map post(@PathVariable("name1")String name1, @PathVariable("name2") String name2, @RequestHeader Map header)
{
return header;
}
@RequestMapping("/testcookie") public String testcookie(@CookieValue("_ga") String _ga) { return _ga; }
只能用于post请求,get请求没有请求体
@RequestMapping("/test")
public String test(@RequestBody String body)
{
return body;
}
解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册
拦截所有请求,并交给编码过滤器处理,将请求设置为param-value中指定的编码格式
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceResponseEncoding
true
CharacterEncodingFilter
/*
SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效
@pathvarible报的错和其他的不一样。