摘要:時間年月日星期四說明本文部分內容均來自慕課網。哈希表實現命令,將哈希表中的域的值設為實現命令,返回哈希表中給定域的值實現命令,刪除哈希表中的一個或多個指定域,不存在的域將被忽略。實現命令,返回哈希表中,所有的域和值。
時間:2018年04月19日星期四
說明:本文部分內容均來自慕課網。@慕課網:https://www.imooc.com
教學源碼:https://github.com/zccodere/s...
學習源碼:https://github.com/zccodere/s...
SpringBoot簡介
微框架,與Spring4一起誕生,比如@RestController
可以快速上手,整合了一些子項目(開源框架或者第三方開源庫)
可以依賴很少的配置就可以十分快速的搭建并且運行項目
SpringBoot特點
Spring全家桶的一員:基于Spring,使開發者快速入門,門檻很低
SpringBoot可以創建獨立運行的應用而不依賴于容器
不需要打成war包,可以放入tomcat中直接運行
提供maven極簡配置,缺點就是會引入很多不需要的包
根據項目來依賴,從而配置Spring,需要什么引用什么
提供可視化的相關功能,方便監控,比如性能、應用的健康程度等
簡化配置,不用再看過多的xml,使用注解進行配置
為微服務SpringCloud鋪路,SpringBoot可以整合很多框架來構建微服務,比如Dubbo、Thrift等
SpringBoot使用場景
有Spring的地方都可以使用SpringBoot
JavaWeb項目:JavaEE項目等
微服務:SpringCloud微服務開發的基礎
1-2 首個項目Spring官方提供的項目骨架生成地址
http://start.spring.io/
代碼編寫
1.創建名為boot-start的maven項目pom文件如下
4.0.0 com.myimooc boot-start 0.0.1-SNAPSHOT jar boot-start Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 2.0.1.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools true org.springframework.boot spring-boot-configuration-processor org.springframework.boot spring-boot-starter-freemarker org.springframework.boot spring-boot-starter-thymeleaf mysql mysql-connector-java 5.1.41 org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.1 tk.mybatis mapper-spring-boot-starter 1.2.4 com.github.pagehelper pagehelper-spring-boot-starter 1.2.3 org.mybatis.generator mybatis-generator-core 1.3.2 compile true org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2 2.5.0 org.springframework.boot spring-boot-starter-aop org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
2.編寫BootStartApplication類
package com.myimooc.boot.start; import org.n3r.idworker.Sid; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import tk.mybatis.spring.annotation.MapperScan; /** *
* 標題: 啟動類
* 描述: 首個SpringBoot項目
* 使用 @EnableScheduling 開啟支持定時任務 * 使用 @EnableAsync 開啟異步執行程序 * @author zc * @date 2018/04/19 */ @SpringBootApplication @MapperScan("com.myimooc.boot.start.dao.mapper") @EnableScheduling @EnableAsync public class BootStartApplication { public static void main(String[] args) { SpringApplication.run(BootStartApplication.class, args); } @Bean public Sid sid() { return new Sid(); } }
3.編寫HelloController類
package com.myimooc.boot.start.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** *
* 標題: 基于REST的Controller
* 描述: 返直接返回方法的響應內容
* * @author zc * @date 2018/04/19 */ @RestController public class HelloController { @GetMapping("/hello") public Object hello(){ return "Hello SpringBoot!"; } }
然后啟動BootStartApplication,訪問http://localhost:8080/hello
第二章:常用開發 2-1 響應對象通常一個應用都會有一個統一的響應對象,用于封裝響應狀態、響應消息、響應數據等,并提供一些常用靜態方法
代碼編寫
1.編寫JsonResult類
package com.myimooc.boot.start.domain; import java.io.Serializable; /** *
* 標題: 自定義JSON響應數據結構
* 描述: 統一請求響應返回的格式
* 200 成功 * 500 錯誤,錯誤信息在msg字段中 * 501 Bean驗證錯誤信息,以map返回 * 502 攔截器攔截到用戶token出錯 * 555:拋出異常信息 * @author zc * @date 2018/04/19 */ public class JsonResult implements Serializable{ private static final long serialVersionUID = 4997293587553904193L; /** * 響應狀態 */ private Integer status; /** * 響應消息 */ private String msg; /** * 響應數據 */ private Object data; public static JsonResult build(Integer status,String msg,Object data){ return new JsonResult(status,msg,data); } public static JsonResult ok(Object data){ return new JsonResult(200,"ok",data); } public static JsonResult ok(){ return JsonResult.ok(null); } public static JsonResult errMsg(String msg){ return new JsonResult(500,msg,null); } public static JsonResult errMap(Object data){ return new JsonResult(501,"error",data); } public static JsonResult errTokenMsg(String msg){ return new JsonResult(502,msg,null); } public static JsonResult errException(String msg){ return new JsonResult(555,msg,null); } public JsonResult() { } public JsonResult(Integer status, String msg, Object data) { this.status = status; this.msg = msg; this.data = data; } @Override public String toString() { return "JsonResult{" + "status=" + status + ", msg="" + msg + """ + ", data=" + data + "}"; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } }
2.編寫User類
package com.myimooc.boot.start.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import java.io.Serializable; import java.util.Date; /** *
* 標題: POJO類
* 描述: 用戶信息
* * @author zc * @date 2018/04/19 */ public class User implements Serializable { private static final long serialVersionUID = 7332961063564924222L; /** * 名稱 */ private String name; /** * 密碼,使用 @JsonIgnore 注解,在序列化為 JSON 時,忽略該字段 */ @JsonIgnore private String password; /** * 年齡 */ private Integer age; /** * 生日,使用 @JsonFormat 注解,在序列化為 JSON 時,使用 pattern 屬性指定的值格式化日期時間 */ @JsonFormat(pattern = "yyyy-MM-dd",locale = "zh",timezone = "GMT+8") private Date birthday; /** * 描述,使用 @JsonInclude 注解,在序列化為 JSON 時,當字段為 null 時,則忽略該字段 */ @JsonInclude(JsonInclude.Include.NON_NULL) private String note; @Override public String toString() { return "User{" + "name="" + name + """ + ", password="" + password + """ + ", age=" + age + ", birthday=" + birthday + ", note="" + note + """ + "}"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } }
3.編寫UserController類
package com.myimooc.boot.start.controller; import com.myimooc.boot.start.domain.JsonResult; import com.myimooc.boot.start.domain.User; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Date; /** *2-2 配置文件
* 標題: 使用Controller
* 描述: 返回JSON數據
* * @author zc * @date 2018/04/19 */ @RestController @RequestMapping("/user") public class UserController { @GetMapping("/getUser") public User getUser(){ User user = new User(); user.setName("myImooc2"); user.setPassword("myImooc"); user.setAge(22); user.setBirthday(new Date()); user.setNote("Hello"); return user; } @GetMapping("/getUserJson") public JsonResult getUserJson(){ User user = new User(); user.setName("myImooc2"); user.setPassword("myImooc"); user.setAge(22); user.setBirthday(new Date()); user.setNote("Hello"); return JsonResult.ok(user); } }
資源文件中的屬性配置與映射到實體類,即加載配置文件到實體類中
代碼編寫
1.編寫resource.properties
com.imooc.opensource.name=imooc com.imooc.opensource.website=www.imooc.com com.imooc.opensource.language=java
2.編寫Resource類
package com.myimooc.boot.start.domain; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; /** *
* 標題: 配置屬性實體類
* 描述: 從配置文件中獲取屬性值
* * @author zc * @date 2018/04/25 */ @Configuration @ConfigurationProperties(prefix = "com.imooc.opensource") @PropertySource(value = "classpath:resource.properties") public class Resource { private String name; private String website; private String language; @Override public String toString() { return "Resource{" + "name="" + name + """ + ", website="" + website + """ + ", language="" + language + """ + "}"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getWebsite() { return website; } public void setWebsite(String website) { this.website = website; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } }
3.修改HelloController類
package com.myimooc.boot.start.controller; import com.myimooc.boot.start.domain.JsonResult; import com.myimooc.boot.start.domain.Resource; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** *第三章:技術整合 3-1 模版引擎
* 標題: 基于REST的Controller
* 描述: 返直接返回方法的響應內容
* * @author zc * @date 2018/04/19 */ @RestController public class HelloController { @Autowired private Resource resource; @GetMapping("/hello") public Object hello(){ return "Hello SpringBoot!"; } @GetMapping("/getResource") public JsonResult getResource(){ Resource target = new Resource(); BeanUtils.copyProperties(resource,target); return JsonResult.ok(target); } }
Spring Boot 整合模版引擎
Spring Boot 整合 Freemarker
Spring Boot 整合 Thymeleaf
代碼編寫
1.修改pom引入依賴
org.springframework.boot spring-boot-starter-freemarker org.springframework.boot spring-boot-starter-thymeleaf
2.修改application.properties
#------------ Server 服務端相關配置 # 配置 api 端口號 #server.port=8080 # 配置 context-path,一般在正式發布時不配置 #server.servlet.context-path=/start # 錯誤頁,指定發生錯誤時,跳轉的URL -> BasicErrorController #server.error.path=/error # session 最大超時時間(單位:秒;默認值:30分鐘) server.servlet.session.timeout=3600 # 綁定ID地址,如果本機不是該ID地址則拋出異常,根據具體業務需求來設置 #server.address=192.168.1.8 # tomcat 最大線程數(默認值:200) #server.tomcat.max-threads=250 # tomcat 的URI編碼 server.tomcat.uri-encoding=UTF-8 # 配置 i18N 資源文件,供 thymeleaf 讀取 spring.messages.basename=i18n/messages spring.messages.cache-duration=3600 spring.messages.encoding=UTF-8 # 設置靜態文件路徑,js、css等 spring.mvc.static-path-pattern=/static/** #------------ Freemarker 靜態資源配置 # 設置 ftl 文件路徑 spring.freemarker.template-loader-path=classpath:/templates/ # 關閉緩存,即時刷新,生產環境需改為true spring.freemarker.cache=false spring.freemarker.charset=UTF-8 spring.freemarker.check-template-location=true spring.freemarker.content-type=text/html spring.freemarker.expose-request-attributes=true spring.freemarker.expose-session-attributes=true spring.freemarker.request-context-attribute=request spring.freemarker.suffix=.ftl #------------ Thymeleaf 靜態資源配置 spring.thymeleaf.prefix=classpath:/templates/ # 關閉緩存,即時刷新,生產環境需改為true spring.thymeleaf.cache=false spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.servlet.content-type=text/html
3.編寫FreemarkerController類
package com.myimooc.boot.start.controller; import com.myimooc.boot.start.domain.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; /** *
* 標題: Freemarker
* 描述: 整合 Freemarker
* * @author zc * @date 2018/04/25 */ @Controller @RequestMapping("ftl") public class FreemarkerController { @Autowired private Resource resource; @GetMapping("/index") public String index(ModelMap map){ map.addAttribute("resource",resource); return "freemarker/index"; } @GetMapping("/center") public String center(){ return "freemarker/center/center"; } }
4.編寫ThymeleafController類
package com.myimooc.boot.start.controller; import com.myimooc.boot.start.domain.User; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import java.util.ArrayList; import java.util.Date; import java.util.List; /** *
* 標題: Thymeleaf
* 描述: 整合 Thymeleaf
* * @author zc * @date 2018/04/25 */ @Controller @RequestMapping("th") public class ThymeleafController { @RequestMapping("/index") public String index(ModelMap map) { map.addAttribute("name", "thymeleaf-imooc"); return "thymeleaf/index"; } @RequestMapping("center") public String center() { return "thymeleaf/center/center"; } @RequestMapping("test") public String test(ModelMap map) { User u = new User(); u.setName("superadmin"); u.setAge(10); u.setPassword("123465"); u.setBirthday(new Date()); u.setNote("hello imooc"); map.addAttribute("user", u); User u1 = new User(); u1.setAge(19); u1.setName("imooc"); u1.setPassword("123456"); u1.setBirthday(new Date()); User u2 = new User(); u2.setAge(17); u2.setName("LeeCX"); u2.setPassword("123456"); u2.setBirthday(new Date()); ListuserList = new ArrayList<>(); userList.add(u); userList.add(u1); userList.add(u2); map.addAttribute("userList", userList); return "thymeleaf/test"; } @PostMapping("postform") public String postform(User user) { System.out.println("姓名:" + user.getName()); System.out.println("年齡:" + user.getAge()); return "redirect:/th/test"; } @RequestMapping("showerror") public String showerror(User user) { int a = 1 / 0; return "redirect:/th/test"; } }
5.受篇幅限制,頁面代碼就不顯示了,源碼請到github查看。完成后的目錄結構如下
3-2 全局異常代碼編寫
1.編寫ErrorController類
package com.myimooc.boot.start.controller; import com.myimooc.boot.start.domain.JsonResult; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** *
* 標題: 錯誤頁演示
* 描述: 跳轉至錯誤頁
* * @author zc * @date 2018/04/25 */ @Controller @RequestMapping("err") public class ErrorController { @RequestMapping("/error") public String error() { int a = 1 / 0; return "thymeleaf/error"; } @RequestMapping("/ajaxerror") public String ajaxerror() { return "thymeleaf/ajaxerror"; } @RequestMapping("/getAjaxerror") @ResponseBody public JsonResult getAjaxerror() { int a = 1 / 0; return JsonResult.ok(); } }
2.編寫GlobalExceptionHandler類
package com.myimooc.boot.start.exception; import com.myimooc.boot.start.domain.JsonResult; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** *3-3 持久框架
* 標題: 全局異常捕獲,兼容 web 和 ajax
* 描述: 使用 @ControllerAdvice 聲明當前是助手類
* * @author zc * @date 2018/04/25 */ @ControllerAdvice @RestControllerAdvice public class GlobalExceptionHandler { private static final String ERROR_VIEW = "error"; @ExceptionHandler(Exception.class) public Object handler(HttpServletRequest request, HttpServletResponse response, Exception e) { e.printStackTrace(); if (isAjax(request)) { return this.responseByAjax(request, response, e); } return this.responseByWeb(request, response, e); } private boolean isAjax(HttpServletRequest request) { return (request.getHeader("X-Requested-With") != null) && ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) ; } private JsonResult responseByAjax(HttpServletRequest request, HttpServletResponse response, Exception e) { return JsonResult.errException(e.getMessage()); } private ModelAndView responseByWeb(HttpServletRequest request, HttpServletResponse response, Exception e) { ModelAndView mav = new ModelAndView(); mav.setViewName(ERROR_VIEW); mav.addObject("exception", e); mav.addObject("url", request.getRequestURL()); return mav; } }
Spring Boot 整合 MyBatis
使用generatorConfig生成mapper以及pojo
實現基于MyBatis的CRUD功能
整合MyBatis-pagehelper實現分頁
自定義mapper的實現
受篇幅限制,代碼就不顯示了,源碼請到github查看。
3-4 緩存技術Spring Boot 整合 Redis
代碼編寫
1.引入redis依賴
org.springframework.boot spring-boot-starter-data-redis
2.配置application.properties
#------------ redis 配置 # redis 數據庫索引(默認值:0) spring.redis.database=0 # redis 服務器地址 spring.redis.host=127.0.0.1 # redis 服務器端口 spring.redis.port=6379
3.編寫JsonUtils類
package com.myimooc.boot.start.util; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; /** *
* 標題: 定義響應結構, 轉換類
* 描述: Json工具
* * @author zc * @date 2018/04/26 */ public class JsonUtils { // 定義jackson對象 private static final ObjectMapper MAPPER = new ObjectMapper(); /** * 將對象轉換成json字符串。 *Title: pojoToJson
*Description:
* @param data * @return */ public static String objectToJson(Object data) { try { String string = MAPPER.writeValueAsString(data); return string; } catch (JsonProcessingException e) { e.printStackTrace(); } return null; } /** * 將json結果集轉化為對象 * * @param jsonData json數據 * @param beanType 對象中的object類型 * @return */ public staticT jsonToPojo(String jsonData, Class beanType) { try { T t = MAPPER.readValue(jsonData, beanType); return t; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 將json數據轉換成pojo對象list * @param jsonData * @param beanType * @return */ public static List jsonToList(String jsonData, Class beanType) { JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType); try { List list = MAPPER.readValue(jsonData, javaType); return list; } catch (Exception e) { e.printStackTrace(); } return null; } }
4.編寫RedisOperator類
package com.myimooc.boot.start.util; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; /** *
* 標題: Redis 常用方法封裝
* 描述: 使用redisTemplate的操作實現類
* * @author zc * @date 2018/04/26 */ @Component public class RedisOperator { @Autowired private StringRedisTemplate redisTemplate; // Key(鍵),簡單的key-value操作 /** * 實現命令:TTL key,以秒為單位,返回給定 key的剩余生存時間(TTL, time to live)。 * * @param key * @return */ public long ttl(String key) { return redisTemplate.getExpire(key); } /** * 實現命令:expire 設置過期時間,單位秒 * * @param key * @return */ public void expire(String key, long timeout) { redisTemplate.expire(key, timeout, TimeUnit.SECONDS); } /** * 實現命令:INCR key,增加key一次 * * @param key * @return */ public long incr(String key, long delta) { return redisTemplate.opsForValue().increment(key, delta); } /** * 實現命令:KEYS pattern,查找所有符合給定模式 pattern的 key */ public Setkeys(String pattern) { return redisTemplate.keys(pattern); } /** * 實現命令:DEL key,刪除一個key * * @param key */ public void del(String key) { redisTemplate.delete(key); } // String(字符串) /** * 實現命令:SET key value,設置一個key-value(將字符串值 value關聯到 key) * * @param key * @param value */ public void set(String key, String value) { redisTemplate.opsForValue().set(key, value); } /** * 實現命令:SET key value EX seconds,設置key-value和超時時間(秒) * * @param key * @param value * @param timeout (以秒為單位) */ public void set(String key, String value, long timeout) { redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS); } /** * 實現命令:GET key,返回 key所關聯的字符串值。 * * @param key * @return value */ public String get(String key) { return (String) redisTemplate.opsForValue().get(key); } // Hash(哈希表) /** * 實現命令:HSET key field value,將哈希表 key中的域 field的值設為 value * * @param key * @param field * @param value */ public void hset(String key, String field, Object value) { redisTemplate.opsForHash().put(key, field, value); } /** * 實現命令:HGET key field,返回哈希表 key中給定域 field的值 * * @param key * @param field * @return */ public String hget(String key, String field) { return (String) redisTemplate.opsForHash().get(key, field); } /** * 實現命令:HDEL key field [field ...],刪除哈希表 key 中的一個或多個指定域,不存在的域將被忽略。 * * @param key * @param fields */ public void hdel(String key, Object... fields) { redisTemplate.opsForHash().delete(key, fields); } /** * 實現命令:HGETALL key,返回哈希表 key中,所有的域和值。 * * @param key * @return */ public Map
5.編寫RedisController類
package com.myimooc.boot.start.controller; import com.myimooc.boot.start.dao.po.SysUser; import com.myimooc.boot.start.domain.JsonResult; import com.myimooc.boot.start.domain.User; import com.myimooc.boot.start.util.JsonUtils; import com.myimooc.boot.start.util.RedisOperator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.Date; import java.util.List; /** *3-5 定時任務
* 標題: 整合redis
* 描述: redis訪問
* * @author zc * @date 2018/04/26 */ @RestController @RequestMapping("redis") public class RedisController { @Autowired private StringRedisTemplate strRedis; @Autowired private RedisOperator redis; @RequestMapping("/test") public JsonResult test() { strRedis.opsForValue().set("imooc-cache", "hello 慕課網~~~~~~"); SysUser user = new SysUser(); user.setId("100111"); user.setUsername("imooc"); user.setPassword("abc123"); user.setIsDelete(0); user.setRegistTime(new Date()); strRedis.opsForValue().set("json:user", JsonUtils.objectToJson(user)); SysUser jsonUser = JsonUtils.jsonToPojo(strRedis.opsForValue().get("json:user"), SysUser.class); return JsonResult.ok(jsonUser); } @RequestMapping("/getJsonList") public JsonResult getJsonList() { User user = new User(); user.setAge(18); user.setName("慕課網"); user.setPassword("123456"); user.setBirthday(new Date()); User u1 = new User(); u1.setAge(19); u1.setName("imooc"); u1.setPassword("123456"); u1.setBirthday(new Date()); User u2 = new User(); u2.setAge(17); u2.setName("hello imooc"); u2.setPassword("123456"); u2.setBirthday(new Date()); ListuserList = new ArrayList<>(); userList.add(user); userList.add(u1); userList.add(u2); redis.set("json:info:userlist", JsonUtils.objectToJson(userList), 2000); String userListJson = redis.get("json:info:userlist"); List userListBorn = JsonUtils.jsonToList(userListJson, User.class); return JsonResult.ok(userListBorn); } }
代碼編寫
1.修改BootStartApplication啟動類,增加注解
@EnableScheduling
2.編寫TestTask類
package com.myimooc.boot.start.tasks; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; /** *3-6 異步任務
* 標題: 測試定時任務
* 描述: 自定義定時任務
* * @author zc * @date 2018/04/26 */ @Component public class TestTask { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); /** * 定義每過3秒執行任務 * 支持使用 @Scheduled(cron = "4-40 * * * * ?") cron表達式 */ @Scheduled(fixedRate = 3000) public void reportCurrentTime() { System.out.println("現在時間:" + dateFormat.format(new Date())); } }
異步任務使用場景
發送短信
發送郵件
APP消息推送
提高效率
代碼編寫
1.修改BootStartApplication啟動類,增加注解
@EnableAsync
2.編寫AsyncTask類
package com.myimooc.boot.start.tasks; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.stereotype.Component; import java.util.concurrent.Future; /** *
* 標題: 自定義異步執行任務
* 描述: 異步方法需使用 @Async 注解
* 判斷任務是否完成,必須返回 Future 接口 * @author zc * @date 2018/04/26 */ @Component public class AsyncTask { @Async public FuturedoTask11() throws Exception { long start = System.currentTimeMillis(); Thread.sleep(1000); long end = System.currentTimeMillis(); System.out.println("任務1耗時:" + (end - start) + "毫秒"); return new AsyncResult<>(true); } @Async public Future doTask22() throws Exception { long start = System.currentTimeMillis(); Thread.sleep(700); long end = System.currentTimeMillis(); System.out.println("任務2耗時:" + (end - start) + "毫秒"); return new AsyncResult<>(true); } @Async public Future doTask33() throws Exception { long start = System.currentTimeMillis(); Thread.sleep(600); long end = System.currentTimeMillis(); System.out.println("任務3耗時:" + (end - start) + "毫秒"); return new AsyncResult<>(true); } }
3.編寫DoTaskController類
package com.myimooc.boot.start.tasks; import com.myimooc.boot.start.domain.JsonResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.Future; /** *3-7 用攔截器
* 標題: 調用異步方法的controller
* 描述: 異步任務
* * @author zc * @date 2018/04/26 */ @RestController @RequestMapping("/tasks") public class DoTaskController { @Autowired private AsyncTask asyncTask; @RequestMapping("/asyncTask") public JsonResult asyncTask() throws Exception { long start = System.currentTimeMillis(); Futurea = asyncTask.doTask11(); Future b = asyncTask.doTask22(); Future c = asyncTask.doTask33(); while (!a.isDone() || !b.isDone() || !c.isDone()) { if (a.isDone() && b.isDone() && c.isDone()) { break; } } long end = System.currentTimeMillis(); String times = "任務全部完成,總耗時:" + (end - start) + "毫秒"; System.out.println(times); return JsonResult.ok(times); } }
Spring Boot 攔截器的使用
使用注解@Configuration配置攔截器
繼承WebMvcConfigurerAdapter
重新addInterceptors增加需要的攔截器地址
代碼編寫
1.編寫OneInterceptor類
package com.myimooc.boot.start.interceptor; import com.myimooc.boot.start.domain.JsonResult; import com.myimooc.boot.start.util.JsonUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; /** *
* 標題: 自定義攔截器一
* 描述: 攔截器
* * @author zc * @date 2018/04/26 */ public class OneInterceptor implements HandlerInterceptor { /** * 在請求處理之前進行調用(Controller方法調用之前) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { System.out.println("被one攔截,放行..."); return true; // 當校驗不通過時,返回 ajax 錯誤信息 // if (true) { // this.returnErrorResponse(response, JsonResult.errMsg("被one攔截")); // } // return false; } /** * 請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception { // 可以修改返回的數據 } /** * 在整個請求結束之后被調用,也就是在DispatcherServlet 渲染了對應的視圖之后執行 * (主要是用于進行資源清理工作) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception { } private void returnErrorResponse(HttpServletResponse response, JsonResult result) throws Exception { OutputStream out = null; try { response.setCharacterEncoding("utf-8"); response.setContentType("text/json"); out = response.getOutputStream(); out.write(JsonUtils.objectToJson(result).getBytes("utf-8")); out.flush(); } finally { if (out != null) { out.close(); } } } }
2.編寫TwoInterceptor類
package com.myimooc.boot.start.interceptor; import com.myimooc.boot.start.domain.JsonResult; import com.myimooc.boot.start.util.JsonUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; /** *
* 標題: 自定義攔截器二
* 描述: 攔截器
* * @author zc * @date 2018/04/26 */ public class TwoInterceptor implements HandlerInterceptor { /** * 在請求處理之前進行調用(Controller方法調用之前) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { if (true) { returnErrorResponse(response, JsonResult.errMsg("被two攔截")); } System.out.println("被two攔截..."); return false; } /** * 請求處理之后進行調用,但是在視圖被渲染之前(Controller方法調用之后) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception { } /** * 在整個請求結束之后被調用,也就是在DispatcherServlet 渲染了對應的視圖之后執行(主要是用于進行資源清理工作) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception { } public void returnErrorResponse(HttpServletResponse response, JsonResult result) throws Exception{ OutputStream out=null; try{ response.setCharacterEncoding("utf-8"); response.setContentType("text/json"); out = response.getOutputStream(); out.write(JsonUtils.objectToJson(result).getBytes("utf-8")); out.flush(); } finally{ if(out!=null){ out.close(); } } } }
3.編寫WebMvcConfig類
package com.myimooc.boot.start.config; import com.myimooc.boot.start.interceptor.OneInterceptor; import com.myimooc.boot.start.interceptor.TwoInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; /** *第四章:課程總結 4-1 課程總結
* 標題: 自定義配置類
* 描述: 注冊自定義的攔截器
* * @author zc * @date 2018/04/26 */ @Configuration public class WebMvcConfig extends WebMvcConfigurationSupport { @Override public void addInterceptors(InterceptorRegistry registry) { /** * 攔截器按照順序執行 */ registry.addInterceptor(new TwoInterceptor()).addPathPatterns("/two/**").addPathPatterns("/one/**"); registry.addInterceptor(new OneInterceptor()).addPathPatterns("/one/**"); super.addInterceptors(registry); } }
課程總結
搭建項目
模版引擎
全局異常
持久框架
緩存技術
定時任務
異步任務
使用攔截器
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69235.html
摘要:小時學會學習總結時間年月日星期六說明本文部分內容均來自慕課網。慕課網教學示例源碼暫無。數據庫操作下第六章事務管理事務管理只有查詢的時候不加事務,其它任何操作都要加事務。第七章課程回顧課程回顧總結介紹安裝配置的使用數據庫操作 《2小時學會SpringBoot》學習總結 時間:2017年2月18日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示...
摘要:時間年月日星期日說明本文部分內容均來自慕課網。慕課網教學示例源碼個人學習源碼第一章課程介紹課程介紹本課程緊接著小時學會課程,請先看入門課。異常返回通知在連接點拋出異常后執行。 時間:2017年3月19日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:htt...
摘要:入門篇學習總結時間年月日星期三說明本文部分內容均來自慕課網。主要的功能是日志記錄,性能統計,安全控制,事務處理,異常處理等等。 《Spring入門篇》學習總結 時間:2017年1月18日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://git...
摘要:時間年月日星期四說明本文部分內容均來自慕課網。那么里面的數據就可以分為各種各樣的索引,比如汽車索引圖書索引家具索引等等。圖書索引又可以細分為各種類型,比如科普類小說類技術類等等。具體到每一本書籍,就是文檔,就是整個圖書里面最小的存儲單位。 時間:2017年09月14日星期四說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:無學習源碼:https...
閱讀 2953·2021-11-23 09:51
閱讀 1006·2021-09-26 09:55
閱讀 3935·2021-09-22 14:58
閱讀 1468·2021-09-08 09:35
閱讀 1078·2021-08-26 14:16
閱讀 882·2019-08-23 18:17
閱讀 2054·2019-08-23 16:45
閱讀 700·2019-08-23 15:55