顯示具有 JSP 標籤的文章。 顯示所有文章
顯示具有 JSP 標籤的文章。 顯示所有文章

2020年12月2日 星期三

Java EE - JSP 自訂標籤 - 自訂 EL 函式

紀錄一下 在 JAVA EE JSP 中,

如何建立客制的、自己所使用的 "自訂EL 函式 (or 自訂 JSTL tag 標籤函式)" 。


首先先設定下範例需求:

1. 想在 JSP 中,使用如下程式碼來使用,

<%@ taglib prefix="customEL" uri="/WEB-INF/customTld.tld"%>

${customEL:contains(list, value)}

第一行使引入自行定義的 TLD 檔,

第二行是使用了在自訂的 TLD 檔裡,被設定了的一個 function, "contains(list, value)",

作用為:傳入一個 Collection 的物件, "list" 和一個 Object 的物件  (或int 之類的簡單型別), "value",

然後傳回一個 boolean 值來表示在 list 中有無存在 value ,有的話回 true、否則回 false。

底層其實就是呼叫 Collection 的 contains() ,即 return list.contains(value);


2. 開始制作自訂EL函式,首先先實作其邏輯,就是一個簡單的 Class 和其內的 method:

CustomElFunction.java:

package com.xxx.tld;

import java.util.Collection;

public class CustomElFunction {
	public static boolean contains(Collection collection, Object object) {
		return collection.contains(object);
	}
}

可以看到只是一個很普通的 Class,裡面設定了一個呼叫 Collection.contains() 的 method,要注意的是 method 必須為 static 的。
因為之後會在 TLD 檔來以 package path + Class Name + Method 簽名的方式設定 自訂EL 函式,
所以如果有想要建立多個 自訂EL函式,可以在一個 Class 裡加入多個 method,
或是再建一個 Class 加入 method 都可以。

3. 再來是建立自己的 TLD 檔案,內容如下:

customTld.tld:

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
    
  <description>Custom JSTL functions library</description>
  <display-name>Custom JSTL functions</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>customEL</short-name>
  <uri>http://xxx.xxx.com/jsp/jstl/functions</uri>

  <function>
    <description>
      Returns true if this collection contains the specified element
    </description>
    <name>contains</name>
    <function-class>com.xxx.tld.CustomElFunction</function-class>
    <function-signature>boolean contains(java.util.Collection, java.lang.Object)</function-signature>
    <example>
      ${customEL:contains(list, value)}
    </example>  
  </function>

</taglib>

<descriptin>, <display-name>, <tlib-version>, <short-name> 等比較不重要可隨便填。
<uri> 只有在想用在 JSP 中用 uri 的方式時引入才需要,如是直接指定專案路徑下的相對位置,例如 /WEB-INF/customTld.tld , 則可以隨便填。

重要的是 <name>, <function-class>, <function-signature>,

<name> 是在 JSP 中呼叫自訂EL函式時要使用的函式名稱,
即 
${customEL:contains(list, value)}
中的 contains

<function-class> 為指定自訂EL函式所在的 Class path

<function-signature> 設定了自訂EL函式的函式方法簽名

最後,把 TLD 檔放到自己知道地方,從 JSP 中引入,就可以開始使用了,
例如如下:

xxx.jsp:
<%@ taglib prefix="customEL" uri="/WEB-INF/customTld.tld"%>

${customEL:contains(list, value)}

參考資料:

2017年4月29日 星期六

Instagram access token 的取得

今天要介紹的是如何取得Instagram的Access Token,及
用Access Token來取得使用者的資訊,如發佈的貼文(Instagram的貼文都是圖片或影片)圖片url等。

今天的需求是:

  1. 想要取得自己在Instagram上面的貼文圖片。
  2. 想要將取得的貼文圖片展示在網頁上。

使用技術:

  1. JSP
  2. Jquery

