获取前台参数:
我们以用户登录为例,用户登录涉及两个参数:
账号:loginName
密码:password
这是前台登录视图:
相应的前台源码:
<form action="login">
帐号:<input type="text" name="loginName" > <br/>
密码:<input type="text" name="password" > <br/>
<input type="submit" value="登录">
</form>
------------------------------------------------------
介绍SpringMVC最常用的3种取值方法
------------------------------------------------------
方法1:参数直接获取
ps: 函数参数名与请求参数名保持一致。
@RequestMapping("/login")
public String login(String loginName,String password){
System.out.println("方法1:参数直接获取");
System.out.println("loginName:"+loginName);
System.out.println("password:"+password);
return "loginSuccess";
}
运行结果:
方法2:对象获取
ps:建立一个对象,属性名对应请求参数名保持一致,并生成相应的getter()和setter()方法。
建立对象User:
package com.springdemo.entities;
public class User {
private String loginName;
private String password;
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
开始接收:
@RequestMapping("/login")
public String login(User u){
System.out.println("方法2:对象获取");
System.out.println("loginName:"+u.getLoginName());
System.out.println("password:"+u.getPassword());
return "loginSuccess";
}
运行结果:
方法3:@RequestParam参数绑定获取
ps:方法1的变种,但该接收参数名可以随意,通过注解@RequestParam指明即可。
请求URL为:
http://localhost:8080/springmvc/hello/101?loginName=wangwu&password=123
对于上面这个url,controller里面可以这么写:
@RequestMapping("/login")
public String login(@RequestParam("loginName") String name,@RequestParam("password") String pwd){
System.out.println("方法3:参数绑定获取");
System.out.println("loginName:"+name);
System.out.println("password:"+pwd);
return "loginSuccess";
}
方法4:@PathVariable获取请求路径中的参数
这个注解能够识别URL里面的一个模板,我们看下面的一个URL
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
上面的一个url你可以这样写:
@RequestMapping("/hello/{id}")
public String getDetails(@PathVariable(value="id") String id,
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
.......
}
向前台传值(除了使用ModelAndView方式外。还可以使用Map、Model和ModelMap的方式):
Java代码
1.使用Map、Model和ModelMap的方式
@RequestMapping("/test")
public String test(Map<String,Object> map,Model model,ModelMap modelMap,HttpServletRequest request){
//1.放在map里
map.put("names", Arrays.asList("caoyc","zhh","cjx"));
//2.放在model里 建议使用
model.addAttribute("time", new Date());
//3.放在request里
request.setAttribute("request", "requestValue");
//4.放在modelMap中
modelMap.addAttribute("city", "ChengDu");
modelMap.put("gender", "male");
return "hello";
}
JSP写法:
time:${requestScope.time}
names:${requestScope.names }
city:${requestScope.city }
gender:${requestScope.gender }
request:${requestScope.request}
2.使用ModelAndView的方式:
@RequestMapping(value="/test2.do",method = RequestMethod.POST)
public ModelAndView checknameIsExist2(@RequestParam("sid") String sid,Model model,HttpServletRequest request) {
ModelAndView mav = new ModelAndView();
mav.addObject("ModelAndView", "ModelAndViewValue");
//设置要跳转的页面,与返回值时String时返回success类似,以下跳转到/student/studentList.jsp
mav.setViewName("/student/studentList");
return mav;
}
说明:使用ModelAndView,可以直接使用AddObject来传递数据,并且数据㐓使用EL表达式在前台页面处理。使用setViewName("/student/studentList");来设置页面跳转路径。
借用一篇文章:
springMVC的@RequestParam注解和@PathVariable注解的区别
@RequestParam注解和@PathVariable注解的区别,从字面上可以看出前者是获取请求里边携带的参数;后者是获取请求路径里边的变量参数。
(例如:127.0.0.1/user/{userId}?userName=zhangshan,userId是路径上的变量,userName才是请求参数信息)
1.@RequestParam注解
@RequestParam有三个参数:
value:参数名;
required:是否必需,默认为true,表示请求参数中必须包含该参数,如果不包含抛出异常。
defaultValue:默认参数值,如果设置了该值自动将required设置为false,如果参数中没有包含该参数则使用默认值。
示例:@RequestParam(value = "userId", required = false, defaultValue = "1")
2.@PathVariable注解
当使用@RequestMapping URI占位符映射时,Url中可以通过一个或多个{xxxx}占位符映射,通过@PathVariable可以绑定占位符参数到方法参数中。
例如:@PathVariable("userId") Long userId,@PathVariable("userName") String userName
(注:Long类型可以根据需求自己改变String或int,spring会自动做转换)
@RequestMapping(“/user/{userId}/{userName}/query")
请求URL:http://localhost/user/8/张山/query
@PathVariable小误区:
在有些参考资料中说,如果定义的参数名和占位符中的名称是相同的,则可以将 @PathVariable(xxxx) 简写为:@PathVariable,这其实是错误的!
因为在正常编译时,Java类反射对象是不包含方法的入参名称的,如果编译时将debug打开(javac –debug=no),方法的入参名称会记录到类中。
在Eclipse中可以这样设置(项目属性Java Compiler):