SpringMVC 学习笔记(二)
1. 发送ajax请求
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 | 
 $(function(){
 
 $("#btn").click(function(){
 $.ajax({
 url:"user/testJson",
 contentType:"application/json;charset=UTF-8",
 data:'{"addressName":"aa","addressNum":100}',
 dataType:"json",
 type:"post",
 success:function(data){
 alert(data);
 alert(data.addressName);
 }
 });
 });
 });
 
 | 
2. 接收响应数据
json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | <dependency><groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-databind</artifactId>
 <version>2.9.0</version>
 </dependency>
 <dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-core</artifactId>
 <version>2.9.0</version>
 </dependency>
 <dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
 <artifactId>jackson-annotations</artifactId>
 <version>2.9.0</version>
 </dependency>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 
 | 
 
 
 @RequestMapping("/testJson")
 public void testJson(@RequestBody Address address) {
 System.out.println(address);
 }
 
 | 
- 使用@ResponseBody注解把JavaBean对象转换成json字符串,直接响应
| 12
 3
 4
 5
 6
 
 | @RequestMapping("/testJson")public @ResponseBody Address testJson(@RequestBody Address address) {
 System.out.println(address);
 address.setAddressName("上海");
 return address;
 }
 
 | 
3.SpringMVC实现文件上传
前提:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | <dependency><groupId>commons-fileupload</groupId>
 <artifactId>commons-fileupload</artifactId>
 <version>1.3.1</version>
 </dependency>
 <dependency>
 <groupId>commons-io</groupId>
 <artifactId>commons-io</artifactId>
 <version>2.4</version>
 </dependency>
 
 | 
传统的文件上传
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 
 | 
 
 
 @RequestMapping(value="/fileupload")
 public String fileupload(HttpServletRequest request) throws Exception {
 
 String path = request.getSession().getServletContext().getRealPath("/uploads");
 
 File file = new File(path);
 
 if(!file.exists()) {
 file.mkdirs();
 }
 
 DiskFileItemFactory factory = new DiskFileItemFactory();
 ServletFileUpload fileUpload = new ServletFileUpload(factory);
 
 List<FileItem> list = fileUpload.parseRequest(request);
 
 for (FileItem fileItem : list) {
 
 if(fileItem.isFormField()) {
 
 }else {
 
 
 String filename = fileItem.getName();
 
 fileItem.write(new File(file, filename));
 
 fileItem.delete();
 }
 }
 return "success";
 }
 
 | 
SpringMVC的文件上传
- 配置文件解析器对象 | 12
 3
 4
 5
 
 | <bean id="multipartResolver"
 class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 <property name="maxUploadSize" value="10485760"/>
 </bean>
 
 |  
 
- 代码 | 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | 
 
 
 
 
 
 @RequestMapping(value="/fileupload2")
 public String fileupload2(HttpServletRequest request,MultipartFile upload) throws
 Exception {
 System.out.println("SpringMVC方式的文件上传...");
 
 String path = request.getSession().getServletContext().getRealPath("/uploads");
 
 File file = new File(path);
 
 if(!file.exists()) {
 file.mkdirs();
 }
 
 String filename = upload.getOriginalFilename();
 String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
 
 filename = uuid+"_"+filename;
 
 upload.transferTo(new File(file,filename));
 return "success";
 }
 
 |  
 
SpringMVC跨服务器文件上传
导入需要的jar包
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | <dependency><groupId>com.sun.jersey</groupId>
 <artifactId>jersey-core</artifactId>
 <version>1.18.1</version>
 </dependency>
 <dependency>
 <groupId>com.sun.jersey</groupId>
 <artifactId>jersey-client</artifactId>
 <version>1.18.1</version>
 </dependency>
 
 | 
文件上传的JSP页面
| 12
 3
 4
 5
 
 | <h3>跨服务器的文件上传</h3><form action="user/fileupload3" method="post" enctype="multipart/form-data">
 选择文件:<input type="file" name="upload"/><br/>
 <input type="submit" value="上传文件"/>
 </form>
 
 | 
编写控制器
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 | 
 
 
 
 
 
 @RequestMapping(value="/fileupload3")
 public String fileupload3(MultipartFile upload) throws Exception {
 System.out.println("SpringMVC跨服务器方式的文件上传...");
 
 String path = "http://localhost:9090/day02_springmvc5_02image/uploads/";
 
 String filename = upload.getOriginalFilename();
 String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
 
 filename = uuid+"_"+filename;
 
 
 Client client = Client.create();
 
 WebResource webResource = client.resource(path+filename);
 
 webResource.put(upload.getBytes());
 return "success";
 }
 
 | 
4.SpringMVC异常处理
异常处理思路:
    Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进
    行异常的处理。
自定义异常类:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | package cn.itcast.exception;public class SysException extends Exception{
 private static final long serialVersionUID = 4055945147128016300L;
 
 private String message;
 public String getMessage() {
 return message;
 }
 public void setMessage(String message) {
 this.message = message;
 }
 public SysException(String message) {
 this.message = message;
 }
 }
 
 | 
配置异常处理器:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | 
 
 
 public class SysExceptionResolver implements HandlerExceptionResolver{
 
 
 
 public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {
 ex.printStackTrace();
 SysException e = null;
 
 if(ex instanceof SysException) {
 e = (SysException) ex;
 }else {
 e = new SysException("请联系管理员");
 }
 ModelAndView mv = new ModelAndView();
 
 mv.addObject("message", e.getMessage());
 
 mv.setViewName("error");
 return mv;
 }
 }
 
 | 
配置异常处理器:
| 12
 
 | <bean id="sysExceptionResolver" class="cn.itcast.exception.SysExceptionResolver"/>
 
 | 
5.SpringMVC拦截器
- SpringMVC框架中的拦截器用于对处理器进行预处理和后处理的技术。
- 可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链
 中的拦截器会按着定义的顺序执行。
- 拦截器和过滤器的功能比较类似,有区别
- 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。
- 拦截器是SpringMVC框架独有的。
- 过滤器配置了/*,可以拦截任何资源。
- 拦截器只会对控制器中的方法进行拦截。
 
- 拦截器也是AOP思想的一种实现方式
- 想要自定义拦截器,需要实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter这个类就可以自定义实现其方法。
HandlerInterceptor接口的方法:
- preHandle方法是controller方法执行前拦截的方法
- 可以使用request或者response跳转到指定的页面
- return true放行,执行下一个拦截器,如果没有拦截器,执行controller中的方法。
- return false不放行,不会执行controller中的方法。
 
- postHandle是controller方法执行后执行的方法,在JSP视图执行前。
- 可以使用request或者response跳转到指定的页面
- 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
 
- postHandle方法是在JSP执行后执行
- request或者response不能再跳转页面了
 
自定义拦截器
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | 
 
 public class MyInterceptor1 implements HandlerInterceptor{
 
 
 
 
 
 
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
 Object handler)
 throws Exception {
 System.out.println("拦截器执行了...");
 return true;
 }
 }
 
 | 
配置拦截器
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | <mvc:interceptors>
 <mvc:interceptor>
 
 <mvc:mapping path="/user/*"/>
 
 
 
 
 <bean class="cn.itcast.demo1.MyInterceptor1"/>
 </mvc:interceptor>
 </mvc:interceptors>
 
 |