先講Instagram 官方步驟

  1. 一開始如果沒有Instagram帳號,請註冊一個。
  2. 進入Instagram的developer console,填好相關資訊註冊成為Developer。
  3. 自己建立一個網頁,假設網址為REDIRECT-URI
  4. Manage Clients建立一個App,其中"Valid redirect URIs"填上步驟3的REDIRECT-URI
  5. 進入
    https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code
    其中 CLIENT-ID 為已建立之App的 CLIENT-ID , REDIRECT-URI 即為自己建立網頁的網址。
  6. 待使用者登入並授權以後,會被引導至 REDIRECT-URI 頁面,並會以GET方式在Url後面帶上一個 code 參數。
  7. 這個 code 只能用一次,
    以以下參數
    client_id : App的client_id
    client_secret : App的client_secret
    grant_type : "authorization_code"
    redirect_uri : App的redirect_uri
    code : 剛剛得到的code
    請求 https://api.instagram.com/oauth/access_token,
    成功的話會在Response中得到access_token的參數,即我們要PO文資訊時需要的access_token。
  8. 要到access_token以後,就可以用來要各種使用者的資料了,在Developer console的左邊"Endpoints"中有提供各種Endpoints,這邊我們使用下面這個就好:
    https://api.instagram.com/v1/users/self/media/recent/?access_token=ACCESS_TOKEN
    請在ACCESS_TOKEN填上剛要到的,代表使用者的ACCESS_TOKEN,成功的話會回傳使用者最近的照片PO文資料。

下面以實測的程式碼來演示,

2016年9月27日 星期二

使用Java製作GIF動畫 - AnimatedGifEncoder

今天要來介紹一個對於用Java生成動態GIF特別好用的類別, AnimatedGifEncoder,
由Kevin Weiner所撰寫,

下面以一個簡單的例子來演示如何使用。

需求如下:

  1. 寫一個servlet,其接到request後可輸出一個GIF動畫。
  2. 在一個htm內用<img>的src接接看測試

實作的檔案結構如下:

各檔內容如下(AnimatedGifEncoder.java就不介紹了):

  1. index.html
    <!DOCTYPE html>
    <html>
        <head>
            <title>Animated Gif Test</title>
            <meta charset="UTF-8">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <style>
                /* 為img加上背景色,測試透明GIF動畫 */
                img {
                    background-color: black;
                }
            </style>
        </head>
        <body>
            <div>Animated Gif Test</div>
            <!-- 測試GIF動畫 -->
            <img src="AnimatedGif.do" />
        </body>
    </html>
  2. AnimatedGif.java
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package servlet;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.OutputStream;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import tools.AnimatedGifEncoder;
    
    @WebServlet(name = "AnimatedGif", urlPatterns = {"/AnimatedGif.do"})
    public class AnimatedGif extends HttpServlet {
    
        /**
         * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
         * methods.
         *
         * @param request servlet request
         * @param response servlet response
         * @throws ServletException if a servlet-specific error occurs
         * @throws IOException if an I/O error occurs
         */
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            OutputStream o = response.getOutputStream();
            response.setContentType("image/gif"); //設定-- header -- ContentType
            
            Color transparentColor = Color.WHITE;
            
            AnimatedGifEncoder encoder = new AnimatedGifEncoder();
            encoder.setTransparent(transparentColor); //設定透明色
            encoder.setDelay(100);  //設定frame之間的間隔 (毫秒)
            encoder.setRepeat(0);  //設定重覆迴圈次數(不設就是不重覆), 0:無限, 1:重覆一次...
            encoder.start(o);      //綁定OutputStream  
            
            //產生畫布
            BufferedImage generatedImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
            //產生繪圖工具
            Graphics2D graphics2D = generatedImage.createGraphics();
            for (int i = 0; i < 10 ; i++){
                //畫底色
                graphics2D.setColor(transparentColor);
                graphics2D.fillRect(0, 0, generatedImage.getWidth(), generatedImage.getHeight());
                //畫圓圈
                graphics2D.setColor(Color.RED);
                graphics2D.drawOval(i*3, 25, 50, 50);
                //加到GIF動畫frame中
                encoder.addFrame(generatedImage);
            }
            graphics2D.dispose(); //釋放資源
     encoder.finish();  //GIF動畫結束
            //串流輸出
            o.flush();
            o.close();
        }
    
        // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
        /**
         * Handles the HTTP <code>GET</code> method.
         *
         * @param request servlet request
         * @param response servlet response
         * @throws ServletException if a servlet-specific error occurs
         * @throws IOException if an I/O error occurs
         */
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }
    
        /**
         * Handles the HTTP <code>POST</code> method.
         *
         * @param request servlet request
         * @param response servlet response
         * @throws ServletException if a servlet-specific error occurs
         * @throws IOException if an I/O error occurs
         */
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }
    
        /**
         * Returns a short description of the servlet.
         *
         * @return a String containing servlet description
         */
        @Override
        public String getServletInfo() {
            return "Short description";
        }// </editor-fold>
    
    }
    
    
    
