Spring Boot设计流程 异常处理

案例1:JSP版本的列表显示

搭建工程

  1. 创建maven project (war类型)
  2. 在pom.xml中添加mvc jar包定义

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
    </parent>
    
    <properties>
        <java.version>1.7</java.version>
    </properties>
    
    <dependencies>
        <!-- ioc、自动配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- mvc、tomcat、restful -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <!-- jsp解析器 -->
        <dependency>
          <groupId>org.apache.tomcat.embed</groupId>
          <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
    
    </dependencies>
    
  3. 在src/java/resources下添加application.properties配置文件

    #server
    server.port=7777
    
  4. 在cn.xdl包下定义主启动类

    @SpringBootApplication//开启自动配置、扫描、bean定义
    public class BootApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(BootApplication.class, args);
        }
    
    }
    
  5. 在src/java/webapp下定义jsp

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8">
            <title>Insert title here</title>
        </head>
        <body>
        <div class="container">
            <h1>图书列表</h1>
            <button class="btn btn-info">新增</button>
            <table id="tb_book" class="table table-striped table-hover">
                <tr class="danger">
                    <td>序号</td>
                    <td>作者</td>
                    <td>出版社</td>
                    <td>出版时间</td>
                    <td>总页数</td>
                    <td>操作</td>
                </tr>
            </table>
            <div id="pages"></div>
        </div>
        </body>
    </html>
    

设计列表显示流程

/book-->DispatcherServlet-->HandlerMapping-->BookController-->BookDao-->ViewResolver-->/book.jsp

实现流程

BookDao

基于mybatis实现BookDao

  1. 在pom.xml中追加mybatis-spring-boot-starter、驱动包、spring-boot-starter-jdbc定义

  2. 编写Book实体类、Mapper接口BookDao

    • 在application.properties追加db参数定义
    • 编写Book.java
    • 编写BookDao.java
    • 在启动类追加@@MapperScan标记
    • 利用spring-boot-starter-test测试
  3. 编写BookController

    @Controller
    public class BookController {
    
        @Autowired
        private BookDao bookDao;
    
        @RequestMapping(value="/book",method=RequestMethod.GET)
        public ModelAndView list(){
            ModelAndView mav = new ModelAndView();
            mav.setViewName("book");
    
            List<Book> list = bookDao.findAll();
            mav.getModel().put("books", list);
            return mav;
        }
    
    }
    
  4. 在application.properties配置viewresolver

    #viewresolver
    spring.mvc.view.prefix=/WEB-INF/
    spring.mvc.view.suffix=.jsp
    
  5. 在pom.xml引入jstl定义,循环显示jsp

    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    

追加分页处理

改造BookController支持分页处理

  1. 在pom.xml引入pagehelper-spring-boot-starter

    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper-spring-boot-starter</artifactId>
      <version>1.2.3</version>
    </dependency>
    
  2. 修改BootkController代码

    @Controller
    public class BookController {
    
        @Autowired
        private BookDao bookDao;
    
        @RequestMapping(value="/book/page/{p}",method=RequestMethod.GET)
        public ModelAndView list(@PathVariable("p")int p){
            ModelAndView mav = new ModelAndView();
            mav.setViewName("book");
    
            Page page = PageHelper.startPage(p,3);
            List<Book> list = bookDao.findAll();
            int totalPage = page.getPages();
            mav.getModel().put("books", list);
            mav.getModel().put("totalPage", totalPage);
            mav.getModel().put("currentPage", p);
            return mav;
        }
    
    }
    
  3. 修改book.jsp,追加分页按钮

    <div id="pages">
        <c:forEach begin="1" end="${totalPage}" var="p">
            <c:choose>
                <c:when test="${p==currentPage}">
                <a class="btn btn-danger" href="book/page/${p}">${p}</a>
                </c:when>
                <c:otherwise>
                <a class="btn btn-warning" href="book/page/${p}">${p}</a>
                </c:otherwise>
            </c:choose>
        </c:forEach>
        页数:${currentPage}/${totalPage}
    </div>
    

过滤器Filter和Spring拦截器区别

  1. 过滤器属于Servlet规范,受Servlet容器调用;拦截器属于Spring规范,受Spring容器调用
  2. 过滤器可以拦截所有请求;拦截器只能拦截器Action请求;
  3. 过滤器是在Servlet之前拦截;拦截器在action之前、之后、请求响应输出之前;
  4. 过滤器可以访问Servlet API对象;拦截器不仅能访问Servlet对象,还可以访问ModelAndView等Spring框架对象。
  5. 拦截器在Spring容器中可以使用IOC、AOP功能;但是Filter过滤器不行。
  6. 过滤器采用回调机制;拦截器采用反射机制对象调用

SpringBoot MVC异常处理

全局处理

  1. 原理

    • 自动配置ErrorMvcAutoConfiguration组件,启动时将BasicErrorController加载,提供了/error请求的处理。
    • 其他Controller执行中抛出异常,SpringBoot 底层会重定向/error请求,显示error错误页面。
  2. 自定义ErrorController

    • 编写Controller,实现ErrorController接口
    • 编写异常处理方法,建议@RequestMapping采用/error

      @Controller
      public class MyErrorController implements ErrorController{
      
          @Override
          public String getErrorPath() {
              // TODO Auto-generated method stub
              return "/myerror";
          }
      
          @RequestMapping("/myerror")
          public ModelAndView handleException(Exception ex){
              ModelAndView mav = new ModelAndView();
              mav.setViewName("500");//500.jsp
              mav.getModel().put("ex", ex);
              return mav;
          }
      
      }
      

      提示:如果请求不是/error,需要在application.properties定义下

      server.error.path=/myerror
      

      提示:自定义了ErrorController后,内置的BasicErrorController将失效。

局部处理

在Controller组件中追加处理方法,然后方法前添加@ExceptionHandler标记。

@ExceptionHandler
public ModelAndView handlerException(Exception e){
    ModelAndView mav = new ModelAndView();
    mav.setViewName("error1");//error1.jsp
    return mav;
}

提示:视图名不要用error,和底层视图名冲突。

如果所有Controller需要处理,也可以将@ExceptionHandler方法封装起来,然后追加@ControllerAdvice标记

@ControllerAdvice//等价于所有Controller继承MyError
public class MyError {

    @ExceptionHandler
    public ModelAndView handlerException(Exception e){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("error1");//error1.jsp
        return mav;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值