Java Web后端技术 (下) - 9. SpringMVC进阶

xmind转md真没法看~
SpringMVC进阶

ajax异步交互

Springmvc默认用MappingJackson2HttpMessageConverter对json数据进行转换,需要加入jackson的包;同时使用 <mvc:annotation-driven />

  • com.fasterxml.jackson.core jackson-databind 2.9.8 com.fasterxml.jackson.core jackson-core 2.9.8 com.fasterxml.jackson.core jackson-annotations 2.9.0

@RequestBody

  • 该注解用于Controller的方法的形参声明,当使用ajax提交并指定contentType为json形式时,通过HttpMessageConverter接口转换为对应的POJO对象。

  • ajax.jsp

<%-- ajax异步交互   --%>
<button id="btn1">ajax异步提交</button>

<script>
    $("#btn1").click(function () {
        let url = '${pageContext.request.contextPath}/user/ajaxRequest';
        let data = '[{"id":1, "username":"张三"}, {"id":2, "username":"李四"}]';

        $.ajax({
            type:'POST',
            url:url,
            data:data,
            contentType:'application/json;charset=utf-8',
            success:function (resp) {
                alert(resp);
            }
        })
    })
</script>
  • UserController.java

    • /*
      ajax异步交互
      */
      @RequestMapping("/ajaxRequest")
      public void ajaxRequest(@RequestBody List list){
      System.out.println(list);
      }

@ResponseBody

  • 该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json, xml等,通过Response响应给客户端。

  • ajax.jsp修改

    • success:function (resp) {
      //把response转换为JSON格式打印到前端控制台
      alert(JSON.stringify(resp))
      }
  • UserController.java

    • @RequestMapping("/ajaxRequest")
      @ResponseBody
      public List ajaxRequest(@RequestBody List list){
      System.out.println(list);
      return list;
      }

RESTful

What is?

  • Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件
  • Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
    GET:读取(Read)
    POST:新建(Create)
    PUT:更新(Update)
    DELETE:删除(Delete)

代码实现

  • @PathVariable

    • 用来接收RESTful风格请求地址中占位符的值
  • @RestController

    • RESTful风格多用于前后端分离项目开发,前端通过ajax与服务器进行异步交互,我们处理器通常返回的是json数据所以使用@RestController来替代@Controller和@ResponseBody两个注解。
  • RestController.java

    • @RestController //组合注解:组合@Controller + @ResponseBody
      @RequestMapping("/restful")
      public class RestfulController {
      //根据id进行查询
      @GetMapping("/user/{id}")
      public String findById(@PathVariable Integer id){
      return “findById:” + id;
      }

    //新增方法
    @PostMapping("/user")
    public String post(){
    return “post”;
    }

    //更新方法
    @PutMapping("/user")
    public String put(){
    return “put”;
    }

    //删除方法
    @DeleteMapping("/user/{id}")
    public String delete(@PathVariable Integer id){
    return “delete” + id;
    }

文件上传

文件上传三要素

  • 表单项 type=“file”
  • 表单的提交方式 method=“POST”
  • 表单的enctype属性是多部分表单形式 enctype=“multipart/form-data"

文件上传原理

  • 当form表单修改为多部分表单时,request.getParameter()将失效。

  • 当form表单的enctype取值为 application/x-www-form-urlencoded 时,form表单的正文内容格式是: name=value&name=value

  • 当form表单的enctype取值为 mutilpart/form-data 时,请求正文内容就变成多部分形式:

单文件上传

    1. 导入fileupload和io坐标到pom.xml
    •    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.3</version>
      
      commons-io commons-io 2.6
    1. 配置文件上传解析器到spring-mvc.xml
    1. 编写文件上传代码
    • 前端

      • 编写fileupload.jsp,在webapp目录下

        • <%–编写文件上传表单,记住文件上传三要素–%>
    名称:
    文件:
    • 后端

      • 新建FileUploadController.java,在controller目录下

        • @Controller
          public class FileUploadController {
          /*
          单文件上传
          */
          @RequestMapping("/fileupload")
          public String fileUpload(String username, MultipartFile fileLoad) throws IOException {
          //获取表单的提交参数,完成文件上传
          System.out.println(username);

      //获取原始的文件上传名
      String originalFilename = fileLoad.getOriginalFilename();
      fileLoad.transferTo(new File(“E:/IdeaProjects/upload/” + originalFilename));
      return “success”;
      }
      }

多文件上传

    1. 导入fileupload和io坐标到pom.xml
    • 同单文件
    1. 配置文件上传解析器到spring-mvc.xml
    • 同单文件
    1. 编写文件上传代码
    • 前端

      • 编写fileupload.jsp,在webapp目录下

        • <%–编写多文件上传表单–%>
    名称:
    文件1:
    文件2:
    • 后端

      • 新建FileUploadController.java,在controller目录下

        • @Controller
          public class FileUploadController {
          /*
          多文件上传
          */
          @RequestMapping("/filesupload")
          public String filesUpload(String username, HttpServletResponse response, MultipartFile[] fileLoad) throws IOException {
          //获取表单的提交参数,完成文件上传
          System.out.println(username);
          //获取原始的文件上传名
          for (MultipartFile multipartFile : fileLoad) {
          String originalFilename = multipartFile.getOriginalFilename();
          multipartFile.transferTo(new File(“E:/IdeaProjects/upload/” + originalFilename));
          System.out.println(originalFilename);
          }
          return “success”;
          }
          }

异常处理

异常处理的思路

  • 系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理

自定义异常处理器

    1. 创建异常处理器类实现HandlerExceptionResolver
    • @Component
      public class GlobalExceptionResolver implements HandlerExceptionResolver {
      //Exception e:实际抛出的异常对象
      @Override
      public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception e) {
      //具体的异常处理,产生异常后,跳转到一个最终的异常页面
      ModelAndView modelAndView = new ModelAndView();
      modelAndView.addObject(“error”, e.getMessage());
      modelAndView.setViewName(“error”);
      return modelAndView;
      }
      }
    1. 在spring-mvc.xml配置异常处理器

    1. 编写异常页面error.jsp

    这是一个最终异常的显示页面

    ${error}

    1. 新建ExceptionController.java测试异常跳转
    • @Controller
      public class ExceptionController {

    @RequestMapping("/testException")
    public String testException(){
    int i = 1/0;
    return “success”;
    }
    }

web的处理异常机制

  • 1.编写异常页面404.jsp

    请求的页面不存在!

    1. 在web.xml中添加跳转到404的页面
    • 404 /404.jsp

拦截器interceptor

作用

  • Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。

拦截器和过滤器的区别

拦截器的方法说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值