三种数据绑定
传统方式传参:使用@RequestParam(“courseId”)进行绑定,当需要指定处理的请求方式时,加上method属性值
restful风格传参:使用@PathVariable(“courseId”)进行绑定,同样需要在RequestMapping的value属性中进行声明,value=“/view2/{courseId}”
HttpRequest
@RequestMapping注解标注在方法上时,还有method属性,用来指定只处理get请求类型还是post类型.不设置的话则两种请求类型都会处理.
传统方式
@RequestParam(“courseId”) 绑定的参数的就是courseId
localhost:8080/courses/view?courseld=123
浏览器输入这个地址 就可以获取courseId=123的值 传到后端controller中
Model
Model是Spring MVC中特有的类.
Model类有addAttribute(Object obj)方法,用来把对象保存在Model对象之中,最后可以在返回的页面中用el表示获取值
也可以使用map
//本方法将处理 只负责GET的请求 /courses/view?courseId=123
@RequestMapping(value = "/view",method = RequestMethod.GET)
public String viewCourse(@RequestParam("courseId") Integer courseId, Model model){
log.debug("In viewCourse,courseId={}",courseId);
Course course = courseService.getCoursebyId(courseId);
model.addAttribute(course);
//返回要返回到的页面名称就行 因为配置文件 以及配置了前缀和后缀
return "course_overview";
}
restful风格传参:
使用@PathVariable(“courseId”)进行绑定,
在浏览器输入:localhost:8080/courses/view2/345
这里就用的Map
map.put("course",course);
“course”是变成了变量名传给前端
// /courses/view2/{courseId}
@RequestMapping(value = "/view2",method = RequestMethod.GET)
public String viewCourse2(@PathVariable("courseId") Integer courseId, Map<String,Object> map){
log.debug("In viewCourse2,courseId={}",courseId);
Course course = courseService.getCoursebyId(courseId);
map.put("course",course);
//返回要返回到的页面名称就行 因为配置文件 以及配置了前缀和后缀
return "course_overview";
}
Controller方法的两种表现形式,对应的是Model的不同表现形式,最后都会被Spring转换成ModelAndView.
HttpServletRequest
request.setAttribute("course",course);
就和servlet一样
不过在pom需要一个jar包
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency>
// /courses/view3?courseId=456 形式的URL
@RequestMapping(value = "/view3",method = RequestMethod.GET)
public String viewCoursee3(HttpServletRequest request){
Integer courseId=Integer.valueOf(request.getParameter("courseId"));
log.debug("In viewCourse2,courseId={}",courseId);
Course course = courseService.getCoursebyId(courseId);
request.setAttribute("course",course);
//返回要返回到的页面名称就行 因为配置文件 以及配置了前缀和后缀
return "course_overview";
}
binding
以前servlet重定向一大串代码
在Spring MVC提供了非常简便的方式实现请求重定向与转发的操作,
直接在Controller的方法中返回字符串即可.
请求重定向:return "redirect:url"
请求转发:return "forward:url"
@RequestMapping("/admin")
public String test(){
return "redirect:/admin/login";
}
MVC文件上传
单文件上传
MultipartFile接口作为方法的参数
需要一个pom.xml
MultipartFile中提供了getName()、getSize()、getByte() getContentType()、isEmpty()、getInputStream()、getOriginalFilename()方法来访问文件.
getOriginalFilename()方法是获取最初文件名,即本地文件名.
Controller方法中使用FileUtils下的copyInputStreamToFile(InputStream in,File file)方法来完成文件的拷贝
第一个参数是文件拷贝源的输入流,直接使用MultipartFile下的getInputStream()方法
第二个参数是文件将要保存的位置.
FileUtils这个方法需要使用这个jar包
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
@RequestMapping(value = "doUpload",method = RequestMethod.GET)
public String doUploadFile(@RequestParam("file")MultipartFile file) throws IOException {
if(!file.isEmpty()){
log.debug("Process file:{}",file.getOriginalFilename());//getOriginalFilename()方法是获取最初文件名,即本地文件名.
FileUtils.copyInputStreamToFile(file.getInputStream(),new File("c:\\binglian\\file"+System.currentTimeMillis()+file.getOriginalFilename()));
}
return "success";
}