跳到主要內容

發表文章

目前顯示的是 九月, 2012的文章

除錯 - java.lang.IllegalStateException: getOutputStream() called

今天碰上的這個錯誤訊息是在JSP頁面發生

ServletResponse.getOutputStream()
ServetResponse.getWriter()

這兩個方法都會有可能在JSP輸出頁面內容的時候被調用
當其中一個方法被調用過後,再呼叫另一個方法就會報錯誤
解決的方法不外如下:

out.clearBuffer();                           //清除buff
out = pageContext.pushBody();    //更新out的內容

範例 - JavaScript 存取 Radio Button

簡單來說就是逐一比對相同name屬性的input控制項

HTML part:

<form id="demoForm" method="post" action="...">
<input type="radio" name="statisticType" value="region" checked="checked" />依地區
<input type="radio" name="statisticType" value="time" />依時間<br />
</form>

JavaScript part:

var sType;
var demo = document.getElementById("demoForm");

for (var i = 0; i < demo.statisticType.length; i++) {
    if (demo.statisticType[i].checked) {
        sType = demo.statisticType[i].value;
        break;
    }
}

alert(sType);

Java String型別筆記

1.System.out.printf()是從C那邊取得的方法
   String demoStr = "a %s boy which is %d feet height";
   System.out.pintf(demoStr, "litle", 15);

   字串中的%s,%d 分別會被替換成字串little、數值15
   String.format()方法具有相同的使用方式及效果
   例如:string temp = String.format(demoStr, "litle", 15);

   以下為常用替換表示,大小寫區別在輸出的字串以大寫或小寫輸出
   %%  -            用來在字串中表示%
   %d  -             以10進位整數格式輸出,可用於byte、short、int、long
   %f  -              以10進位浮點數格式輸出,可用於float、double、Float、Double、BigDecimal
   %e、%E  -    以科學記號浮點數格式輸出
                        %e指輸出格式遇到字母以小寫表示,%E則為以大寫表示
   %x、%X  -   以16進為整數格式輸出
   %s、%S  -   以字串格式符號輸出
   %c、%C  -   以字元符號輸出
   %b、%B  -   輸出blloean值

   另一個較常見的替換輸出的需求則是在文字左側補上 0
   例如月份可能不想用 2016/1 而是想用 2016/01
   此時可以直接用 String.format("%02d", number); 這樣的方式處理,上色處為0的位數
   上面那行如果輸入數字1會吐字串01回來,數字11則吐字串11

2.String以+運算符大量連結字串時常會被詬病效率低的因素
   在串聯字串相當簡單的情況下,使用String是可以接受的方法
   例如:String temp = "aaa" + "bbb" + "ccc";
   此時使用+運算符會比StringBuilder跟StringBuffer…

解讀JavaScript的匿名函式寫法

參考文章

滿多的情況下我們會看到下面這一種寫法
(function(m) {
    alert(m);
})("Hello");

解讀方式是 ( 實際上執行的function內容 )( 參數 );
等同於下面這段
var x = function(m) { alert(m); };
x("Hello");

或是更普遍的寫法
function y(m) {
    alert(m);
}
y("Hello");

以上三種寫法結果相同,差別在於第一種寫法不會留下任何函數或變數
對於一次性的動作來說,可以做到真正的船過水無痕

至於在jQuery Plugin開發時,習慣上會寫成以下的格式
(function($) {
//Plugin可以放心地用$代替jQuery
    //不必擔心網頁可能被設了jQuery.noConflict()
    //將$符號保留給其他Javascript Library使用
})(jQuery);

另外還有細節需要注意
有時候會看到傳入 "window" 作為匿名函式的參數

(function(window){
       ...// original code
})(window);

這是因為JavaScript的全域變數及函式是掛在 window 這個物件底下
如果要在函式中使用全域變數或全域函式
JavaScript 的找尋方法是 區域 -> 找不到再找外層 -> 找外層loop -> window
如果將 window 物件作為函式的參數引入,window物件就變成了函式的區域變數之一
這樣就省略了中間那些 "找不到,再往外一層找" 的過程
多少能提升一些效率