本篇記錄項目維護過程中印象稍微深一些的點,算是一些知識點罩息,有新發(fā)現(xiàn),也有常規(guī)錯誤礁遣,略微記之。
ajax跨域保留session
Controller可使用@CrossOrigin
注解允許跨域碗殷。默認情況下劣针,瀏覽器ajax跨域請求不會保留session,即每一次請求都是一個新的session亿扁。保留session的方法如下:
$.ajax(url, {
type: "POST",
data: data
xhrFields: {
withCredentials: true
},
crossDomain: true
})
這不是一個徹底的解決方案,如果頻繁的按照上述方式進行跨域請求鸟廓,瀏覽器會報錯从祝。本項目中跨域且保留session本身就是為滿足某個奇葩需求而妥協(xié)的解決方案,最好還是避免這種做法引谜。
jstl
vue牍陌、angularJS的表達式某些思想、形式類似于jstl员咽,但是重新拿起jstl還是有很大的痛苦毒涧。
拼接構建字符串
字符串變量是可以多次set的,每一次set與前一個值拼接即可
<c:set var="str" value="''"/>
<c:set var="str" value="${str}'a'"/>
<c:set var="str" value="'${str}'b"/>
<c:set var="str" value="'${str}'c"/>
${str} //str='abc'
遍歷對象屬性
以下示例讀取對象obj的屬性贝室,并且拼接到objStr字符串中:
<c:forEach var="field" items="${obj['class'].declaredFields}" varStatus="stat">
<c:if test="${not empty obj[field.name]}">
<c:set var="objStr"
value="${stat.first ? '' :objStr}&${field.name}=${obj[field.name]}"/>
</c:if>
</c:forEach>
這種方式對處理pojo很有效契讲,復雜的對象還存在隱患。
jsp分頁滑频,輪子造起來
無論字段命名多么別扭吧捡偏,分頁對象這樣了:
public class PageDO implements Serializable {
private int currentPage = 1;//當前頁碼 默認為1
private int pageCount = 10;//每頁顯示數據條數 默認為10
private int totalCount = 0;//總條數
private int totalPage = 0;//總頁數
private int startIndex = 0;//開始條數
private List<Integer> pages;
...省略get set
}
分頁的代碼單獨放到一個jsp文件中,作為一個通用組件存在峡迷。分頁基本信息為頁面大小與頁號银伟,其他參數通過 condition 對象傳入,conditionExt可以傳入額外的查詢條件绘搞,具體實現(xiàn)如下:
<div id="pageGro" class="cb">
<c:forEach var="field" items="${condition['class'].declaredFields}" varStatus="stat">
<c:if test="${not empty condition[field.name]}">
<c:set var="conditionStr"
value="${stat.first ? '' :conditionStr}&${field.name}=${condition[field.name]}"/>
</c:if>
</c:forEach>
<c:if test="${page.currentPage !=1}">
<div class="pageUp"><a disabled="true"
href="?${conditionExt}${conditionStr}¤tPage=${page.currentPage-1}&pageCount=${page.pageCount}">上一頁</a>
</div>
</c:if>
<div class="pageList">
<ul>
<c:forEach items="${page.pages}" var="item">
<li>
<c:if test="${item == page.currentPage}">
${item}
</c:if>
<c:if test="${item != page.currentPage}">
<a href="?${conditionExt}${conditionStr}¤tPage=${item}&pageCount=${page.pageCount}">${item}</a>
</c:if>
</li>
</c:forEach>
</ul>
</div>
<c:if test="${page.currentPage < page.totalPage}">
<div class="pageDown">
<a href="?${conditionExt}${conditionStr}¤tPage=${page.currentPage+1}&pageCount=${page.pageCount}">下一頁 </a>
</div>
</c:if>
</div>
tomcat啟動參數
tomcat的啟動參數可在 tomcat-path/bin/catalina.sh
或 tomcat-path/bin/satrtup.sh
中配置(window配置相應的bat文件)彤避。
在文件第一行加入配置即可,如下示例在windows上配置啟動參數 :
set "JAVA_OPTS=%JAVA_OPTS% -Dspring.profiles.active=test"
增加啟動內存也可以通過這種方式配置夯辖。
編碼問題
使用UTF-8編碼基本上已經成為開發(fā)共識琉预,但是ide、tomcat卻沒有這樣去默認UTF-8楼雹,這是亂碼問題的根源之一模孩。
url亂碼
tomcat默認沒有開啟url的UTF-8編碼,需在配置tomcat-path/conf/server.xml
文件中配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
URIEncoding="UTF-8"
redirectPort="8443" />
日志文件亂碼
日志文件會出現(xiàn)中文亂碼贮缅,需要在tomcat啟動參數加編碼配置:
set "JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=utf-8"
結語
本篇隨筆記錄了幾個維護過程中用到的小“技巧”榨咐,也有些稱不上技巧是因為實在是一些古老而又基礎的東西,在學新技能的時候給忽略乃至遺忘了谴供。