網頁設計師必備的工具:
Kemono
進化區
2015年9月1日 星期二
2015年6月11日 星期四
把 PDF 嵌入網頁中
需注意的一點,PDF 需要可以讓 Google Doc 找的到
網頁 from : 如何在網頁中嵌入 PDF 檔案?
http://www.qna.tw/how-to-embed-pdf-file-into-web-page
以下截自文章:
1.
把你的 PDF 原始檔上傳到自己網站上,例如:Examle.pdf
2.
利用下列語法,將線上瀏覽介面嵌入:
<|| iframe src=”http://docs.google.com/gview?url=pdf檔案網址&embedded=true” style=”width:600px; height:500px;” frameborder=”0″ ||><||/iframe||>
其中:
。http://docs.google.com/gview
使用Google的線上閱讀器的網址,它是由 Google Docs 所提供的工具。
。pdf檔案網址
例如上述檔案的網址就是:http://www.qna.tw/upload_file/EMASREPORT.pdf
但需注意,這個網址需要經過 Escape 處理,才不會出現語法衝突的問題。
。width:600px; height:500px;
就是設定閱讀器尺寸的 CSS 語法,也可以再加一些其他效果。
3.
完成後就可以線上閱讀了。但是,如果每天開啟網頁都立即載入的話,會太浪費頻寬。
所以可以在檔案的下載鏈結旁加入「線上閱讀」的鏈結,而在點擊後才開啟閱讀器的介面,就可以讓操作流程快速又便利了。
4.
程式碼範例:(詳細範例請看原範例)
function sample() {
if (jQuery('#pdf_viewer').size() > 0)
{
jQuery('#pdf_viewer').remove() ;
} else {
jQuery('#sample').append('<|| iframe id="pdf_viewer"
src="http://docs.google.com/gview?url=http://www.qna.tw/upload_file/EMASREPORT.pdf&embedded=true"
mce_src="http://docs.google.com/gview?url=http://www.qna.tw/upload_file/EMASREPORT.pdf&embedded=true" style="width:540px;height:540px;border:#888 solid 1px"
frameborder="1"||><||/iframe||>') ;
}
}
2014年9月22日 星期一
[轉貼文章]為什麼我們沒錯也要逼自己認錯
轉貼文章 https://tw.news.yahoo.com/blogs/society-watch/%E7%82%BA%E4%BB%80%E9%BA%BC%E6%88%91%E5%80%91%E6%B2%92%E9%8C%AF%E4%B9%9F%E8%A6%81%E9%80%BC%E8%87%AA%E5%B7%B1%E8%AA%8D%E9%8C%AF-075002702.html
------
朋友LINE我「晚上來吃飯」。原來她升高三的女兒倫倫,從上週末就,嗯,有點不愉快。朋友叫我去陪倫倫。
我問:「吵架?」
朋友忙否認,「沒事沒事,都是小事。」原來上上週末回婆家,看守寡的婆婆。可愛的孫女倫倫蹭著奶奶趴在大床上翻老相簿,看奶奶青春美豔逼人橫掃美軍俱樂部宴會照片,又是珍珠耳環又是大鑽戒殺氣沖天。婆婆挖出珠寶給倫倫試戴,兩人學007女郎搞笑自拍上傳。等到喊吃晚飯,倫倫下床去擺碗筷,婆婆隨手收拾。
睡前婆婆再拿出珠寶保養,發現耳環少了一隻。
婆婆焦心,獨自沒日沒夜地想,想著是夫妻倆到日本養珠勝地旅遊買的紀念,也算丈夫遺物,怎能沒了。忍了一禮拜,下個週末全家同車上館子聚餐時,一個煞車失靈,婆婆無預警爆炸了。
婆婆告訴倫倫:「我的東西,將來都是你的。可我還沒死呢,你急什麼?不過是個耳環,值得嗎?」
倫倫不懂,只見媽媽倒抽一口氣。等明白過來,倫倫又急又氣,正待分辯沒偷,黑暗中媽媽輕掐倫倫手背示意噤聲,一面忍怒勸慰奶奶別動氣,求情說小孩子難免犯錯,回家一定教訓。
我問:「老人家是否失智?」
朋友又慌亂否認:「呸呸呸別亂講。婆婆只是偶爾有點憂鬱症,東西亂擺忘了會懷疑到別人頭上,才把外傭辭了。我也跟倫倫說,老人家說不聽,你又不是不知道,跟她計較是自己氣死而已,幹嘛放在心上。偏偏這孩子氣她氣到整個禮拜不講話,是要逼死誰啊。你說說她吧。」
今晚飯後倫倫陪我看電視,卻戴著耳機,自顧盯著手機。問她看韓劇嗎,她把螢幕湊過來,是新聞影片,知名餅店製餅用上餿水油,群眾上門鼓譟退貨,店員含淚吃餅。這我也約略聽說,可是不懂,為什麼顧客要逼店員吃不好的東西,為了出氣嗎?
倫倫解釋,一批芝麻肉餅用了餿水油,別批沒使用。可是顧客拿了別批餅來退,說不相信餅店,別批一定也用了。店員吃給大家看,證明沒使用。
我不懂店員為什麼要吃,難道吃了顧客就信嗎?
倫倫說,因為店員生氣了。
氣顧客嗎?
她說不是,重播讓我看清楚,我說:「不用啦,你不需要陪我再看一遍。」
她說:「我看了幾十遍。」
看了不舒服的影片,為什麼要看幾十遍?
我們沉默看著螢幕上,顧客怒指別批餅也有事,要退;店員主張沒事,拒退。櫃台內像是老闆的阿姨插進來,負氣喊「我退給你」皮夾掏錢奉客。女店員擁前阻擋,齊喊「不要退」。
倫倫眼眶含淚。
倫倫說,「店員起初確和顧客衝突,但這時不是在氣顧客,因為顧客不知道別批餅有沒有用餿水油,只有餅店知道沒使用。所以知道的餅店需要對不知情顧客說明,說不通再換方法說。店員氣的是老闆息事寧人,以為真相得罪人,說不通,寧可不說,花錢消災。
不料顧客喊「若沒問題就不要退」。店員和這顧客雙方意見一致:不要餅店屈打成招、割地賠款,要釐清關鍵事實,別餅有沒有用餿水油?沒餿水油的餅就別退款,退了就是承認有餿水油。只有老闆一方夾在中間沒問題也退款,好比賭氣向顧客說「你說有就有,那你高興了吧」。認錯,就算冒認也有後患要承擔,結果店員背黑鍋。
因為老闆禁止她們反抗,所以店員沉默吃餅抗議。
收到退款是顧客收到訊息「這餅有事」;店員吃餅也是繼續發訊息給顧客,說「這餅沒事」。
就算顧客不相信,老闆也放棄,店員們都沒放棄自辯清白。
所以我崇拜店員們的堅強。」
我沒想到倫倫是這樣看事件,一時語塞。推測未必是餅店真相,卻道出她內心感受。
倫倫若有所悟,忽然撥了手機,跟對方聊起韓劇,把我晾一邊。
講了一個多鐘頭,倫倫才說:「還有喔,小姐你聽好,上次我真沒拿你的耳環。」
我一震。原來倫倫通話對象是奶奶。
一會收線後,我問:「你不是在氣奶奶嗎,怎麼聊得這麼開心?」
倫倫說:「我承認奶奶可以生氣,因為她不知道我有沒有偷,只有我知道。但媽媽叫我別講話,替我向奶奶求情的時候,我突然好害怕,是不是媽媽也懷疑我?所有人都以為我是小偷?是不是我真偷了?然後我回神明白了,媽媽明明曉得真相,可是不承認,還要我配合撒謊。」
「難道要媽媽叫你向奶奶嗆聲嗎?」
倫倫說:「要說有很多方法說,不用嗆聲。要是對方不接受,那我承認我談判失敗。有了經驗,我下次會做更好,想辦法讓對方接受。但無論結果成敗,不會比『我有說出來』更重要。
我氣的是媽媽。我想說真話,媽媽要我不能說。因為她怕冒犯老人家、指出權威犯錯就是大不孝,會被大家罵到死。
可是,奶奶並沒有要我們騙她。剛才奶奶回答我說,等她找回耳環就送我。
我相信奶奶不是壞人,如果我真沒拿,奶奶也想知道我沒拿。
我相信餅店顧客不是壞人,如果別批餅真的沒問題,他們也想知道沒問題。
只是局勢把老闆嚇壞,她太害怕了,沒辦法相信顧客講得通,結果每個人都受傷。」
我問:「你怎麼知道老闆害怕?」
「因為她受虐待時的自虐反應,跟奶奶發脾氣時我媽的慘狀一模一樣。」倫倫轉過頭,不讓我看見她心酸落淚。
為什麼我們沒錯也要逼自己認錯?
因為害怕。
我們自己不知道,沒想到身邊人早已看得比誰都清楚。
先用一分鐘體會這害怕。
------
朋友LINE我「晚上來吃飯」。原來她升高三的女兒倫倫,從上週末就,嗯,有點不愉快。朋友叫我去陪倫倫。
我問:「吵架?」
朋友忙否認,「沒事沒事,都是小事。」原來上上週末回婆家,看守寡的婆婆。可愛的孫女倫倫蹭著奶奶趴在大床上翻老相簿,看奶奶青春美豔逼人橫掃美軍俱樂部宴會照片,又是珍珠耳環又是大鑽戒殺氣沖天。婆婆挖出珠寶給倫倫試戴,兩人學007女郎搞笑自拍上傳。等到喊吃晚飯,倫倫下床去擺碗筷,婆婆隨手收拾。
睡前婆婆再拿出珠寶保養,發現耳環少了一隻。
婆婆焦心,獨自沒日沒夜地想,想著是夫妻倆到日本養珠勝地旅遊買的紀念,也算丈夫遺物,怎能沒了。忍了一禮拜,下個週末全家同車上館子聚餐時,一個煞車失靈,婆婆無預警爆炸了。
婆婆告訴倫倫:「我的東西,將來都是你的。可我還沒死呢,你急什麼?不過是個耳環,值得嗎?」
倫倫不懂,只見媽媽倒抽一口氣。等明白過來,倫倫又急又氣,正待分辯沒偷,黑暗中媽媽輕掐倫倫手背示意噤聲,一面忍怒勸慰奶奶別動氣,求情說小孩子難免犯錯,回家一定教訓。
我問:「老人家是否失智?」
朋友又慌亂否認:「呸呸呸別亂講。婆婆只是偶爾有點憂鬱症,東西亂擺忘了會懷疑到別人頭上,才把外傭辭了。我也跟倫倫說,老人家說不聽,你又不是不知道,跟她計較是自己氣死而已,幹嘛放在心上。偏偏這孩子氣她氣到整個禮拜不講話,是要逼死誰啊。你說說她吧。」
今晚飯後倫倫陪我看電視,卻戴著耳機,自顧盯著手機。問她看韓劇嗎,她把螢幕湊過來,是新聞影片,知名餅店製餅用上餿水油,群眾上門鼓譟退貨,店員含淚吃餅。這我也約略聽說,可是不懂,為什麼顧客要逼店員吃不好的東西,為了出氣嗎?
倫倫解釋,一批芝麻肉餅用了餿水油,別批沒使用。可是顧客拿了別批餅來退,說不相信餅店,別批一定也用了。店員吃給大家看,證明沒使用。
我不懂店員為什麼要吃,難道吃了顧客就信嗎?
倫倫說,因為店員生氣了。
氣顧客嗎?
她說不是,重播讓我看清楚,我說:「不用啦,你不需要陪我再看一遍。」
她說:「我看了幾十遍。」
看了不舒服的影片,為什麼要看幾十遍?
我們沉默看著螢幕上,顧客怒指別批餅也有事,要退;店員主張沒事,拒退。櫃台內像是老闆的阿姨插進來,負氣喊「我退給你」皮夾掏錢奉客。女店員擁前阻擋,齊喊「不要退」。
倫倫眼眶含淚。
倫倫說,「店員起初確和顧客衝突,但這時不是在氣顧客,因為顧客不知道別批餅有沒有用餿水油,只有餅店知道沒使用。所以知道的餅店需要對不知情顧客說明,說不通再換方法說。店員氣的是老闆息事寧人,以為真相得罪人,說不通,寧可不說,花錢消災。
不料顧客喊「若沒問題就不要退」。店員和這顧客雙方意見一致:不要餅店屈打成招、割地賠款,要釐清關鍵事實,別餅有沒有用餿水油?沒餿水油的餅就別退款,退了就是承認有餿水油。只有老闆一方夾在中間沒問題也退款,好比賭氣向顧客說「你說有就有,那你高興了吧」。認錯,就算冒認也有後患要承擔,結果店員背黑鍋。
因為老闆禁止她們反抗,所以店員沉默吃餅抗議。
收到退款是顧客收到訊息「這餅有事」;店員吃餅也是繼續發訊息給顧客,說「這餅沒事」。
就算顧客不相信,老闆也放棄,店員們都沒放棄自辯清白。
所以我崇拜店員們的堅強。」
我沒想到倫倫是這樣看事件,一時語塞。推測未必是餅店真相,卻道出她內心感受。
倫倫若有所悟,忽然撥了手機,跟對方聊起韓劇,把我晾一邊。
講了一個多鐘頭,倫倫才說:「還有喔,小姐你聽好,上次我真沒拿你的耳環。」
我一震。原來倫倫通話對象是奶奶。
一會收線後,我問:「你不是在氣奶奶嗎,怎麼聊得這麼開心?」
倫倫說:「我承認奶奶可以生氣,因為她不知道我有沒有偷,只有我知道。但媽媽叫我別講話,替我向奶奶求情的時候,我突然好害怕,是不是媽媽也懷疑我?所有人都以為我是小偷?是不是我真偷了?然後我回神明白了,媽媽明明曉得真相,可是不承認,還要我配合撒謊。」
「難道要媽媽叫你向奶奶嗆聲嗎?」
倫倫說:「要說有很多方法說,不用嗆聲。要是對方不接受,那我承認我談判失敗。有了經驗,我下次會做更好,想辦法讓對方接受。但無論結果成敗,不會比『我有說出來』更重要。
我氣的是媽媽。我想說真話,媽媽要我不能說。因為她怕冒犯老人家、指出權威犯錯就是大不孝,會被大家罵到死。
可是,奶奶並沒有要我們騙她。剛才奶奶回答我說,等她找回耳環就送我。
我相信奶奶不是壞人,如果我真沒拿,奶奶也想知道我沒拿。
我相信餅店顧客不是壞人,如果別批餅真的沒問題,他們也想知道沒問題。
只是局勢把老闆嚇壞,她太害怕了,沒辦法相信顧客講得通,結果每個人都受傷。」
我問:「你怎麼知道老闆害怕?」
「因為她受虐待時的自虐反應,跟奶奶發脾氣時我媽的慘狀一模一樣。」倫倫轉過頭,不讓我看見她心酸落淚。
為什麼我們沒錯也要逼自己認錯?
因為害怕。
我們自己不知道,沒想到身邊人早已看得比誰都清楚。
先用一分鐘體會這害怕。
2014年9月11日 星期四
老祖宗的智慧 - 通血管
轉載自網路文章
---------------------------------
通血管的古方,不管多嚴重都能通
---------------------------------
通血管的古方,不管多嚴重都能通
通血管的古方簡易製作法
原有的製作法較麻煩,而且效果可能也較差,因它經過煮沸濃縮,其功效已被打折。玆經過多次改良後,得到如下的簡易製作法並且其效果百分百不折扣(因沒加熱)。
準備下列材料:
1. 蒜頭150g:剝皮打碎。放置空氣中15分鐘以上,產生蒜頭素才有效。
2. 生薑150g:洗淨涼乾後切成小丁。
3. 蘋果醋250g:在超市購買。可用任何天然米醋代替。
4. 檸檬汁250g:購買新鮮貨搾汁。可到有機店購買德國進口的有機檸檬汁200cc/瓶,約160元。
以上四種材料 (一批量適合果汁機一次的量) 混合放入高速果汁機打成極細之泥狀即成,放入冰箱內冷藏。以上成品約有800ccc的量(使用前搖勻),每日服30cc~60cc(約2~4瓷湯匙),可酌加蜂蜜調和口味。如胃腸健康者,早餐前5分鐘以上服用,否則飯後服用。開始服用時,可由少量逐漸增加,視各人的適應度決定。如果有燥熱反應者可酌增檸檬汁或蜂蜜的比例。如果血脂肪及膽固醇較高者可酌增醋的比例。總之,其份量可依各人的体質及症狀輕重自由調配,不受約束。
當然萬物的功效沒決對百分百有效,因各人的体質及健康輕重狀況不同及年齡而有差異。但長期有恒的服用,是可顯現出其功效的。不妨試試。
PS :
1.請先將材料放入冰箱內冷藏後再打汁,才不會因打汁時產生過熱而減低功效。
2.也可使用其他醋代替蘋果醋,只要能強力袪血脂肪之醋(如天然的糯米醋等) ,皆可代用。
3.可酌加水稀釋,較能入喉。
4.服用後有可能會出現良好的反應 (反應的症狀及輕重依各人体質的不同而有差異,但在短時間內就會漸漸消除,也就是發揮效能的開始,請放心。如有很嚴重的反應致身體無法承受時,請速就醫),如輕度反應時,可繼續服用,如嚴重反應時,可減量或暫停服用,此反應不是服西藥的有害副作用。
2012年12月3日 星期一
2012年11月14日 星期三
[jQuery x AJAX] Cross Domain
今天在survey 跨網域問題,集合了大家的力量,終於成功了!
請看連結 :
1. jQuery除錯_訪問不同網域之服務出現「No Transport」錯誤
2. CRM2011 and Cross Domain calls Part 2
--------
不過,我最後試成功的是以下(還是要感謝官網的資訊):
----------------------------------------------------------
$.ajax({
type: "GET",
async: false,
crossDomain: true,
dataType: "jsonp",
url: saveMaskUrl,
jsonpCallback: function (data) {
alert("Save mask success.");
isOk = true;
}
});
----------------------------------------------------------
這段 code 也可以成功,但當第一次跨網段時,會出現一個 message 確認對話視窗,按確定後,才會成功;按否,則會失敗....
----------------------------------------------------------
jQuery.support.cors = true;
$.ajax({
type: "GET",
async: false,
crossDomain: true,
contentType: "application/json; charset=utf-8",
dataType: "html",
url: saveMaskUrl,
success: function (data, textStatus, XmlHttpRequest) {
//alert("Save mask success.");
},
error: function (XmlHttpRequest, textStatus, errorThrown) {
alert("Error: " + saveMaskUrl+"\n" + errorThrown);
}
});
----------------------------------------------------------
2011年12月14日 星期三
[Struts2] Simple UI Tags
文章轉貼自 here
之前我們介紹了一些 tags,主要都是輔助 programmers 完成頁面上資料的存取,在這裡我將開始描述關於顯示在頁面上與使用者互動的表單 (form)。不過,我先簡介一些共同有的 attributes,因為這些 attributes 如果在介紹 tag 時重複敘述,感覺過於累贅!
共同 attributes
共 同的 attributes 就是所有的 tags 都會擁有的,為了之後將重點放在各個 tags 上,我們就將這些 attributes 分開來介紹,這裡要注意的是,如果某個 attribute 的 type 屬於 String,那就表示該 attribute 的 value 只能接受字串,如果想要將 OGNL expression language 寫入,就必須在 expression 加上 %{} 符號 - %{ expression } - 這樣 Struts2 framework 就可以正確解析 OGNL 了!如果該 type 屬於 Object,那你就可以大方的將 OGNL expression 置入,無須加上 %{} 符號了!
Simple UI tags
上面描述的是共同的 attribute,以下將介紹一些 UI 相關並基礎的 tags,對於共同的 attribute 就不會重複提及。
1) Head Tag
對 於任何的 HTML 或 JSP 來說,要產生一個網頁通常都是以 開頭,對於 Struts2 提供的 來說,卻不同於一般的 HTML head tag,如果你試過 Struts2 提供的 head tag,你應該會發現,tag 本身並不作任何事情,而是在網頁中默默的幫我們加入一些檔案連結,這些檔案的連結目的在於支援其他的 tag 完成設定。在使用 Struts2 提供的 head tag 時,一定要放置於 HTML 的 head tag 之下,否則自動產生的檔案連結會放到不正確的位置而導致無法使用某些功能!
Struts 的 head tag 本身並沒有其他的 attribute 需要設定,我們可以簡單的使用:
這樣的撰寫就會自動幫我們產生一些檔案的連結。
2) Form Tag
Form tag 對於 UI 來說是最重要的 tag,因為他是所有 UI tag 的上層元件,如果對於 HTML 熟悉的話,form tag 的使用應該不會陌生,而且我們之前就看過蠻多的範例了!下表是一些 form tag 的 attributes (除了共同 attributes 之外):
在 上述眾多 attributes 中,最重要的莫過於 action 了!因為他主導整個 form 的目標 action,在這裡設定 action attribute 時要注意,我們無須填入 .action 的縮寫,因為 form 元件會幫我們完成,如果目標的 action 與現在是相同的 namespace,我們就無須填寫 namespace,否則我們就需要 namespace attribute 幫助我們找到 Action。每當 form 元件被執行時會有以下三種可能發生的狀況:
這 個 tag 對於你來說也是無可避免的!因為沒有此 tag,你就無法取得使用者的資料,所以這個 tag 也算是最常使用的!不過要注意的是 textfield tag 的 name 與 value attribute,一般來說,我們無需要指定 value attribute,因為我們只需要指定 name attribute 讓 OGNL 幫我們去 ActionContext 中取得對應的值來填入,當然,我們也可以填寫 value attribute,但是要注意的是,如果我們自己有填寫 value attribute,那 name 指定的 OGNL 所取到的值就不會顯示在 textfield tag 上了,這點要注意喔!以下是一些 textfield tag 的 attributes:
4) Password Tag
這 個 tag 跟 textfield 幾乎是一樣的,不過當使用者輸入字串時,所有的文字都會被包裝成其他的符號,以防資料外洩!這個 tag 的使用其實跟 textfield 是相同的,所以我就不多說了!以下是 password tag 的 attributes:
上 面列出的 attributes 中,幾乎跟 textfield 是一樣的,不過多了一個 showPassword attribute,這個 attribute 是讓我們設定是否要將 name attribute 中指定的 OGNL 取到的值顯示,在這裡我所謂的顯示不是大剌剌的用文字方式顯示,當然是有被遮蔽的顯示,不過從原始碼中還是可以看到原來的值,所以 showPassword attribute 預設值為 false,為的就是不要產生一些 security issues 來困擾 programmers,在這裡我也建議你不要將此 attribute 設定為 true!
5) Textarea Tag
同樣的,textarea 從開發角度上來說,與 textfield 並沒有太大的差別,主要就是提供使用者多行的輸入欄位!以下就是一些 textarea tag 的 attributes:
6) Checkbox Tag
這 裡的 checkbox 元件如果你認為跟 HTML 的 checkbox 一樣的話,那你就錯了!因為在 Struts2 提供的 checkbox 元件是一個單一 HTML 的 checkbox,這是什麼意思呢?一般的 HTML checkbox 提供了多個選項讓使用者選擇零或多個,但是這裡的 checkbox 只提供使用者一個選項,也就是選或不選。所以這個 checkbox 不同於 HTML 的 checkbox。這個 checkbox 只提供 Boolean 的功能,也就是說其對應的 property 一定要是一個 boolean property,如果要像 HTML 提供的 checkbox 有相同功能的話,要改使用 checkboxlist tag,現在不會提到!
以下是 checkbox tag 的 attribute:
看 到上面的 attribute 你一定會感到很奇怪,value attribute 已經是共同的 attribute 了,為何在這裡還會在重新點出呢?原因就在於 checkbox 元件還有一個 fieldValue 這會與 value attribute 搞混!所以在這裡要特別點名。
fieldValue attribute 中的值代表當此 form 被送出後,fieldValue 中填寫的值會真正被送到 Action 中對應的 property,而 value attribute 只是用來判斷此 checkbox 是否需要被勾選。當 OGNL 取得 ValueStack 中的值,會將此值寫入 value attribute 中 (任何一個元件都是這樣),使用者可以看到此 checkbox 是否有被選起來。所以 fieldValue 與 value attribute 之間不要弄混了!
另外,checkbox 所指定的 name attribute,其對應到的 property 需要是一個 boolean 型態,否則會無法運作!
在這裡列出了六種簡單的 UI tag 給你參考,這裡列出的都是針對單一的 property,之後我將介紹關於 Collection-based 相關的 UI tags。
之前我們介紹了一些 tags,主要都是輔助 programmers 完成頁面上資料的存取,在這裡我將開始描述關於顯示在頁面上與使用者互動的表單 (form)。不過,我先簡介一些共同有的 attributes,因為這些 attributes 如果在介紹 tag 時重複敘述,感覺過於累贅!
共同 attributes
共 同的 attributes 就是所有的 tags 都會擁有的,為了之後將重點放在各個 tags 上,我們就將這些 attributes 分開來介紹,這裡要注意的是,如果某個 attribute 的 type 屬於 String,那就表示該 attribute 的 value 只能接受字串,如果想要將 OGNL expression language 寫入,就必須在 expression 加上 %{} 符號 - %{ expression } - 這樣 Struts2 framework 就可以正確解析 OGNL 了!如果該 type 屬於 Object,那你就可以大方的將 OGNL expression 置入,無須加上 %{} 符號了!
Attribute | Type | Description |
---|---|---|
name | String | 用來設定 form 元件,並且會依照 name 所設定的值,將其對應到 Action 中的 property |
value | Object | 用來設定 form 元件中所包含的值 |
key | String | i18n 用 |
label | String | 設定某個 form 元件顯示的字串 |
labelposition | String | 設定 label 顯示的位置:left 或 top |
required | Boolean | 如果設定為 true,則該 form 元件的 label 會出現 * 符號 |
id | String | 相同於 HTML 的 id 屬性,通常用於 java script 與 CSS |
cssClass | String | 相同於 HTML 的 css 屬性 |
cssStyle | String | 相同於 HTML 的 style 屬性 |
disabled | Boolean | 相同於 HTML 的 disabled 屬性 |
tabindex | String | 相同於 HTML 的 tabindex 屬性 |
Simple UI tags
上面描述的是共同的 attribute,以下將介紹一些 UI 相關並基礎的 tags,對於共同的 attribute 就不會重複提及。
1) Head Tag
對 於任何的 HTML 或 JSP 來說,要產生一個網頁通常都是以 開頭,對於 Struts2 提供的 來說,卻不同於一般的 HTML head tag,如果你試過 Struts2 提供的 head tag,你應該會發現,tag 本身並不作任何事情,而是在網頁中默默的幫我們加入一些檔案連結,這些檔案的連結目的在於支援其他的 tag 完成設定。在使用 Struts2 提供的 head tag 時,一定要放置於 HTML 的 head tag 之下,否則自動產生的檔案連結會放到不正確的位置而導致無法使用某些功能!
Struts 的 head tag 本身並沒有其他的 attribute 需要設定,我們可以簡單的使用:
這樣的撰寫就會自動幫我們產生一些檔案的連結。
2) Form Tag
Form tag 對於 UI 來說是最重要的 tag,因為他是所有 UI tag 的上層元件,如果對於 HTML 熟悉的話,form tag 的使用應該不會陌生,而且我們之前就看過蠻多的範例了!下表是一些 form tag 的 attributes (除了共同 attributes 之外):
Attribute | Type | Description |
---|---|---|
action | String | 指定該 form 送出的目標 Action |
namespace | String | 目標 Action 的 namespace,預設值是目前的 namespace |
method | String | 相同於 HTML 的 method attribute,預設值是 POST |
target | String | 相同於 HTML 的 target attribute |
enctype | String | 若要使用檔案上傳,則填入 multipart/form-data |
validate | Boolean | 設定該 form 是否使用 javascript 驗證,當使用 Validation Framework 時,此 attribute 要設定為 true,驗證功能才能正常運作 |
在 上述眾多 attributes 中,最重要的莫過於 action 了!因為他主導整個 form 的目標 action,在這裡設定 action attribute 時要注意,我們無須填入 .action 的縮寫,因為 form 元件會幫我們完成,如果目標的 action 與現在是相同的 namespace,我們就無須填寫 namespace,否則我們就需要 namespace attribute 幫助我們找到 Action。每當 form 元件被執行時會有以下三種可能發生的狀況:
- 如果 action attribute 沒有被設定,則 form 的目標就會指向目前的 Action
- 如 果有指定 action attribute,form 就會根據 Action 的位置配合上 namespace 來設定目標。如果 namespace 沒有被指定,就會使用目前的 namespace。當我們在設定 action attribute 時,我們無須加上 .action 的延伸網址
- 如果 action attribute 所指定的值不屬於一個 Action,form 元件的目標就會直接將該值作為目標。這種情況下,我們就需要自己加上延伸網址 (如:.jsp, .html 等),並且我們的相對位址需要以 / 作為開頭,例如:/myApp/b.jsp。另外要注意的是,如果我們採用此種方法,即使我們指定 namespace attribute,form 元件也會自動忽略!
這 個 tag 對於你來說也是無可避免的!因為沒有此 tag,你就無法取得使用者的資料,所以這個 tag 也算是最常使用的!不過要注意的是 textfield tag 的 name 與 value attribute,一般來說,我們無需要指定 value attribute,因為我們只需要指定 name attribute 讓 OGNL 幫我們去 ActionContext 中取得對應的值來填入,當然,我們也可以填寫 value attribute,但是要注意的是,如果我們自己有填寫 value attribute,那 name 指定的 OGNL 所取到的值就不會顯示在 textfield tag 上了,這點要注意喔!以下是一些 textfield tag 的 attributes:
Attribute | Type | Description |
---|---|---|
maxlength | String | 指定 textfield 的可輸入最大長度 |
readonly | Boolean | 如果設定為 true,則該 textfield 就無法輸入字串 |
size | String | textfield 的長度 |
4) Password Tag
這 個 tag 跟 textfield 幾乎是一樣的,不過當使用者輸入字串時,所有的文字都會被包裝成其他的符號,以防資料外洩!這個 tag 的使用其實跟 textfield 是相同的,所以我就不多說了!以下是 password tag 的 attributes:
Attribute | Type | Description |
---|---|---|
maxlength | String | 指定 textfield 的可輸入最大長度 |
readonly | Boolean | 如果設定為 true,則該 textfield 就無法輸入字串 |
size | String | textfield 的長度 |
showPassword | Bololean | 使否將 OGNL 取到的值顯示在 value 中,預設 false |
上 面列出的 attributes 中,幾乎跟 textfield 是一樣的,不過多了一個 showPassword attribute,這個 attribute 是讓我們設定是否要將 name attribute 中指定的 OGNL 取到的值顯示,在這裡我所謂的顯示不是大剌剌的用文字方式顯示,當然是有被遮蔽的顯示,不過從原始碼中還是可以看到原來的值,所以 showPassword attribute 預設值為 false,為的就是不要產生一些 security issues 來困擾 programmers,在這裡我也建議你不要將此 attribute 設定為 true!
5) Textarea Tag
同樣的,textarea 從開發角度上來說,與 textfield 並沒有太大的差別,主要就是提供使用者多行的輸入欄位!以下就是一些 textarea tag 的 attributes:
Attribute | Type | Description |
---|---|---|
cols | Integer | 指定 textarea 的行數 |
rows | Integer | 指定 textarea 的列數 |
readonly | Boolean | 如果設定為 true,則該 textarea 就無法輸入字串 |
wrap | String | 相同於 HTML 的 wrap attribute |
6) Checkbox Tag
這 裡的 checkbox 元件如果你認為跟 HTML 的 checkbox 一樣的話,那你就錯了!因為在 Struts2 提供的 checkbox 元件是一個單一 HTML 的 checkbox,這是什麼意思呢?一般的 HTML checkbox 提供了多個選項讓使用者選擇零或多個,但是這裡的 checkbox 只提供使用者一個選項,也就是選或不選。所以這個 checkbox 不同於 HTML 的 checkbox。這個 checkbox 只提供 Boolean 的功能,也就是說其對應的 property 一定要是一個 boolean property,如果要像 HTML 提供的 checkbox 有相同功能的話,要改使用 checkboxlist tag,現在不會提到!
以下是 checkbox tag 的 attribute:
Attribute | Type | Description |
---|---|---|
fieldValue | String | 這裡所填寫的 value 是真正會被傳送到 Action 中的值,主要是 true 或 false,預設值為 true |
value | String | 這裡是用來判斷此 checkbox 是否會被勾選 |
看 到上面的 attribute 你一定會感到很奇怪,value attribute 已經是共同的 attribute 了,為何在這裡還會在重新點出呢?原因就在於 checkbox 元件還有一個 fieldValue 這會與 value attribute 搞混!所以在這裡要特別點名。
fieldValue attribute 中的值代表當此 form 被送出後,fieldValue 中填寫的值會真正被送到 Action 中對應的 property,而 value attribute 只是用來判斷此 checkbox 是否需要被勾選。當 OGNL 取得 ValueStack 中的值,會將此值寫入 value attribute 中 (任何一個元件都是這樣),使用者可以看到此 checkbox 是否有被選起來。所以 fieldValue 與 value attribute 之間不要弄混了!
另外,checkbox 所指定的 name attribute,其對應到的 property 需要是一個 boolean 型態,否則會無法運作!
在這裡列出了六種簡單的 UI tag 給你參考,這裡列出的都是針對單一的 property,之後我將介紹關於 Collection-based 相關的 UI tags。
訂閱:
文章 (Atom)