2015年8月23日 星期日

Google Analytics API的使用

Google Analytics 是 Google 的一個服務,可以幫助開發者來追蹤分析網站的流量、來源、訪問的瀏覽器等資料,Google提供了一個親切的可視化管理介面,並且可以在上面設置各種功能及觀看報表。

但是對於開發者來說,這樣的服務開不夠,開發者有可能會希望利用程式的方式進行Google Analytics 的追蹤查詢,所以Google又提供了Google Analytics API 的服務,讓開發者可以如使用Java等方式用程式來訪問Google Analytics。

最近在工作時,發現Google Analytics API 從2.0版升級到了3.0版本,所以很多以前用2.0版寫的程式都沒辨法跑了,必須要用到3.0版的方式才行。

在這裡我把如何申請Google Analytics及如何使用Google Analytics API做了一個紀錄,以供日後查讀:

一、申請及使用Google Analytics
首先你要先跟Google申請Google Analytics的使用,登入Google Analytics的首頁後,如果是第一次使用Google Analytics,要先設定想要追蹤分析的網頁網址。如果已經設定過了,就會進入報表頁面,如下所示:


按下"管理",可以看到如下畫面,分成"帳戶"、"資源"和"資料檢視"三個部份。

帳戶:為使用Google Analytics的管理者,可以設定不同的權限。

資源:為要追蹤分析的網站、行動應用程式或裝置 (如資訊站或銷售點裝置),在"資源"-->"追蹤資訊"-->"追錝程式碼裡"可以看到Google提供的JavaScript程式碼,需要放到想要追蹤分析的網頁程式碼中。

2015年8月17日 星期一

將Tomcat配置至Eclipse

