15.Spring JSP版本显示 + 过滤器Filter和Spring拦截器区别 + MVC异常处理

案例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
    评论
Spring Boot使用“习惯优于配置”的理念让我们的项目快速运行起来,我们可以不用或者只需要很少的配置就能创建一个独立运行、准生产级别的基于Spring框架的项目。我们不禁要问,这么一个优秀的框架,是不是在企业开发中就已经足够了,如果是,那么为什么像BAT这些大公司还要研发自己的交易框架,当然这里面除了核心技术之外,还有两个比较重要的原因:第一:像SpringSpring Boot这些开源框架固然很优秀,但却不满足这些大公司对框架的功能要求,如spring scheduler就没有分布式调度能力,阿里研发了自己的tbschedule,以及后来的schedulerx;第二:开源框架可以解决具体的领域问题,比如持久化框架Mybatis,RPC框架Dubbo,但是面对业务流程的开发却不是它的强项,以此就诞生了SSM,以及后来的Spring MVC。放眼整个java开源世界,不管是功能问题还是业务流程开发问题都有对应框架和组件能满足我们的需求,只要我们的视野足够开阔,能有效的去整合开源组件,足以应付日常的开发。当然我们很难写出像SpringSpring Boot、Mybatis这些优秀的框架,但是我们可以在这个基础之上,进行整合,甚至二次开发,形成公司自己的功能组件或者交易开发框架。不客气的说,开源框架的底层少不了spring的身影,那么可以肯定在Spring Boot推出以后,开源框架势必会以Spring Boot作为底层平台进行二次改造,这是趋势,也是必然。本课程顺应潮流,以Spring Boot作为基础平台,充分发挥其特性,抽象业务流程,整合开源组件,降低开发难度,打造出一个功能强大的交易开发框架,简洁,优雅,好用。本课程有如下技术特色:第一:充分使用Spring Boot的自动装配、条件注解,以及各种使用技巧;第二:使用注解@Transaction抽象业务流程,简化交易的定义和执行方式,比SpringMVC更符合业务流程的开发(当然SpringMVC很强大,无贬低之意)第三:为使交易具备RPC能力,使用泛化方式集成Dubbo,其好处是服务端不再需要提供接口给客户端使用,简单、高效;第四:使用nacos作为服务注册中心,也支持zookeeper;第五:为使交易具备Http能力,在Spring MVC的基础上提供HandlerMapping、HandlerAdapter。。。。一切尽在代码中

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值