2015年9月26日 星期六

[JSP]圖片或檔案上傳進資料庫的方法

要做出上傳圖片的form表單,首先必須要在表單的標籤上增加一個enctype
如下圖



表單的enctype分為三種
  1. application/x-www-form-urlencoded
  2. multipart/form-data
  3. text/plain
預設是第一種編碼
第二種編碼在需要上傳檔案時使用
第三種是不對特殊字元進行邊碼

詳情的說明可以去查form的enctype屬性

再來要接收multipart/form-data時,servlet需要定義xml或用annotation定義
主要的屬性有:
  1. location: 上傳之表單資料與檔案暫時存放在Server端之路徑。
  2. fileSizeThreshold: 檔案的大小臨界值,超過的話檔案會被寫入上傳文件裡
  3. maxFileSize: 上傳單一檔案之長度限制
  4. maxRequestSize: 上傳所有檔案之總長度限制

3跟4的屬性預設是-1,表示不設限制

我習慣是用annotation定義,如下圖


最後你可以用
Part part = request.getPart("image");
或是
Collection<Part> parts = request.getParts(); 
來獲得part物件處理上傳的檔案資料

part物件可以使用getSize()與getInputStream()這些方法將圖片寫入資料庫
或是使用write()將資料寫入資料庫

詳細的方法文件請詳見java文件的java.servlet.http.part這隻class


以下是我將多張圖片寫入資料庫的程式片段

最後將list傳進dao裡呼叫資料庫就能進行多張圖片的存取

2015年9月22日 星期二

[雜談]學習程式的方法

常常有人網路上的教學都看不懂,老師上課聽不懂
範例程式也看不懂
老實講不管學那個程式語言都一樣
程式是邊想邊做來學習的,絕對不是用眼睛看程式碼跟他大眼瞪小眼你就會學會的
除非你已經相當有經驗看的懂那些程式碼在編譯執行後會怎麼樣運作
不然你初學時絕對100%不可能光用看的就學的會

就跟你不可能拿著數學課本用看的就可以學會數學一樣
你至少要想過並且算過或證明你想的是對的
或至少證明事情不是你想的那樣

像是下面的範例
Timer的範例

範例的程式碼有時就算看註解也不是很懂怎麼辦
很簡單,照個做一遍看看是怎麼回事


首先依照那範例的class名稱取的名字一樣的class建立起來



然後無腦的把程式碼整段複製貼上
如果有紅字看看是不是沒有附上需要的jar檔
不過這篇範例很棒一貼上一個錯誤都沒有

因為這是個計時器的程式,我想要看他怎麼運作的
於是我在run方法跟main方法下開始加點料
如果有讀點書的話
至少會知道main方法是程式起始點,所以在main方法的最前面new Date去看現在時間
然後在run方法裡面也system.out.println 時間一下看看他怎麼運作的

最後程式執行起來長這個樣子

我們就會知道說這個範例第二個參數的5000是從timer執行start()方法5秒後執行第一次
第三個參數的2000表示的是每次執行的間格是2秒

多數的程式註解或說明在初學時期都不是很清楚
想要建立觀念正確的方法就是去想並且去做
很多東西,看了不會懂,做下去就懂了

2015年9月13日 星期日

[Java]StringBuilder與StringBuffer常用的方法簡介

這兩個class主要是在字串串接很多字的時候,
由於String字串池的關係會生出很多字串物件,
為了節省記憶體就會使用使用StringBuilder跟StringBuffer

StringBuilder跟StringBuffer的方法幾乎一模一樣
關於兩者的差別請見右邊連結:連結在此
常用的方法有:

append() :這個方法是將字串接在字串的最後方
insert():這個方法可以將字串接在你指定的位置
indexOf():這個方法是尋找某個字串在現在這段字的那個位置,可以拿來搭配insert使用
reverse():可以將整個字串反轉順序,雖然我幾乎用不到
toString():就是將串好的字轉成字串輸出
length():現有的字串長度

以下就是簡單的範例



public class StringBuilderDemo {

 public static void main(String[] args) {
  
  StringBuilder sb = new StringBuilder();

  sb.append("This is ");

  sb.append("a star");

  System.out.println(sb.toString());//This is a star

  System.out.println(sb.length());//14

  System.out.println(sb.indexOf("star"));//10

  sb.insert(sb.indexOf("star"), "new ");

  System.out.println(sb.toString());//This is a new star

  System.out.println(sb.reverse().toString());//rats wen a si sihT

 }

}

2015年9月7日 星期一

[Java]&&, || 與 &,| 運算子的不同

在Java上有&&跟||這個運算子與 & 跟 | 這個運算子

雖然&&跟&都是and運算
||和 | 都是or運算
不過實際運作起來是有差別的
&&跟||運算時如果結果已經確定運算結果
他們就不會再撿查下一個敘述是否為真

比如說 A&&B
如果A已經是false了,那麼不管B是true or false,結果都是false
所以就不會去檢查B

像是下面的程式碼可以運作

public class Demo {



 public static void main(String[] args) {

  String a = null;

  String b = "a";



  System.out.println(a==null||a.equals(b));//true

  System.out.println(a!=null&&a.equals(b));//false

 }

}


然後&跟|不管如何兩個序述都會檢查
所以下面的程式碼就會跳nullpoint

 public static void main(String[] args) {

  String a = null;

  String b = "a";



  System.out.println(a==null|a.equals(b));//true

  System.out.println(a!=null&a.equals(b));//false

 }

}