成果展示:

原始碼下載:
AnimatedGifEncoderTest.7z

參考資料:

  1. Java – How To Overlay One Image Over Another Using Graphics2D [Tutorial]
  2. 在Java應用程序中創建圖像的方法和技巧
  3. Is there a way to create one Gif image from multiple images in Java? [closed]
  4. 在Java中使用AnimatedGifEncoder生成GIF動畫
  5. [Android] AnimatedGifEncoder
  6. java将gif动态图片分开展示源代码简单示例

2016年8月20日 星期六

使用Ajax上傳檔案 - (Javascript, JQuery or AngularJS) + FormData

在以前我們要在網頁中傳送檔案資料時,通常會需要設計一個html Form,並設定Form的encype=multipart/form-data和準備一個input type="file",在User按下submit按鈕後,跟據Form
所設定的action="URL",將整個頁面request移動到action所指定的地方,例如Servlet,
等處理完後在將User導至其他網頁頁面。

但有沒有可能不要讓User被導到其他頁面,留在原頁面就完成檔案資訊的傳送呢?
答案是可以的,這邊就要利用新的javascript類別FormData和Ajax的技術來達到Ajax傳
送檔案(也可順便傳遞其他input資料)資料。


在這邊我們要利用Netbeans、Servlet3.0、Tomcat 8來實做我們的範例,
實現了三個版本的檔案上傳:Javascript、JQuery、AngularJS
首頁是專案檔案結構,如下圖:

所用的版本JQuery為v2.0.3、AngularJS為v1.5.8,
主要的重要檔案有:

  1. fileUploadAjaxExample.html
    給User上傳檔案的html網頁。
  2. FileUploadAjax.js
    處理檔案資料上傳的Javascript File.
    包含Javascript、JQuery、AngularJS三個版本。
  3. FileUploadAction.java
    用來接收檔案資料的servlet,這裡設定URL patter為/fileUpload.do
  4. web.xml
    設定檔,其中必須在要接收檔案的servlet中設定的tag,
    tag裡可以有以下的子tag設定:
    <location>         檔案存放位置 (使用Part.write(fileName)可以在寫入檔案,但如果fileName
                               為絕對路徑則以絕對路徑為準)
    <max-file-size>  最大檔案size
    <max-request-size>   最大request size  (例如POST的request size)
    <file-size-threshold>
       超過file-size-threshold的檔案request將會以臨時暫存的方式存到硬                                       碟中,預設為0
接下來我以來各別看下每個實作檔案的內容:

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月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的話,以下的設定方法是錯的

2015年6月27日 星期六

Struts簡單入門 - 簡易身份認證(使用NetBeans)

Struts是一個基於MVC(Model-View-Control)架構的Java Web框架,今天要以一個簡單的身份認證例子來初步地了解Struts的MVC概念精神。

下圖為一個Struts的簡單原理流程圖,其中在web.xml中會設定什麼樣的url要交由ActionServlet來轉發給處理邏輯(例如 *.do),JSP File相當於View的可視化介面,當JSP File要把表單(Form)中的參數傳給商業邏輯處理時,ActionServlet會去struts-config.xml中尋找對應Form裡指定目標url的Action(相當於Control)和相應要物件實例化Form的Bean類別,ActionForm(相當於Model)。之後在Action中處理商業邏輯,並指定一個轉送目標url,這時就會轉送到struts-config.xml中對應轉送標的JSP或Action等。

