POJO是一個簡單的、普通Java對象,它包含業務邏輯處理或持久化邏輯等,但不是JavaBean、EntityBean等,不具備任何特殊角色,不繼承或不實現任何其它Java框架的類或接口。能夠包含相似與JavaBean屬性和對屬性訪問的setter和getter方法的。html
基本意思是說POJO一個普通的Java對象(不是JavaBean,EntityBean等),也不擔當任何的特殊的角色,也不實現任何Java框架指定的接口。java
錯誤的POJOmysql
public class DbHello implements Hello { //實現了接口,就不能稱之爲POJO,這已經不是簡單的Java類了 private DictionaryDAO dao; public void setDao(DictionaryDAO dao) { this.dao = dao; } }
正確的POJOgit
public class DbHello { //簡單的Java類,稱之爲POJO,不繼承,不實現接口 private DictionaryDAO dao; public void setDao(DictionaryDAO dao) { this.dao = dao; } }
在JPA中,@GeneratedValue
註解存在的意義主要就是爲一個實體生成一個惟一標識的主鍵(JPA要求每個實體Entity,必須有且只有一個主鍵)web
@GeneratedValue
提供了主鍵的生成策略。@GeneratedValue
註解有兩個屬性,分別是strategy
和generator
,其中generator
屬性的值是一個字符串,默認爲"",其聲明瞭主鍵生成器的名稱(對應於同名的主鍵生成器@SequenceGenerator和@TableGenerator)。spring
JPA爲開發人員提供了四種主鍵生成策略,其被定義在枚舉類GenerationType中,包括GenerationType.TABLEsql
GenerationType.SEQUENCE數據庫
GenerationType.IDENTITYjson
GenerationType.AUTOapi
–IDENTITY:採用數據庫ID自增加的方式來自增主鍵字段,Oracle 不支持這種方式;
–AUTO: JPA自動選擇合適的策略,是默認選項;
–SEQUENCE:經過序列產生主鍵,經過@SequenceGenerator 註解指定序列名,MySql不支持這種方式
–TABLE:經過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可使應用更易於數據庫移植。
實例
@Entity //jpa標註實體 @Table(name = "t_customer") // 建立/修改表的名稱 @Data public class Customer { @Id // 主鍵 //@GeneratedValue(strategy = GenerationType.AUTO) //主鍵自增 Auto爲默認使用oracle自增的方式 //因此在運行時會多生成一張表 記錄從1開始 記錄主鍵 //這裏不適用與mysql 可是使用 //@GeneratedValue(strategy = GenerationType.IDENTITY)報主鍵不能爲空錯誤 private Long id; @Column(name = "name", nullable = true) // 數據庫對應字段名 非空約束(能夠爲空) private String name; @Column(name = "remark", nullable = true) // 數據庫對應字段名 非空約束(能夠爲空) private String remark; ...... }
Web UI項目中, 不少 Spring controller 視圖函數直接返回 html 頁面, 還有一些視圖函數是要重定向或轉發到其餘的 url 上.
redirect 和 forward的區別:
重定向 redirect: 完整的重定向包含兩次request-response過程,
第一次是訪問原始url
第二次是服務器通知客戶端訪問重定向後的url. 重定向完成後, 瀏覽器的地址是重定向後的url, 而不是原始的url
重定向的使用場景: 由於重定向會修改瀏覽器地址, 因此 form 提交應該使用重定向, 以避免用戶刷新頁面致使form重複提交.
轉發 forward: 完整的轉發僅包含一次 request-response 過程, 用戶發出request後, 服務器端視圖函數先處理本身的邏輯, 而後在服務器端有調用另外一個視圖函數, 最後將response返回給瀏覽器.
控制層調用service層
service調用dao層
dao調用具體的增刪改查
獲取url中的數據
若是咱們須要獲取Url=localhost:8080/hello/id中的id值,實現代碼以下: @RestController public class HelloController { @RequestMapping(value="/hello/{id}",method= RequestMethod.GET) public String sayHello( @PathVariable("id") Integer id){ return "id:"+id; } } 一樣,若是咱們須要在url有多個參數須要獲取,則以下代碼所示來作就能夠了。 @RestController public class HelloController { @RequestMapping(value="/hello/{id}/{name}",method=RequestMethod.GET) public String sayHello( @PathVariable("id") Integer id, @PathVariable("name") String name){ return "id:"+id+" name:"+name; } }
獲取請求參數的值
獲取Url=localhost:8080/hello?id=98中id的值 @RestController public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(@RequestParam("id") Integer id){ return "id:"+id; } } @RequestParam註解給咱們提供了這種解決方案,即容許用戶不輸入id時,使用默認值 @RestController public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) //required=false 表示url中能夠不穿入id參數,此時就使用默認參數 public String sayHello(@RequestParam(value="id",required = false,defaultValue = "1") Integer id){ return "id:"+id; } }
@GetMapping是一個組合註解,是@RequestMapping(method = RequestMethod.GET)的縮寫。該註解將HTTP Get 映射到 特定的處理方法上。
便可以使用@GetMapping(value = 「/hello」)來代替@RequestMapping(value=」/hello」,method= RequestMethod.GET)。便可以讓咱們精簡代碼。
@RestController Spring框架4版本以後出來的註解,以前版本返回json數據須要@ResponseBody配合@Controller
@RestController public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(){ return "hello"; } } 等同於下面 @Controller @ResponseBody public class HelloController { @RequestMapping(value="/hello",method= RequestMethod.GET) public String sayHello(){ return "hello"; } }
CORS(Cross-Origin Resource Sharing)"跨域資源共享",是一個W3C標準,它容許瀏覽器向跨域服務器發送Ajax請求,打破了Ajax只能訪問本站內的資源限制
addMapping:配置能夠被跨域的路徑,能夠任意配置,能夠具體到直接請求路徑。
allowedMethods:容許全部的請求方法訪問該跨域資源服務器,如:POST、GET、PUT、DELETE等。
allowedOrigins:容許全部的請求域名訪問咱們的跨域資源,能夠固定單條或者多條內容,如:"http://www.baidu.com",只有百度能夠訪問咱們的跨域資源。
allowedHeaders:容許全部的請求header訪問,能夠自定義設置任意請求頭信息,如:"X-YAUTH-TOKEN"
在用spring Boot
作web
後臺時,常常會出現異常,若是每一個異常都本身去處理很麻煩,因此咱們建立一個全局異常處理類來統一處理異常。經過使用@ControllerAdvice
定義統一的異常處理類,而不是在每一個Controller
中逐個定義。
自定義全局異常處理類 GlobalExceptionHandler.java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MyException.class) @ResponseBody public Result handleMyException(HttpServletRequest request, MyException e){ String message = e.getMessage(); Integer code = e.getCode(); Result result = new Result(code,message); return result; } } 只須要使用 @ControllerAdvice 註解來標識便可,能夠結合 @Controller 註解來理解. @Controller 註解標識的類 攔截全部的web請求,使用 @RequestMappering() 進行匹配 @ControllerAdvice 註解標識的類 攔截程序拋出的異常,使用@ExceptionHandler() 進行匹配