[教學]如何在Eclipse中使用Github(Dynamic project)(後記)

有鑑於用之前的設定方式在共通作業時classpath常常會跳出問題
所以我試著去把跟eclipese有關的檔案全部ignore的方法
方法大致上跟前面兩篇一樣,請自行參閱前兩篇
上篇
下篇
不過設定的時候.ignore檔設定改成這樣

因為多設定了一些ignore檔案
所以拉下來的方法稍微不一樣



請務必在project explorer上右鍵不是點下面的Repository不然之後拉下來會長的很怪
Repository拉到本地端後不要點Repository右鍵
改成在project explorer右鍵來import


找到Git裡面的Projects from Git


再來選Existing local repository


下一步到這邊點Import as general project
並且把選擇你要的專案資料夾
下一步後按finish


資料夾還是一樣看不懂,沒關係按右鍵選擇Properties


與之前方法不同的是Project Facets畫面不一樣
點畫面中的Convert to faceted from...


這時會出現跟之前方法差不多的畫面
點選Dynamic web modile跟Java還有把Runtime的Server打勾
版本記得先跟團隊確認好不要選錯,按下ok就完成了


(‧ω‧‵)將將將將~~完成啦



2015年9月4日 星期五

[教學]如何在Eclipse中使用Github(Dynamic project)(下)

本篇要示範的是怎麼將已經推上去的檔案拉回本機端
如果要看怎麼將專案推上去請去看上一篇
文章的上篇內容請點此

首先點選Clone a Git repository,並且貼上你要拉下來專案的連結
如果在這一步出現 「Internal error; consult Eclipse error log.」
請到使用者user目錄下的「.eclipse\org.eclipse.equinox.security」資料夾內刪除「secure_storage」這個檔案,然後重新啟動eclipse。


如果你專案推了很多奇怪的支線進去你就要知道你要拉下來的是那一枝了
不過一般來說看到這畫面應該都是直接下一步才對


這個路逕是以後你要找檔案的地方,選個你方便找檔案的路徑


再來要複製專按,點你拉下來的Repository右鍵→Import Projects



選Import exsting projects並且點你要的專案內容後按下一步


然後按Finish後將專案拉下來


接著你點開專案會發現這專案完全看不懂
不過不要緊張這個可以解決


點選專案右鍵→Properties


選到Project Facets,先點到Runtimes那邊將你的server打勾
這邊我用的是Tomcat 8.0、接著Dynamic Web Module、Java、JavaScript打勾後按OK
剩下的設定也要跟將專案推上來的人同步
像是Java編碼跟Html或Xml的編碼等等


然後按ok後就會發現親愛的專案他回來了

[教學]如何在Eclipse中使用Github(Dynamic project)(上)

因為有人反應說Eclipse使用Github相當複雜
稍微整理一下後說一點簡單的設定說明

本篇介紹的是將專案上傳,下篇會介紹怎麼將上傳的檔案拉下來
如何將推上去的專案拉下來請看這篇
首先要把Git的repository打開

點選window→showview→other


然後在GIT選項找到Git Repositories,找不到Git選項上面直接打Git搜尋關鍵字


點選你要上傳的專案右鍵→Team→Share Project


選擇Git


然後挑選一個你比較好找到的位置放你的Git檔案,最後按Finish


複製你Git的連結


因為把.classpath跟.project也設成ignore時Eclipse專案設定會很困難
所以建議在團隊都使用Eclipse時
將Working Directory/Demo/.gitignore下的設定成這樣
只忽略/build/跟/.settings/資料夾
/.classpath跟 /.project就不設定,之後比較好拉檔案下來


再來將檔案commit上去


因為這是範例commit的內容沒有很認真寫,以後不認真寫內文你就知道發現bug要回溯到想要的時間超難找的


然後把剛剛複製的連結貼上來
下方是Git帳號密碼


推的時候把master add上去按finish


如果看到這個畫面沒有挑出錯就表示資料推上去了
要詳細之道怎麼拉資料的請點選下面連結

這是下篇的連結

2015年9月1日 星期二

[Java]Sting、StringBuffer與StringBuilder

String因為字串池的關係,當你做出下面的運算時

Sting x = "a"+"b"+"c"+"d";
JVM會產生四個String物件,所以當你有字要串起來時為了節省記憶體通常不會使用String
而會使用StringBuffer與StringBuilder
那麼StringBuffer與StringBuilder到底要選什麼用呢?首先要了解兩者的不同
StringBuffer與StringBuilder第一個不同在於兩者的效能有明顯的差距
如下面範例

public class Test {

    public static void main(String[] args) {

        int N = 77777777;

        long t;

        {

            StringBuffer sb = new StringBuffer();

            t = System.currentTimeMillis();

            for (int i = N; i --> 0 ;) {

                sb.append("");

            }

            System.out.println(System.currentTimeMillis() - t);

        }

        {

            StringBuilder sb = new StringBuilder();

            t = System.currentTimeMillis();

            for (int i = N; i --> 0 ;) {

                sb.append("");

            }

            System.out.println(System.currentTimeMillis() - t);

        }

    }

}


那麼要建立String就用StringBuilder囉?
其實不見得
StringBuffer是synchronized,也就是在多執行緒上他比較不會發生錯誤
StringBuilder在多執行緒的程式上就必須注意Thread safe的問題