我們的範例專案檔案配置如下:

  1. login.jsp                  : 身份認證的輸入畫面。
  2. loginSuccess.jsp     : 認證成功的畫面。
  3. struts-config.xml    : Struts的配置設定。
  4. LoginCheckAction : 處理身份認證商業邏輯的Action。
  5. LoginFormBean     : 用來實例物件Form的Bean類別。



以下為程式碼,相關的解釋都在註解裡:

2015年3月15日 星期日

使用線上免費網頁樣式CSS風格(以JSP為例)

在撰寫網頁時,我們通常會為html另外寫CSS來設定其樣式,讓網頁各頁面的版面可以有一個統一的樣式風格,也比較好管理。

除了自己撰寫CSS外,還可以從網路上找到許多免費的樣式資源,可以免費的下載下來使用,有的是就是一個單統的CSS檔,而有的稍微用了其他的方法來匯入CSS檔(例如JQuery),而CSS的路徑的也要設正確。總之根據不同的免費CSS資源,需要稍微的修改一下才能使用。

Templated是一個提供各種網頁樣式的網站,有許多的免費樣式可以下載使用。因為在之前的使用上花了一點時間搞定,特在此紀錄一下以Templated網站中的一個樣式Transit為例的使用方法。

進入Transit頁面後(如下圖),可以在上面橫幅的右邊下載其樣式,在Elements的連結中可以點進去看到此樣式的各個html元件的樣子,可以看看自己喜不喜歡在下載使用。


下載下來解壓縮後,可以看到如下的檔案結構,其中根目錄的三個html是網頁範例,css、fonts、images、js各是CSS、字型、圖片和JQuery資料夾。

2014年9月25日 星期四

關於限制存取根目錄URL與welcome-file的問題記錄

