看題目可能是扯皮,其實還是有很多專業知識的。從最開始沒有注意到設計原則,到后面的jquery實戰技巧,都是今天一天碰到的問題。
每天整理一點點,每天收獲一點點。
關於軟件設計
在設計系統結構的時候,一些軟件設計方法,還是很重要的。
比如開閉原則,開閉原則就是:
- 對擴展是開放的
- 對修改是關閉的
要做到上面兩點,就需要在設計應用架構時,理清核心的需求點。完成一個解決問題需求的最小的、最核心的設計結構。其他的業務邏輯或者應用需求,應該都是基於這個核心結構進行擴展。
再來說說軟件設計的6大原則:
- 開閉原則:即擴展式開放的;修改是關閉的。
- 單一職責原則:避免職責擴散,每個類都應該僅完成一個功能
- 里氏代換原則:子類可以擴展父類的功能,但是不能改變父類原有的功能
- 依賴倒置原則:解耦高層次與低層次實現的關系,采用接口之類的方法進行解耦
- 接口隔離原則:客戶端不應該實現不需要的接口方法
- 迪米特法則:對象之間盡量保持最少的依賴關系
這幾種法則,還得慢慢悟啊~
關於Java
在Java類中獲取當前CLASS的路徑
背景
核心包依賴於一個service,我通過Spring的方法獲取到Spring mvc中的上下文,然后拿到bean。
public class BeanUtil {
/**
* 獲取當前web應用的spring上下文對象
* @return
*/
public static ApplicationContext getWebApplicationContext(){
return ContextLoader.getCurrentWebApplicationContext();
}
/**
* 根據bean的id獲取bean對象。
* @param beanId bean的id
* @return Object
*/
public static Object getBean(String beanId){
if (isEmpty(beanId)){
return null;
}
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
return wac.getBean(beanId);
}
private static boolean isEmpty(String beanId) {
return beanId == null || beanId.trim().equals("");
}
}
由於設計上要求解耦核心包與運行時的依賴關系,所以不能使用這種方式。
於是就把service改造成了單例工廠,問題來了...單例工廠依賴於運行時的目錄!這個目錄是通過spring mvc獲得的!這下難住我了...
試了一些方法:
System.getProperty("user.dir")
上面獲取到的是JRE的目錄,無法滿足需求。
XXX.class.getClassLoader().getResource(File.separator.toString())
通過上面的方法就可以回去當前類編譯出來的class的路徑,通過這種方式也可以獲得web容器發布后的地址。
String path = this.getClass().getClassLoader().getResource(File.separator.toString()).getPath();
Java中的回調
在Java中,其實也可以實現回調,不過就是傳入一個接口而已!
interface ICallBack{
void run();
}
class CallBackClass implements ICallBack{
public void run(){
System.out.println(System.currentTimeMillis() );
}
}
class Controller{
public ICallBack CallBackObject = null;// 引用回調對象
Scanner input = new Scanner(System.in); //讀取命令行輸入
public Controller(ICallBack obj){
this.CallBackObject = obj;
}
public void Begin(){
while(input.next() != null){
CallBackObject.run();
}
}
}
public class Callback{
public static void main(String[] args) {
Controller obj = new Controller(new CallBackClass());
obj.Begin();
}
}
關於靜態塊引起的BUG
說來也巧,昨天剛看過《編程思想》,包含靜態塊的類加載的步驟,今天剛好遇到了這個問題。
簡單描述下問題背景
我們在Java應用中需要使用嵌入式的Jruby,這樣就需要啟動ScriptContainer來編譯ruby。而ScriptContainer在JVM只會維護一份,在我們的代碼中是這樣的:
static{
scriptContainer = new ScriptContainer();
}
由於之前使用Spring的上下文進行初始化,它會在web容器啟動時就執行。后來改成單例工廠,就沒有觸發scriptContainer的初始化。
靜態塊在沒有任何觸發類加載的情況下,是不會執行。只有當你創建一個類的對象,或者訪問了類的靜態內容,才會觸發。
因此投機取巧的使用下面這種方式就解決了問題:
//在類中添加靜態變量
class XXX{
public static String a = "";
static{
//todo
}
}
//然后在容器初始化時執行:
XXX.a = "a";
關於Jquery
一般在使用JQuery的時候都會使用到大量的DOM操作,此時就容易出現各種性能問題。
減少DOM重繪
如果遇到大量的創建對象,應該減少DOM的重繪:
a.append(xxx);
a.append(xxx);
a.append(xxx);
a.append(xxx);
a.append(xxx);
a.append(xxx);
應該改成:
var html = xxx+xxx+xxx+xxx+xxx;
a.append(xxx);
使用事件捕獲,避免大量的事件綁定
如果你有一個表格,表格會動態創建一些內容,那么如何為這些內容添加事件呢?
可以采用事件的機制:
$("#tableId").click(function(event){
var target = $(event.target);//包裝成Jquery對象
if(event.target.nodeName === "TR"){//驗證是否是點擊到了某一行
//上面的校驗方法不是很好,如果有其他更優美的方式,可以留言哈!
}
});
jquery驗證、移除、添加class
$xxx.hasClass("classname");
$xxx.removeClass("classname");
$xxx.addClass("classname");
jquery添加CSS樣式
$xxx.css("width","250px");
自適應高度的輸入框
當你輸入內容時,會自動計算高度:
//首先是html
<textarea class="form-control" id="textid" style="height:500px;" onpropertychange="this.style.height = this.scrollHeight + 'px';" oninput="this.style.height = this.scrollHeight + 'px';"></textarea>
//然后是script
$textid = $("#textid");
$textid.change(function(){
$textid= $.parseJSON($textid.val());
$textid.css("height",$textid.scrollHeight+10+"px");
});