這裡紀錄了在Eclipse中如何配置Tomcat的步驟:
  1. 配置Server
  2. 在Eclipse的Window-->Preferences-->Server-->Runtime Environments中,將Tomcat設到Server runtime environments中,


    選擇你要設定的Tomcat 版本,


    並選擇Tomcat的根目錄位址


  3. 引入Tomcat的Jar檔
  4. 對專案按右鍵,選擇Properties-->Java Build Path,到Libraries分頁裡面把Tomcat的Jar檔引入進來,如下所示,其中這裡用到了Variable的設置,所以下圖的"TOMCAT_HOME"事實上代表了Tomcat的根目錄位置。





    1. 在Eclipse做Java EE時,要記得把要用到的外步Jar設定到在布署時要放到的地方,如下圖,對專案按右鍵,選擇Deployment Assembly-->Add,再選擇"Java Build Path Entries",然後把引入的Jar選進來,例如下圖設為將外部Jar檔在伂署時放到WEB-INF/lib中,即Tomcat Web規則的位置。
    參考資料:

    1. Eclipse 的 Tomcat 環境設定
    2. JavaWeb:报错信息The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
    3. 新建java Web 出现的问题 球指点 急急!!!!

    解決在Eclipse無法正常顯示Unicode字元的問題(使用Properties Editor插件)

    在使用Eclipse IDE時,有時會碰到Unicode字元無法正常地顯示,例如:

    "即將推出"       變成      "\u5373\u5c07\u63a8\u51fa"

    這時只要使用Properties Editor這個插件(Plug-In)就可以很好地解決這個問題,下面就詳述解決的步驟:


    在Eclipse中,在上方選單中按下 Help-->Install New Software


    接著按下 "Add" 按鈕,在 "Add Repository"視窗中的 "Location" 打上 插件的位置 "http://propedit.sourceforge.jp/eclipse/updates/ (現在改成這個了: https://free.nchc.org.tw/osdn//storage/g/p/pr/propedit/eclipse/updates/site.xml)" , "Name" 可自取,最後按下 "OK"。




    此時會出現可供下載的Properties Editor選項,最下面的為最新版,其他的是之前的版本。



    按著按下 "Finish" 後將其按裝完成。

    此時會需重新啟動Eclipse,之後就會發現所有有Unicode內容的Property檔案左邊出現了 綠色的"P"圖案,如下所示:
    這樣之後打開檔案就可以正常顯示Unicode字元了,當然你也可以對檔案按右鍵用"Open With"選傳統的Text Editor來看原始的字元編碼內容。


    Note:
    現在官網上好像已經沒再維護且下載點也失連了,所以在存放一下備份以備之後使用,
    只要把 jar 檔放到 Eclipse 的 plugin 資料夾下,重新啟動 Eclipse 就可以了:
    備份下載:
    jp.gr.java_conf.ussiy.app.propedit_6.0.5.jar

    2015年8月2日 星期日

    Spring的注解(Annotation)事務(Transaction)範例與JUnit測試(Spring+Hibernate+JUnit)

    此篇文以一個簡單完整的範例,來說明在Spring中如何使用注解(Annotation)事務(Transaction)與其要注意的事項,並且以JUnit來測試

    首先我們要下載 aopalliance.jar ,不然在執行事務時可能會發生ClassNotFoundException。可以到The Central Repository中搜尋最新版的jar,這是因為aopalliance.jar已經從NetBeans內建的Spring中分離了出來,要自已手動下載並引入至Library。如下圖:

    在這裡,我們想要設計的構想其專案配置如下:
    詳述如下:

    1. DaoClass.java:操控資料庫的CRUD(新增、查詢、修改、刪除)之Class。
    2. Guest.java:代表資料庫中的資料表之ORM(Object-Relational Mapping) 物件。
    3. ServiceClass.java:使用DaoClass進行事務(Transaction)處理的Class。
    4. DaoTest.java:用來測試DaoClass的測試JUnit。
    5. ServiceTest:用來測試ServiceClass的測試JUnit。
    在這裡,Guest代表的Table設計如下圖所示(在此例中Table中不用儲任何紀錄,這裡只是做個示範):


    首先是在applicationContext.xml中配置要給Spring托管的內容,如連線池、SessionFactory、Annotation的支持設定、自動裝配Bean等等:

    2015年7月16日 星期四

    Spring MVC中Controller與View的傳值

    Spring MVC中很有趣的地方就是Controller可以為一個POJO或是一個普通的Java Bean,不用繼承如HttpServlet等類別,而要將請求導向View(例如JSP)時,也只要回傳String或ModeAndView等,不用使用像response.sendRedirect()或request.getRequestDispatcher("XXX").forward(request, response)等語法,使得單元測試變得更為簡單與容易。

    那麼View和Controller之間要怎麼溝通呢?在這裡以一個簡單的例子實作來展示一些在Spring中View和Controller之間溝通的方式。

    例子要實做的內容為,使用者一開始會進入一個表單輸入頁面,可以輸入名字及選擇稱謂(先生或小姐),按下送出按鈕後,會引導到招呼畫面,其中招呼內容包含輸入的名字及稱謂,而如果名字為雨果及稱謂為先生的話,招呼畫面的內容會稍有不同。

    首先先來看專案的配置:



    其中包括:

    1. dispatcher-servlet.xml:Spring的dispatcherServlet設定檔。
    2. FormView.html:一開始的表單輸入頁面。
    3. FormCheckResultView.jsp:招呼畫面。
    4. FormController.java:接收及轉送參數的Controller。
    在web.xml中,我們讓所有的url請求都先讓Spring處理:

    2015年7月15日 星期三

    Java Swing的DnD (Drag and Drop)

    Drag and Drop (DnD) 就是中文的拖放,例如我們平常在Windows下常常會用滑鼠直接將檔案從一個資料夾移到另一個資料夾、或是將影片檔直接移到播放器的介面上以播放影片,這些動作就是所謂的DnD,而在Java Swing裡也提供了DnD的實作功能。

    在這篇文章中,我們要演示一個簡單的DnD實作,在主要Swing畫面上放置一個JTextArea,當我們在Windows下把一個或多個檔案用滑鼠圈選移到JTextArea後,JTextArea裡會顯示所移上去的檔案路徑列表。

    程式非常簡單,首先我們可以建立一個Java Swing的專案(例如使用NetBeans),命名為 "DragAndDropTest"。並在上面放一個JTextArea,我們把它命名為 "dragAndDropJTextArea"。
    接著在DragAndDropTest的建構子中加上如下程式碼即可:

    public DragAndDropTest() {
            //產生各元件
            initComponents();
            //為dragAndDropJTextArea設置DropTarget,其用來接收DropTargetDropEvent,
            //可從DropTargetDropEvent取得Transferable物件,即被包裝的拖曳物件。
            dragAndDropJTextArea.setDropTarget(new DropTarget() {
                public synchronized void drop(DropTargetDropEvent evt) {
                    try {
                        //設置可接受的拖曳類型
                        //如果拖曳物件可支援檔案列表格式(javaFileListFlavor)
                        if (evt.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                            //接受拖曳
                            evt.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                            //得到Transferable物件,並將其轉成檔案列表格式(javaFileListFlavor),
                            //轉型成List<File>
                            List<File> droppedFiles = (List<File>) evt.getTransferable().getTransferData(DataFlavor.javaFileListFlavor);
                            //清空dragAndDropJTestArea的內容
                            dragAndDropJTextArea.setText("");
                            //將拖曳的檔案以檔案列表的方式顯示在dragAndDropJTestArea中 
                            //字顏色為黑色
                            dragAndDropJTextArea.setForeground(Color.BLACK);
                            for (File file : droppedFiles) {
                                //顯示檔案列表
                                dragAndDropJTextArea.append(file.getPath() + "\n");
                            }
                        } else {
                            //若拖曳的物件不能支持檔案列表格式,
                            //拒絕Drop
                            evt.rejectDrop();
                            //顯示錯誤訊息,字顏色為紅色
                            dragAndDropJTextArea.setText("錯誤:拖曳類型不支援檔案列表格式!");
                            dragAndDropJTextArea.setForeground(Color.red);
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            });
        }
    

    最後試試看結果:

    1. 如果拖曳的是一般檔案,即可在JTextArea中顯示檔案列表,如下所示:


    2.  如果拖曳的是不可轉成檔案列表格式的物件,則在JTextArea中會顯示錯誤訊息:


    最後附上源始碼下載:
    DnDTest.7z

    參考資料:

    1. How to drag and drop with Java 2
    2. Java中的Drag and Drop詳解與代碼示例
    3. java swing中實現拖拽功能示例_java

    2015年7月12日 星期日

    JSP/Servlet中web.xml裡的<welcome-file>與Spring MVC的<mvc:resources>

    在使用Spring框架時,如果在web.xml裡將所有的請求都交給Spring來處理的話,例如下面這樣:
    <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>2</load-on-startup>
        </servlet>
    <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    此時一些靜態資源可能就會因為沒有相應的Url Mapping或Controller來處理而無法回應靜態資源(如html, jpg, css, js等)的請求,這時我們可以有兩種方法來解決:
    1. 在Spring設定檔中,例如dispatcher-servlet.xml,加入如下內容,作用為再交由Spring的url mapping等處理之前,如果是靜態資源就交還給Web應用服務器管理:

    2. <mvc:default-servlet-handler />
      

    3.  在Spring設定檔中,加入以下內容,作用為對於符合"mapping"的靜態資源邏輯路徑(**表示任意子路徑),告知Web應用服務器去"location"的地方查找。例如對於以下設定,邏輯路徑為/resource/img/picture.jpg就會去找/img/picture.jpg:

    4. <mvc:resources location="/" mapping="/resource/**"/>
      
    這裡要注意的地方是,如果我們有在web.xml裡設定歡迎頁面,例如像下面這樣:

    <welcome-file-list>
            <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    

    然後請求Web應用程式的根目錄時,例如 http://XXX.XXX.XXX.XXX/projectName ,根目錄的url請求,即 "/" ,會被Spring所接收處理,假設Spring設定檔中設定如下:

    <mvc:resources location="/" mapping="/**"/>
    

    根目錄 "/" 將會與mapping內容符合,並以location的值 "/" 返回給Web應用服務器,Web應用服務器發現為根目錄("/")的請求時,就會根據web.xml裡的歡迎頁面設定查找index.html。

    也就是說,如果我們現在把index.html放在 "/html/index.html" 的路徑中,並且想要以http://XXX.XXX.XXX.XXX/projectName 的請求找到index.html的話,以下的設定方法是錯的