這裡記錄了一個我曾經發生但不太懂的開發情況:
以下是JSP的安全權限設定:
<security-constraint>
        <display-name>ManagerConstraint</display-name>
        <web-resource-collection>
            <web-resource-name>iBeaconServerPages</web-resource-name>
            <description>Pages of iBeacon Project Server</description>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>Manager</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <display-name>TicketCheckerConstarint</display-name>
        <web-resource-collection>
           <web-resource-name>PagesAboutTicketChecker</web-resource-name>
            <description>Pages about Ticket Checker</description>
            <url-pattern>/welcomePage.jsp</url-pattern>
            <url-pattern>/ticketCheckUsers/*</url-pattern>
            <url-pattern>/guestFlowMonitor/*</url-pattern>
            <url-pattern>/logoutPage.jsp</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>TicketChecker</role-name>
            <role-name>Manager</role-name>
        </auth-constraint>
    </security-constraint>
可以看到,在根目錄下的所有頁面將限制由Manager存取,而/welcomePage.jsp、/ticketCheckUsers/*、/guestFlowMonitor/*和logoutPage.jsp限制由Manager和TicketChecker存取,以上四個頁面在url匹配時會先在TicketCheckerConstarint的權限設定中被匹配到,所以如果不設Manager的話,Manager將無法存取。

2014年8月6日 星期三

如何在html中的一個Form中使用多個按鈕進行不同動作,以JSP為例

有時我們會希望在同一個表單中(Form)建立多個按鈕來做出不同的行為,如新增、修改、刪除等不同的行為,這時我們就會用到多個按鈕,以下以JSP為例,設計name一樣,value不同的多個按鈕,form的action指向同一個Servlet,在Servlet中取得按鈕的value來知道要做什麼動作:

1.html中的程式碼如以下所示:
<form method="POST" action="XXX.do">
            <input type="submit" name="requestAction" value="新增" >
            <input type="submit" name="requestAction" value="修改" >
            <input type="submit" name="requestAction" value="刪除" >        
</form> 

2.url對應XXX.do的Servlet中的程式碼如下所示,利用名為requestAction的參數之值來判幾哪一個按鈕被按下了:
request.setCharacterEncoding("UTF-8"); //中文參數的解碼
String requestAction = request.getParameter("requestAction");
switch (requestAction) {
            case "新增":
                add();
                break;
            case "修改":
                modify();
                break;
            case "刪除":
                delete();
                break;               
        }
    }
p.s. 如果要在Java中以String型別做為switch的參數,需要使用JDK 7以上,以netBeans為例,可以以右鍵點擊專案,選擇 Properties-->Source,在下面的Source/Binary Format下拉選單中選擇JDK 7以的JDK即可

如何使用JSP的安全機制功能-以tomcat及netbeans為例

JSP的安全機制功能,可以很簡單地用宣告式的方法來進行設定,如以下步驟:

1.Tomcat中設定Role(角色)、身份(User)與密碼(Password)(採宣告方式,與程式獨立)
TomcatCatalinaHome/conf/tomcat-users.xml<tomcat-users>的標籤中,設定<user><roles>的內容,如以下所示:
<role rolename="Manager"/>
<user username="Hugo" roles="Manager" password="12345"/>

</tomcat-users>

意涵為有一個角色為Manager,有一個身份為Hugo,其角色為Manager,密碼為12345

其中CatalinaHome的位置可以在netBeans中Server按右鍵選擇Properties查得,如下圖所示:
2.之後在netBeans中打開web.xml,加入如以下標籤內容:

在JSP及Servlet之間傳送中文參數

在開發JSP、Servlet動態網頁時,常常會用到參數在頁面之間進行傳遞,例如在把一個JSP中的表單(Form)中的參數值傳給要處理的Servlet時,在Servlet端通常會使用如
request.getParameter("參數名值對中的名")

的指令去取傳進來的參數。在英文的環境下這些都是沒有問題的,不過如果現在要傳的參數值是中文時,就會發生得不到正確參數值的情況,遇到這種情況時,就必須要考慮到送收雙方的編碼一致問題,以下是兩種此問題發生的解法,分為參數傳送時是用GET還是POST,兩種情況的處理方式不相同,無法混用:

一、參數傳送是用GET時
假設送收雙方都決定要以UTF-8送收
1.送方因為是想要讓中文參數能利用URL傳遞,所以要進行遍碼,例如要傳送一個名為"requestAction"、值為"修改"的參數時,要用呼叫URLEncoder.encode()方法來進行參數的編碼,如下例所示

網址/request=<%= URLEncoder.encode("修改", "UTF-8")%>

2.收端要使用一樣的編碼來進行解碼,如下所示

String requestAction = new String(request.getParameter("requestAction").getBytes("ISO-8859-1"), "UTF-8");

上面程式碼的意思是將收到的參數從「ISO-8859-1」轉成「UTF-8」,如果伺服器的預設解碼不是「ISO-8859-1」的話要記得改成相應的編碼。
如果是Tomcat,可以在CatalinaHome/conf/server.xml中找到如下列字樣
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
此列表示預設編碼為「UTF-8」,如果沒有「URIEncoding="utf-8"」的話也可自己加入。
要注意的是如使用NetBeans的IDE來開發的話,它是用模擬的Tomcat Server來Run模擬結果的,所以這裡用的server.xml也是模擬的,可以在NetBeans中的Servers對Tomcat按右鍵選「Edit server.xml」來更改設置,如下圖:


二、參數傳送是用POST時
假設送收雙方都決定要以UTF-8送收
1.送方(通常為JSP)要設定用UTF-8送出資料,如加上以下程式碼(以JSP為例):
<%@page contentType="text/html" pageEncoding="UTF-8"%>

2.收方(通常為Servlet)要設定用UTF-8解碼接收的資料,如在取值之前加上以下程式碼(以Servlet為例):
 request.setCharacterEncoding("UTF-8"); //中文參數的解碼
解完碼後,再進行取值,如以下程式碼:
String requestParam = request.getParameter("gotParam");
這樣就可以正確地得到中文參數了

附錄:
在這篇Tomcat與UTF-8編碼中,有講到如何設定Tomcat可以對Get及Post的參數使用自訂如UTF-8的編碼來進行解碼。

2014年6月14日 星期六

在Linux下使用Tomcat、JSP連Mysql資料庫(配合Netbeans IDE)

在Linux下如果要使用及開發JSP動態網頁的話,通常會選擇使用Tomcat來作為JSP的伺服器,以下介紹如何在Linux的環境下安裝Tomcat

1.到Apache Tomcat的官網上下載Tomcat,下載下來後將個資料夾解壓縮後放到要配置的路徑下,這裡選擇/usr/share/java下,路徑可以自選,為了方便起見,以下用 $CATALINA_HOME  稱呼

補充:有人說還要再進行環境變數等設置,不過我沒有設就直接成功了,需要設的人可以參考這篇文這篇文

2.在命令列指令界面中到$CATALINA_HOME/bin下,打上以下指令開啟動Tomcat,
./startup.sh
及使用以下指令關閉Tomcat
./shutdown.sh
這時可能會發現有錯誤發生,通常為對資料夾權限不夠的關係,這時可參考這篇文的作法,回到$CATALINA_HOME路徑上一層的路徑中,打上以下指令開放權限
 
sudo chmod 755 -R 你的Tomcat資料夾名稱/*

3.啟動Tomcat後,打開瀏覽器在網址列打上 http://localhost:8080  就可連上Tomcat的預設管理頁面

接著要介紹如何簡單地配合Netbeans IDE來建立能連上Mysql資料庫的JSP網頁

2014年6月10日 星期二

如何向GCM Server傳送資料,以php、Java及JSP為例

向Google申請GCM成功,得到API Key、行動裝置也成功向GCM Server註冊得到Registration ID後,就可以開始由後台向GCM Server發送訊息,GCM成功拿到訊息之後,就會開始向對應Registration ID的行動裝置轉送訊息,當然,GCM Server並不會儲存Registration ID,Registration ID要由後台連同訊息一起傳給GCM Server才行。

以下的程式碼之先行作業為:
1.已向Google申請並得到API Key,假設為apiKey

2.行動裝置已經向GCM Server註冊得到了Registration ID,並已經將Registration ID傳給後台並存進資料庫中

3.資料庫此例為MySql,假設相關資訊為
   Host : localhost
   User : userName
   Password :  pass
   Database :  DB_Name
   Table      :   TB_Name
   Table只有一個欄位,名為regId,存放著Registration ID

一、先從php開始

2014年5月29日 星期四

如何在Linux的Debian系統中安裝phpMyAdmin

今天要紀錄的是如何在Linux的Debian系統中安裝phpMyAdmin,因為工作需要,同仁希望能使用資料可視化界面操作MySql而非純指令界面,於是上網尋找正確安裝並成功執行phpMyAdmin的方法,之前雖然成功安裝了phpMyAdmin,但卻卡在無法使用瀏覽器執行這步上,找了許多文之後,參考了以下這篇文

在Ubuntu上安裝Apache、MySql和PHP,配置php開發環境

成功地進行了phpMyAdmin的安裝與執行,重點為安裝完、修改文檔後要記得把/usr/share/phpMyAdmin的資料夾移到/var/www,特此在這邊紀錄下安裝與執行的過程

因為我的Debian系統已經裝了Apache和MySQL,所以跳過以下的步驟1和步驟2,直接從第3步驟開始

1.安裝佈署好Apache
2.安裝佈署好MySQL
3.因為phpMyAdmin是使用php寫成,所以我們要使用以下指令安裝php 5和 Apache php 5 module
apt-get install php5 libapache2-mod-php5
安裝完以後執行以下指令以進行Apache的重啟
/etc/init.d/apache2 restart
重啟後,可以先寫一個php網頁放到/var/www資料中測試看看能不能在瀏覽器中成功執行此php網頁,範例內容如:
<?php
echo "helloworld";
?>
假如檔名叫做 "test.php" 的話,打開瀏覽器,在網址列鍵入 "http://localhost/test.php" ,如果成功的話,應該要可以看到頁面顯示一行 "helloworld" 的文字
4.接著鍵入以下幾個命令,命令的意思我並不是很清楚,大概是要讓Apache和MySQL連接及php和MySQL連接吧