multipart文件上传
1.SpringMVC使用MultipartResolver支持文件上传*
2.这个方案需要commons-fileupload.jar的支持
3.enctype 属性可设置或返回表单内容的 MIME 类型
表单上传文件时,必须要配置
表单的enctype属性默认值为application/x-www-form-urlencoded,它表示上传的为文本
文件上传步骤:
1.pom.xml引入依赖:commons-fileupload
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency>
2.在springmvc.xml文件中配置:
<!-- 配置上传的bean --><bean id="multipartResolver" class=" org.springframework.monsMultipartResolver"><property name="maxUploadSize" value="9999999"></property><!-- 设置上传文件的最大尺寸--></bean>
3.在Controller完成上传
1.add.jsp
<form controller="user/add" method="post" enctype="multipart/form-data">姓名:<input name="name" type="text"/><br/>密码:<input name="pwd" type="password"/><br/>照片:<input name="photo" type="file"/><br/><input type="submit" value="提交"/><br/></form>
2.Controller
@RequestMapping("/add")public String add(User user,MultipartFile photo,HttpServletRequest request) {System.out.println(user);//SpringMVC会自动将普通的字段值映射到User对象//处理上传if (photo!=null && photo.getSize()>0) {String realPath = request.getServletContext().getRealPath("/upload/");File dir = new File(realPath);if (!dir.exists()) {dir.mkdirs();}//得到上传的文件名String filename = photo.getOriginalFilename();File destFile = new File(dir,filename);//上传后的文件//向上传后的文件写内容try {photo.transferTo(destFile);//上传成功user.setPhotopath("upload/"+filename);} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return "redirect:/user/list.do";//重定向到list}
@ResponseBody
从Controller得到json:当controller的方法返回一个对象(实体类对象,也可是集合对象),同时标注了@ResponseBody,jackson在后台默默将对象转化为json字符串
1.SpringMVC处理json的框架是Jackson,要引入Jackson的依赖,需要点击Artifacts将其put into WEB-INF\lib
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.10</version></dependency>
2.在springmvc.xml配置
<!-- 配置注解驱动,同时开启对json(jackson的支持)--><mvc:annotation-driven></mvc:annotation-driven>
3.写controller
@Controller@RequestMapping("/json")public class JsonController {@RequestMapping("/user")@ResponseBodypublic User getUser(){User user = new User("zs", "123");return user;}}
4.浏览器运行效果
@RequestMapping("/json2")@ResponseBody//将方法的返回值写到响应体中,当controller的方法返回一个对象(实体类对象,也可是集合对象),同时标注了@ResponseBody,jackson在后台默默将对象转化为json字符串public List<User> json2(){return Arrays.asList(new User("zs","123"),new User("ls","123456"),new User("zl","123"));}
效果
@RestController注解
如果你的控制器,只服务于JSON、XML、多媒体数据等,是REST风格,则通常使用@RestController注解。
@RestController相当于控制器中所有@RequestMapping方法,都使用了@ResponseBody注解。@RestController是一种简化写法。
@RestController = @ResponseBody + @Controller
在微服务开发中,所有的对外服务,一般都使用@RestController
@RestController@RequestMapping("/test01")public class Test01Controller {@RequestMapping("/resp")public String resp(){return "张三";}}
http://localhost:8080/0610-springmvc-001/test01/resp
张三
ModelAttribute
@ModelAttribute向model添加属性和值
@ModelAttribute注解,可以用于方法或方法参数
(一)@ModelAttribute写在方法上
1.@ModelAttribute注解方法,表明这个方法的主要目的用于添加一个或多个model属性。
2.@ModelAttribute注解的方法会在此控制器的所有@RequestMapping方法前执行,
3.一个控制器中允许存在多个@ModelAttribute注解方法。
4.如果@ModelAttribute中没有指定model的名字,则使用默认名(方法返回值类型的首字母小写其他不变)。属性名也可以显示指定
5.@ModelAttribute应用于有返回值的方法和无返回值的方法均可。
无返回值的方法,需要使用model对象显示的设置属性。
有返回值的方法,隐式设置model属性。
@Controller
@RequestMapping("/account")public class AccountController {@Autowiredprivate AccountService accountService;@ModelAttribute//model.addAttribute("account",accountService.getAccount(no));public Account get(@RequestParam String no) {return accountService.getAccount(no);}@RequestMapping("/getAccount")public String getAccount(String no){return "account";}
@Service
public class AccountService {private static Map<String, Account> allAcounts = new HashMap<String, Account>();static {allAcounts.put("001", new Account("001", 1000));allAcounts.put("002", new Account("002", 2000));allAcounts.put("003", new Account("003", 3000));allAcounts.put("004", new Account("004", 4000));allAcounts.put("005", new Account("005", 5000));}public Account getAccount(String no) {return allAcounts.get(no);}}public class Account {private String no;private int money;}<body>${account.no}:${account.money}</body>
(二)@ModelAttribute写在方法的参数上
@ModelAttribute应用于方法参数,表明这个参数的值,应该从model中获取。
如果在model中没有找到对应名称的对象,则创建一个对象并添加到model中。
如果在model中找到了对应名称的对象,这个对象的属性值应该从request请求参数中按名字
对应去匹配查找。
1
@Controller@RequestMapping("/user")public class UserController {@RequestMapping("/getUser")public String getUser(User user,Model model){model.addAttribute("user", user);return "user";}}
2
@Controller@RequestMapping("/user")public class UserController {@RequestMapping("/getUser")public String getUser(@ModelAttribute User user){return "user";}}public class User {private String name;private int age;}<body>${user.name}:${user.age}</body>