在做系統的時候,也是遇到了一些坑,開始不是很熟練,然後慢慢查找資料慢慢解決了,這裡将其列出來,以便以後可以繞開這些坑。
1、前端ajax、jQuery等問題
(1)在ajax與java後端傳遞資料的時候,傳遞給ajax的是一個data對象,ajax中調用對象中的屬性的時候,屬性名要一緻,調用對象的數組屬性的時候直接用data.num[i]的形式即可。主要是屬性名要一緻。
(2) 後端與ajax傳遞資料的時候,實體類的屬性名首字母最好小寫,這樣不容易出錯。
(3)ajax向後端傳遞參數的時候,在開始定義一個params,多個參數之間用逗号隔開。格式如下:
var params={
"num" : 1,//傳遞一個整數num,值為1
"string ": "dsfs",//傳遞一個字元串,值為dafs
};
(4)js中是無法使用Thymeleaf文法的,隻能使用HTML語言
在js中,如果要跳轉至某個頁面,直接href="" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" 或者連結src就行,不用th:href="" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ,這樣的形式。使用href表示的是向後端傳遞資料,是以内容是控制端的名稱
(5)在使用webuploader插件進行檔案的上傳的時候,jQuery中設計到幾個變量,uploader方法是實行檔案的上傳的具體方法。其方法中涉及到一個swf,這是webupload插件的一個插件,先要下載下傳将其導入本項目中,然後在js裡面設定swf為該檔案的路徑。另外,還有一個server,這個應該是一個PHP方法,即調入背景控制端,類似于ajax的URL一樣,通過調入背景控制端将檔案儲存在項目中,或者儲存在伺服器中。
(6)控制端向js傳遞資料,可以現在後端将資料放在model中,然後在HTML中擷取,并将其隐藏,然後再在js中擷取其值。
HTML:<input type="hidden" th:value="${blogId}" id="Blog_ID"/>
js:var url_param = $("#Blog_ID").val();
(7)在js引用路徑的時候,src中是不需要開頭加一個/的,加不加效果都一樣
(8)檔案上傳至項目中指定檔案夾,但是檔案夾内的内容不是瞬間更新,是以,目前端ajax調用這些檔案的時候,是無法找到該檔案的,隻有當項目更新了檔案夾裡面有這些檔案的時候才可以擷取到。
(9)onclick出發事件的參數為this表示傳遞的參數為此标簽本身。如
<a class="fancybox" href="javascript:void(0);" target="_blank" rel="external nofollow" ><img οnclick="selectImgPath(this)" style="width: 190px; height: 115px;float:left;margin-right:3px;" alt="image" src="www.baidu.com" /></a>
然後傳遞的參數就可以通路src的内容。如傳遞的參數為msg,調用src為msg.src表示的就是www.baidu.com
(10)src和href的差別:src用于替換目前元素,href用于在目前文檔和引用資源之間确立聯系。
src是source的縮寫,指向外部資源的位置,指向的内容将會嵌入到文檔中目前标簽所在位置;在請求src資源時會将其指向的資源下載下傳并應用到文檔内,例如js腳本,img圖檔和frame等元素。如<script src ="js.js"></script>當浏覽器解析到該元素時,會暫停其他資源的下載下傳和處理,直到将該資源加載、編譯、執行完畢,圖檔和架構等元素也如此,類似于将所指向資源嵌入目前标簽内。這也是為什麼将js腳本放在底部而不是頭部。
href是Hypertext Reference的縮寫,指向網絡資源所在位置,建立和目前元素(錨點)或目前文檔(連結)之間的連結,如果我們在文檔中添加<link href="common.css" target="_blank" rel="external nofollow" rel="stylesheet"/>那麼浏覽器會識别該文檔為css檔案,就會并行下載下傳資源并且不會停止對目前文檔的處理。這也是為什麼建議使用link方式來加載css,而不是使用@import方式。
2、Jpa分頁的問題
(1) jpa進行分頁查詢的時候,按照某個屬性列來進行查詢的方法為;
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1 ORDER BY ?#{#pageable}",countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1", nativeQuery = true)Page<User> findByLastname(String lastname, Pageable pageable);
(2) 在調用查詢所有進行分頁的時候,是可以直接調用jpa的findAll方法的,參數為pageable,但是這裡的以什麼為正序倒序和上面不同,上面的是表明,這裡的是對象的主鍵名,這裡的名稱要和對象中的屬性名要一緻,不然就會出現問題。也就是這裡要為blogid(對象中的主鍵名就為blogid)
(3)jpa根據某列查詢,并且查詢得到的結果集是根據某具體頁得到的結果
這種情況是和之前查詢所有的結果集是不一樣的,之前的是擷取所有的結果傳到表格中,表格中顯示規定大小的資料集,點選下一頁的時候自動顯示相關頁的資料。但是這裡穿的參數是具體的某頁,也就是說想要的傳回的結果集是根據某具體頁查詢得到的結果。這種情況下處理的代碼:
@Query(value="select * from blog where status =?1 ",countQuery="select count(*) from blog where status=?1",nativeQuery=true)
public Page<Blog> getBlogsByStatusForList(int status,Pageable pageable);
與之前的差別是這裡沒有将pageable參數傳遞到query中去,這樣傳回的結果集就是根據某具體頁查詢得到的結果
(4)在進行分頁查詢的時候,整個表的資料共有12條,查詢所有的時候不會出現異常,将全部的資料都設為同一狀态,即這種狀态共有12條資料,根據這種狀态進行查詢的時候,就會出現異常。但是将這種狀态的資料改為有9條的時候就不會出現異常。異常:java.lang.IllegalArgumentException: Could not locate ordinal parameter [2], expecting one of [1]
(5)jpa進行模糊比對,并且進行分頁查詢。
示例:
@Query(value="select * from blog where status =?1 and key_word like CONCAT('%',?2,'%')",countQuery="select count(*) from blog where status=?1",nativeQuery=true)
public Page<Blog> getBlogsByStatusForList(int status,String key_word,Pageable pageable);
(6)在将json的page格式的字元串格式的内容轉換為json對象,需要将page<>具體化,即建立一個對象實作page接口和Serializable接口。
(7)在使用jpa層的時候出現了Unknown column 'blogId' in 'order clause'錯誤,查詢了下,這是在使用分頁進行查詢的時候,順序是按照blogId進行排序的,不過這裡的查詢的是按照表中的blog_id這一列來進行倒序或者正序的。是以,這裡的在sort類的參數中應設定的值為:blog_id。源代碼如下:
Sort sort=new Sort(Direction.ASC, "blog_id");
Pageable pageable=new PageRequest(pageNumber-1, pageSize, sort);
4、spring boot架構的問題
(1)添加微服務的依賴的時候,需要注意spring boot的版本和eureka的版本問題,spring boot的版本與eureka的版本是一一對應的,版本不對就會不相容,就會出現問題。為了使項目能夠支援比較新的技術,最好使用最新版的spring boot和eureka。版本對應關系:https://blog.csdn.net/russle/article/details/80865288。這裡給出依賴:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/libs-snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
如果老的版本有些功能是不能支援的,比如spring boot1.x.x版本的就不支援jpa的分頁功能,是以最好使用最新版本的spring boot和eureka。
(2)spring boot在建立spring cloud支援的時候需要的spring boot2.0.0以上的版本 是以需要将預設的2.1版本的改為2.0.0以上的版本,而有些版本是有問題的,如果遇到版本更新pom檔案後依然出現問題,可以更改2.0.X的數字,例如,2、3、4等版本型号
(3)項目的熱部署依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>true</scope>
<optional>true</optional> <!-- 這個需要為 true 熱部署才有效 -->
</dependency>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork> <!-- 如果沒有該配置,devtools不會生效 -->
</configuration>
</plugin>
(4)在兩個項目中的,一個項目讀取另一個項目中的圖檔資訊時,如果對象隻是儲存着該圖檔的相對位址,則在顯示的時候如果路徑僅僅是相對路徑,就會無法顯示路徑,因為在另一個項目中相對路徑是相對于本項目中的相對路徑。
(5)運用security後js css等靜态檔案預設是會被攔截的,解決方案:https://blog.csdn.net/malachi95/article/details/53641541