案例1:JSP版本的列表显示
搭建工程
- 创建maven project (war类型)
-
在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>
-
在src/java/resources下添加application.properties配置文件
#server server.port=7777
-
在cn.xdl包下定义主启动类
@SpringBootApplication//开启自动配置、扫描、bean定义 public class BootApplication { public static void main(String[] args) { SpringApplication.run(BootApplication.class, args); } }
-
在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
-
在pom.xml中追加mybatis-spring-boot-starter、驱动包、spring-boot-starter-jdbc定义
-
编写Book实体类、Mapper接口BookDao
- 在application.properties追加db参数定义
- 编写Book.java
- 编写BookDao.java
- 在启动类追加@@MapperScan标记
- 利用spring-boot-starter-test测试
-
编写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; } }
-
在application.properties配置viewresolver
#viewresolver spring.mvc.view.prefix=/WEB-INF/ spring.mvc.view.suffix=.jsp
-
在pom.xml引入jstl定义,循环显示jsp
<dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
追加分页处理
改造BookController支持分页处理
-
在pom.xml引入pagehelper-spring-boot-starter
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.3</version> </dependency>
-
修改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; } }
-
修改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拦截器区别
- 过滤器属于Servlet规范,受Servlet容器调用;拦截器属于Spring规范,受Spring容器调用
- 过滤器可以拦截所有请求;拦截器只能拦截器Action请求;
- 过滤器是在Servlet之前拦截;拦截器在action之前、之后、请求响应输出之前;
- 过滤器可以访问Servlet API对象;拦截器不仅能访问Servlet对象,还可以访问ModelAndView等Spring框架对象。
- 拦截器在Spring容器中可以使用IOC、AOP功能;但是Filter过滤器不行。
- 过滤器采用回调机制;拦截器采用反射机制对象调用
SpringBoot MVC异常处理
全局处理
-
原理
- 自动配置ErrorMvcAutoConfiguration组件,启动时将BasicErrorController加载,提供了/error请求的处理。
- 其他Controller执行中抛出异常,SpringBoot 底层会重定向/error请求,显示error错误页面。
-
自定义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;
}
}