打開IDE—新建Maven項目—構建一個簡單Maven項目html
編寫pom配置引入jar包java
注:引入完畢後可能項目會報紅叉,更新maven便可web
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.springboot</groupId> <artifactId>springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!-- 引入web相關包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Springboot devtools熱部署 依賴包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin </artifactId> <configuration> <!-- 若是沒有該項配置,devtools不會起做用,即應用不會restart --> <fork>true</fork> </configuration> </plugin> </plugins> </build> </project>
包名:com.springboot.controllerspring
類名:TestControllerapache
package com.springboot.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; //@RestController=@Controller+@ResponseBody @RestController @RequestMapping("/test") public class TestController { @RequestMapping("/hello1") public String hello(){ return "hello1"; } }
包名:com.springboottomcat
類名:TestControllerspringboot
package com.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); System.out.println("_____OK______"); } }
而後運行程序mvc
輸入地址:http://localhost:8080/test/hello1app
若是顯示:hello1,則測試成功webapp
測試代碼編寫完成
———————————————————————————————————————
對TestController類進行操做
若是設置一個變量=整數/0,則會發生ArithmeticException異常
在TestController中加入除0異常點
@RequestMapping("/hello1") public String hello(){ // 本身編寫的除0異常 int a=1/0; return "hello1"; }
在TestController中加入異常處理方法
//局部異常處理 @ExceptionHandler(Exception.class) public String exHandler(Exception e){ // 判斷髮生異常的類型是除0異常則作出響應 if(e instanceof ArithmeticException){ return "發生了除0異常"; } // 未知的異常作出響應 return "發生了未知異常"; }
輸入地址:http://localhost:8080/test/hello1
若是顯示:發生了除0異常,則測試成功
———————————————————————————————————————
包名:package com.springboot.controller;
類名:TestGlobalController
package com.springboot.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/test") public class TestGlobalController { @RequestMapping("/hello2") public String hello2(){ // 本身編寫的異常發生點 int a=1/0; return "hello2"; } }
--------------------------------------------------------------------------------------
包名:com.springboot.controller.exception
類名:GlobalDefaultExceptionHandler
package com.springboot.controller.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class GlobalDefaultExceptionHandler { // 全局異常處理返回字符串 @ExceptionHandler(Exception.class) @ResponseBody public String exception(Exception e){ // 判斷髮生異常的類型是除0異常則作出響應 if(e instanceof ArithmeticException){ return "全局:發生了除0異常"; } // 未知的異常作出響應 return "全局:發生了未知異常"; } }
// 全局異常處理返回JSON @ExceptionHandler(Exception.class) @ResponseBody public Map<String,Object> exception(Exception e){ Map<String,Object> map=new HashMap<String,Object>(); // 判斷髮生異常的類型是除0異常則作出響應 if(e instanceof ArithmeticException){ map.put("codeNumber", "1"); map.put("message", e.getMessage()); return map; } // 未知的異常作出響應 map.put("codeNumber", "0"); map.put("message", e.getMessage()); return map; }
@ExceptionHandler(Exception.class) public String exception(Exception e){ // 判斷髮生異常的類型是除0異常則作出響應 if(e instanceof ArithmeticException){ // 跳轉到test.jsp頁面 return "test"; } // 未知的異常作出響應 // 跳轉到test.jsp頁面 return "test"; }
注:須要配置一下才能支持jsp
①須要在pom添加JSP的支持
<!-- 對JSP的解析支持 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <!-- 對JSTL的支持 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>
②須要配置application.properties
添加application.properties文件,而後往其中寫入
# 頁面默認前綴目錄 spring.mvc.view.prefix=/WEB-INF/ # 響應頁面默認後綴 spring.mvc.view.suffix=.jsp
③須要添加jsp文件
添加JSP,放置在src/main/webapp/WEB-INF目錄下
--------------------------------------------------------------------------------------
在spring 3.2中,新增了@ControllerAdvice 註解能夠用於定義@ExceptionHandler、@InitBinder、@ModelAttribute,並應用到全部@RequestMapping中。
這裏咱們全局異常只應用到@ExceptionHandler
設置了@ControllerAdvice應用範圍,即就設置了異常類的應用範圍
@ControllerAdvice的範圍有:
①basePackages:應用在xx包
②basePackageClasses:應用在xx類
③assignableTypes:應用在加了@Controller的類
④annotations:應用在帶有xx註解的類或者方法
————————————————————
≥簡單用法例子:
————————————————————
@ControllerAdvice(basePackages={"com.springboot.controller"})
只捕捉com.springboot.controller包中的異常
@ControllerAdvice(basePackageClasses={TestController.class})
只捕捉TestController.class中的異常
@ControllerAdvice(assignableTypes={TestController.class})
只捕捉TestController.class中的異常
@ControllerAdvice(annotations=TestException.class)
只捕捉帶有@TestException註解的類
上面四個註解一個應用包,而後的兩個用在類,而最後一個只應用於帶有XX註解的類
--------------------------------------------------------------------------------------
一、建立一個註解類
package com.springboot.annotation; import static java.lang.annotation.ElementType.TYPE; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; // 這種類型的Annotations將被JVM保留,因此他們能在運行時被JVM或其餘使用反射 @Retention(RUNTIME) // 目標類型能夠應用在方法 @Target(ElementType.TYPE) // 對doc文檔支持 @Documented public @interface TestException { }
---------------------------------------------------------------------------------
注:關於註解類的簡說請看:
http://www.javashuo.com/article/p-secwydel-mk.html
---------------------------------------------------------------------------------
二、將註解加到TestController類
加入@TestException註解
// 加入TestException註解 @TestException @RestController @RequestMapping("/test") public class TestController { @RequestMapping("/hello1") public String hello(){ // 本身編寫的除0異常 int a=1/0; return "hello1"; } }
三、TestGlobalController類不加註解
@RestController @RequestMapping("/test") public class TestGlobalController { @RequestMapping("/hello2") public String hello(){ // 本身編寫的除0異常 int a=1/0; return "hello2"; } }
四、設置異常類只捕捉帶有@TestException註解的類的異常
// 設置範圍應用於帶有@TestException的註解的類上 @ControllerAdvice(annotations={TestException.class}) public class GlobalDefaultExceptionHandler { @ExceptionHandler(Exception.class) @ResponseBody public String exceptionReturnString(Exception e){ // 判斷髮生異常的類型是除0異常則作出響應 if(e instanceof ArithmeticException){ return "全局:發生了除0異常"; } // 未知的異常作出響應 return "全局:發生了未知異常"; } }
五、測試
輸入地址:http://localhost:8080/test/hello1
輸入地址:http://localhost:8080/test/hello2
由於404錯誤是不通過controller的,因此沒法經過上述辦法處理。可是 SpringBoot 默認提供了一個全局的 handler 來處理全部的 HTTP 錯誤, 並把它映射爲 /error。當發生一個 HTTP 錯誤, 例如 404 錯誤時, SpringBoot 內部的機制會將頁面重定向到 /error 中。
因此咱們只要實現一個 /error 映射的 Controller 便可來處理它便可
在WEB-IFN下建立errorpages目錄,而且在此目錄下建立一個404.jsp頁面
目錄:
404.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Test JSP</title> </head> <body> <span>發生了404錯誤</span> </html>
包名:package com.springboot.controller;
類名:HttpErrorController
package com.springboot.controller; import org.springframework.boot.autoconfigure.web.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HttpErrorController implements ErrorController { private static final String ERROR_PATH = "/error"; @RequestMapping(value=ERROR_PATH) public String handleError(){ return "errorpage/404"; } @Override public String getErrorPath() { return ERROR_PATH; } }
隨便輸入個地址測試引起404錯誤
例如輸入地址:http://localhost:8080/-.-
顯示: