springboot_2--thymeleaf、異常、log4j、mybatis、redis
文章目錄
thymeleaf模板引擎
簡介
- 作用:做同步開發使用,前端程式碼與後端程式碼在一個專案中。類似於jsp,用來獲取後端java程式碼的資料(request,session,servletContext),在html中使用模板引擎技術來獲取資料。
- 同步:使用者發起請求url(http://ip:port/後端介面url)–>進入我們控制層程式碼–>呼叫服務層程式碼–>得到資料–>把資料放在request物件–>返回html檢視–>在檢視中使用jsp或thymeleaf等類似的引擎技術來獲取request物件中的資料–>動態生成純靜態的html程式碼(遍歷或顯示資料)–>生成的html程式碼返回客戶端。
- 非同步:使用者請求(請求頁面html)–>頁面載入函式中發起非同步請求(ajax或axios)–>呼叫服務層程式碼–>得到資料–>把資料返回客戶端–>非同步請求回撥函式中解析資料渲染檢視.
- jsp:編寫.jsp–>當使用者第一次請求XXX.jsp–>jsp引擎對XXX.jsp進行翻譯,翻譯成XXX.java–>虛擬機器把XXX.java編譯成XXX.class–>執行XXX.class中的service方法–>service方法中在生成靜態html
- thymeleaf:編譯.html–>當使用者第一次請求XXX.html–>thymeleaf引擎把.html載入到記憶體進行引擎語法解析–>基於記憶體把檢視模板儲存–>生成靜態的html
- 總結:解析動態資料,生成靜態html.與jsp功能一樣。
- springBoot官方不支援jsp,推薦同步開發使用thymeleaf。
- 相對於jsp來說,執行效率更加優秀。對於前端ui與程式設計師更加友好。
使用thymeleaf
- 加thymeleaf啟動器依賴
- 開發時,都要把thymleaf基於記憶體儲存模板禁用掉。
模板語法
- 表示式:
- 屬性表示式:${} 用來獲取request,session,servletContext域中的資料。
<span th:text="${request1}">測試資料測試資料</span>
<hr>
[[${request1}]]
<hr>
<span th:text="${session.session1}">測試資料測試資料</span>
<hr>
[[${session.session1}]]
<hr>
<span th:text="${#servletContext.getAttribute('context1')}">測試資料</span>
<hr>
[[${#servletContext.getAttribute('context1')}]]
<hr>
<input type="text" value="aaaa" th:value="${request1}">
- 連結表示式:@{} 用來給連結生成當前專案的絕對路徑。表示式內部/開頭
<script src="/js/jquery-3.2.1.js" th:src="@{/js/jquery-3.2.1.js}"></script>
- 文件表示式:~{} 用來做頁面的巢狀.寫子頁面的檢視名
<div th:fragment="topFragment">
公共的top頁面
</div>
<div th:fragment="bottomFragment">
公共的bottom頁面
</div>
<div th:insert="~{common :: topFragment}"></div>
<div th:replace="~{common :: bottomFragment}"></div>
common是要引入模組的檔名。
-
屬性:
- th:text="${}" 給雙標籤中間的內容賦值。
- th:value="${}" 給單標籤的value賦值。
- th:insert="~{}" 用來做頁面的巢狀.如果完整頁面巢狀的話,th:isnert=“檢視名”
- th:replace="~{}" 用來做頁面的巢狀.
- th:fragment=“片斷命名” 給區域性div命名,通過文件表示式引入片斷
- th:each="" 結合著屬性表示式獲取java程式碼的集合資料進行遍歷輸出。
- th:if=“條件表示式”
<table>
<tr>
<th>seq</th>
<th>id</th>
<th>name</th>
<th>phone</th>
<th>操作</th>
</tr>
<tr th:each="user,i:${ul}" th:if="${i.count%2!=0}">
<td>[[${i.count}]]</td>
<td>[[${user.uid}]]</td>
<td th:text="${user.uname}"></td>
<td>[[${user.uphone}]]</td>
<td>
<a th:href="@{/user/del(uid=${user.uid},uname=${user.uname})}">刪除</a>
</td>
</tr>
</table>
連結傳參
- a標籤的href傳參
<a th:href="@{/user/del(uid=${user.uid},uname=${user.uname})}">刪除</a>
- ajax發起get請求,傳參
var uid=12;
var url = "[[@{/user/del}]]?uid="+uid;
springboot異常處理
-
針對於同步開發使用。不能達到返回的前端不同的錯誤資訊(比如token過期,密碼有誤等等自定義的錯誤資訊).
-
使用瀏覽器測試請求:返回的是錯誤頁面。
-
使用postman測試:返回的是json資料。
-
異常處理機制:
ErrorMvcAutoConfiguration配置類中有三個核心的異常處理的bean:
1.BasicErrorController:對映路徑/error,出現異常tomcat會把請求轉到/error的處理器中。
errorHtml:瀏覽器請求的處理器方法,查詢錯誤檢視,如果查詢不到,則使用viewName為error的錯誤檢視。
error:非同步請求的處理器方法,直接返回json資料。
2.DefaultErrorAttributes:該物件中getErrorAttributes方法,生成了一個Map,該集合中包含了固定的錯誤資訊。
3.StaticView預設錯誤檢視,該檢視的名字叫:error
4.在四個靜態資源路徑下定義error/錯誤碼.html|error/4xx.html,5xx.html
5.怎麼擴充套件錯誤資訊,從DefaultErrorAttributes派生子類,注入容器,替換掉預設的bean物件。
-
日常開發中,仍然使用全域性統一異常處理:
- @ControllerAdivce,@ExceptionHandler,自定義異常,狀態列舉,響應體物件。
日誌整合
- 加入log4j2啟動器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
- 加入log4j2.xml到resources目錄
- 排除掉可能重複匯入的jar包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
mybatis整合
- 加入mybatis啟動器,mysql連線包,pom檔案resources配置。springboot預設使用HikariCP連線池。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>
</resources>
- application.java啟動類配置mapper介面掃描註解,事務註解
@MapperScan("com.javasm.mapper")
@EnableTransactionManagement
- application.yml 配置資料庫連線資訊,xml檔案掃描,連線池資訊,駝峰對映、別名等
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.14.241:3306/crm?characterEncoding=UTF8&useSSL=true&serverTimezone=Asia/Shanghai
username: root
password: root
mybatis:
type-aliases-package: com.javasm
configuration:
map-underscore-to-camel-case: true
mapper-locations: classpath:com/javasm/mapper/*.xml
redis整合
- 引入redis啟動器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
RedisTemplate
- application.java啟動類配置redis註解識別(使用註解玩redis生效),修改redis的預設序列化方式,預設是jdk(RedisTemplate內部採用的JDK預設的物件序列化機制,要求key和value儲存的物件 必須implements Serializable,存進reids的資料無法辨識),改為jackson。
- 修改後的配置對註解不生效,註解預設還是使用jdk的方式,且註解存的值只能通過註解取,手動get取為null
@SpringBootApplication
@MapperScan("com.javasm.mapper")
@EnableTransactionManagement
@EnableCaching // redis的註解識別
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<String, Object> template = new RedisTemplate();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
- application.yml 配置redis連線ip、埠、密碼等
redis:
password: root
- RedisTemplate的使用方法與原生reids稍有區別
@SpringBootTest
class ApplicationTests {
@Resource
private RedisTemplate<String, Object> rt;
@Test
public void testRedis(){
ValueOperations<String, Object> value = rt.opsForValue();
value.set("12",new ApplySimple(1,"啦啦啦",1001));
HashOperations<String, Object, Object> opsForHash = rt.opsForHash();
opsForHash.put("hashTest","123",new ApplySimple(12,"測試",123));
}
@Test
// 手動取註解存進的值,取不出來,為null
public void testRedisGet(){
rt.setKeySerializer(new JdkSerializationRedisSerializer());
rt.setValueSerializer(new JdkSerializationRedisSerializer());
ValueOperations<String, Object> value = rt.opsForValue();
Object o = value.get("apply::10");
HashOperations<String, Object, Object> opsForHash = rt.opsForHash();
Object hashTest = opsForHash.get("hashTest", "123");
System.out.println(o);
System.out.println(hashTest);
}
}
StringRedisTemplate
- StringRedisTemplate要求key和value必須都是String.需要手工把物件轉json字串,不常用
基於註解的使用
- 在啟動類上開啟redis註解@EnableCaching
- 重點有兩個註解:
- @Cacheable:註解到查詢方法上,表示先查詢快取中指定key,找到直接返回,找不到則執行方法,把方法返回值放快取。
- @CacheEvict:註解到insert,delte,update方法上,當資料發生改變時,把快取中對應的資料刪掉。
//unless:對返回結果做判斷,unless的條件為false時,加快取,為true時不加
//condition:對查詢條件做判斷,條件為true時,查快取,為false不查快取
@Cacheable(cacheNames = "blogs",key = "#bid",unless = "#result==null",condition = "#bid>0")
@Override
public Blog selectById(Integer bid) {
Blog blog = bm.selectByPrimaryKey(bid);
return blog;
}
@CacheEvict(cacheNames = "blogs",key = "#b.bid")
@Override
public boolean updateBlogById(Blog b) {
return bm.updateByPrimaryKeySelective(b)==1?true:false;
}
相關文章
- Redis 反序列化異常Redis
- 學習使用mybatis框架初遇異常MyBatis框架
- 使用log4j列印異常堆疊到日誌檔案
- (五)Redis 快取異常、應對策略Redis快取
- Redis快取篇(四)快取異常Redis快取
- 記 Laravel Observer 導致 Redis 佇列異常LaravelServerRedis佇列
- Redis快取的主要異常及解決方案Redis快取
- Mybatis實現條件IN查詢(foreach)和invalid comparison異常MyBatis
- 異常和異常呼叫鏈
- 異常篇——異常記錄
- 異常篇——異常處理
- Redis CVE-2020-14147導致例項異常退出Redis
- Mybatis、maven專案中整合log4j (17)MyBatisMaven
- 異常-異常的注意事項
- Java 異常(二) 自定義異常Java
- 異常-編譯期異常和執行期異常的區別編譯
- 異常?
- 異常
- SpringCloud SpringBoot mybatis分散式Web應用的統一異常處理GCCloudSpring BootMyBatis分散式Web
- mybatis-plus連線SQL Server2012分頁查詢異常MyBatisSQLServer
- 異常-異常的概述和分類
- 異常-throws的方式處理異常
- hibernate異常之--count查詢異常
- 兩種異常(CPU異常、使用者模擬異常)的收集
- jmu-Java-06異常-01-常見異常Java
- Java 異常表與異常處理原理Java
- restframework 異常處理及自定義異常RESTFramework
- MyBatis版本升級導致OffsetDateTime入參解析異常問題覆盤MyBatis
- 深入理解Redis事務、事務異常、樂觀鎖、管道Redis
- 【java】異常Java
- java 異常Java
- oracle 異常Oracle
- Java 異常Java
- 異常(Exception)Exception
- Java異常Java
- 異常JavaJava
- OutOfMemoryError異常Error
- 18異常