廣告

2014年12月28日 星期日

[Java] difference between ProcessBuilder and Runtime.exec()

ref

http://desert3.iteye.com/blog/1596020

http://stackoverflow.com/questions/6856028/difference-between-processbuilder-and-runtime-exec

2014年12月4日 星期四

[Use github to show(deploy) your profile html page][使用github發布html網頁]

[作業系統window 7 ]

如果想簡單發佈一個個人簡介的網頁,

可以考慮用github。


step1. 在github local端create project ,命名方式 => your github name.github.io
           ex:cihm.github.io
































step2. 將你的網頁相關檔案放到你local端 你剛創的 github路徑。



























step3. commit and sync



step4, 網址列打上your github name.github.io
           ex:http://cihm.github.io/

























樣本網路上有很多種,
可以參考
http://html5up.net/

他們都是響應式網頁設計(Responsive web design,通常縮寫為RWD,
也就是可以自適應各種裝置的大小。




2014年12月1日 星期一

[WebService _ first project_ use eclipse,tomcat][第一個專案(Hello World)使用tomcat and eclipse]

download tomcat7 ,
1.使用者變數JAVA_HOME ===> C:\Program Files (x86)\Java\jdk1.7.0_06
系統變數 path ===>C:%JAVA_HOME%\bin
2.啟動 tomcat => cmd=> cd C:\Program Files\apache-tomcat-7.0.56\bin , startup
3.在網址列打上 http://127.0.0.1:8080/ (管理介面)
4.設定Tomcat目錄下的conf資料夾內的tomcat-users.xml
 <role rolename="manager-gui"/> <user username="lewis" password="lewis" roles="manager-gui"/>
===============================================================================

eclipse基本流程

  1. Servlet網站的Project類型是Dynamic Web Project。
  2. 可以在Web.xml裡面設定Servlet對應路徑等,這邊勾選的"Generate web.xml deployment descriptor"指的就是那個xml(也叫做Deployment Descriptor)
  3. 增加一個Servlet,對新建的project點右鍵選New->Servlet:
  4. 預設URL Mapping是對應到和這個Servlet名稱一樣(這個例子是HelloWorld),可以修改Pattern
  5. 設定Target Runtime
    如果沒有設定Target Runtime這個時候Servlet沒有辦法Build。因為會需要Servlet相關物件,因此需要加入對應的實作class。使用Tomcat,所以要先把他加入才可以。
    先加一個Tomcat的Server。在View 「Servers」裡面選擇新增,並且選Tomcat 7(路徑同上一篇)
  6. 最後需要把那個Server的class加進去。對Project點右鍵「Properties」找到"Java Build Path"選擇"Add Library"選"Server Runtime"
  7. 增加get顯示頁面
    回到「HelloWorld.java」,設定doGet()的內容:
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
        ServletException, IOException {
            // TODO Auto-generated method stub      
            response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");

        String requestUri = request.getRequestURI();

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello world</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("Hello World from frisrt servlet");

        out.println("<form action='" + requestUri + "' method='post'>");
        out.println("<input type='text' name='name' />");
        out.println("<input type='submit' value='submit' />");
        out.println("</form>");

        out.println("</body>");
        out.println("</html>");

        out.flush();
        out.close();

    }
增加post顯示頁面
這邊是把輸入的東西在顯示出來:
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
        ServletException, IOException {
            // TODO Auto-generated method stub
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");

        String name = request.getParameter("name");


        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

               out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello world</title>");
        out.println("</head>");
        out.println("<body>");

        out.println("Hello: " + name);

        out.println("</body>");
        out.println("</html>");

        out.flush();
        out.close();
    }
把Server Start起來以後,可以再IE直接輸入: http://localhost/ServletSample/TestServlet
2

===============================================================================

設定Servlet連接

如何把一個Servlet從另一個Servlet區分呢?

  1. 靠設定檔。
  2. Servlet 3.0後增加了@WebServlet 標註功能
  3. java reflection and invoke

1. 靠設定檔

基本上會有一個Web.xml檔案(或者可以用annotation的方式設定),告訴我們的Container(Tomcat)當某一個路徑進來的時候,呼叫哪一個Servlet來處理。

servlet

這裡面的設定比較像servlet的對應。
這個裡面一定會有包含兩個element:
servlet-name:表示代表這個servlet的名字,方便其他部份reference。在整個web.xml是不可以重複的。
servlet-class:代表著這個servlet的Class名稱。這邊需要Fully Qualified Name, 也就是包含package名稱
那servlet下面還可以代入預設參數。這個意思是,我們可以再處理request的時候,透過getInitParameter()的方式讀取一些預設在這邊的參數。
格式是init-para表示一個參數,而其下面則是param-name和param-value代表著key, Value。
servlet設定範例
<servlet>
    <servlet-name>Log4JInitServlet</servlet-name>
    <servlet-class>com.ws.controller.Log4JInitServlet</servlet-class>
     <init-param>
      <param-name>log4j-properties-location</param-name>
      <param-value>/WEB-INF/properties/log4j.properties</param-value>
     </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

servlet-mapping

這個部份是要設定什麼路徑使用什麼Servlet。
有兩個基本element:
servlet-name:那一個servlet要對應到(上面設定servlet-name的對應)
url-pattern:相對路徑下面所要對應。
servlet-mapping設定範例
    <servlet-mapping>
      <servlet-name>Log4JInitServlet</servlet-name>
      <url-pattern>/Log4JInitServlet</url-pattern>
    </servlet-mapping>
表示只要url進來對應為/Log4JInitServlet,就使用在servlet定義的那個servlet-class作為處理的object。

2. Servlet 3.0後增加了@WebServlet 標註功能

Servlet 3.0後增加了@WebServlet 標註功能
只要Servlet上有這行標註,container就會自動讀取資訊
範例中的標註指的是這支Servlet會處理經由 /Log4JInitServlet這個虛擬路徑來的HTTP請求
@WebServlet標籤還能透過參數做更多的設定:
@WebServlet(name="Log4JInitServlet", urlPatterns={"/Log4JInitServlet"}, loadOnStartup=1)

1 and 2 's result

  • 所以將標註當成預設值,web.xml進行管理也是可以的
  • 設定的套用順序會是 標註 -> web.xml

3. java reflection and invoke

   
  • 之後再補充這部分


===============================================================================

Deploy web service


[1]use tomcat manager to load XXX,war , xxx is your project be exported

3

[2] 在C:\Program Files (x86)\apache-tomcat-7.0.56\webapps 下創建一個資料夾,

"結構 如附圖" or eclipse
WEB-INF底下必須放置名為 web.xml的部屬描述檔
META-INF下的MANIFEST.MF宣告程式庫的相依性
有需要再設定即可,一般不用管它
ib資料夾底下放置會被引用到web application的JAR檔
web application使用類別時,會先到classes裡尋找是否有該類別檔案
如果沒有就再到container實作中放classes檔的地方或lib目錄底下尋找
4


[Web Service Introuction ][初探&介紹]

Servlet生命週期簡單的概括分為四步:class加載實例化--->初始化--->服務--->銷毀。

Servlet生命週期是由javax.servlet.Servlet接口定義,所有的Servlet都必須實現這個接口。在Servlet接口中定義了5個方法,其中3個方法代表了Servlet的生命周期:
  1. init方法:負責初始化Servlet對象。
  2. service方法:負責回應客戶的請求。
  3. destroy方法:當Servlet對象退出生命週期時,負責釋放佔用的資源。
  servlet_lifecycle

1、加載(Load)和實例化(Instantiated)

   Servlet容器負責加載和實例化Servlet。因為容器是通過Java的反射API來創建Servlet實例,調用的是Servlet的默認構造方法(即不帶參數的構造方法),所以我們在編寫Servlet類的時候,不應該提供帶參數的構造方法。 Servlet容器加載Servlet,有以下幾種情況:
(1)、Servlet容器啟動時自動裝載Servlet,讀取配置文件web.XML文件中的屬性,如果為1,則容器啟動時加載Servlet.
(2)、在Servlet容器啟動後,客戶首次向Servlet發送請求。 Servlet容器會判斷內存中是否存在指定的Servlet對象,如果沒有則加載這個Servlet。
(3)、Servlet類文件被更新後,重新加載Servlet.

2、初始化階段:init(ServletConfig conf)(補充)

   在Servlet實例化之後,Servlet容器將調用Servlet的init()方法初始化這個對象。初始化的目的是為了讓Servlet對像在處理客戶端請求前完成一些初始化的工作,如建立數據庫的連接,獲取配置信息等。對於每一個Servlet實例,init()方法只被調用一次。在初始化期間,Servlet實例可以使用Servlet容器為它準備的ServletConfig對像從Web應用程序的配置信息(在web.xml中配置)中獲取初始化的參數信息。
   在初始化期間,如果發生錯誤,Servlet實例可以拋出ServletException異常或者UnavailableException異常來通知容器。 ServletException異常用於指明一般的初始化失敗,例如沒有找到初始化參數;而UnavailableException異常用於通知容器該Servlet實例不可用。例如,數據庫服務器沒有啟動,數據庫連接無法建立,Servlet就可以拋出UnavailableException異常向容器指出它暫時或永久不可用。

3、回應請求服務階段(service)

   Servlet 被初始化以後,就處於能回應請​​求的就緒狀態。在service()方法中,Servlet實例通過ServletRequest對象得到​​客戶端的相關信息和請求信息,在對請求進行處理後,調用ServletResponse對象的方法設置回應訊息。當客戶端有一個請求時,Servlet容器將ServletRequest 和ServletResponse對像都轉發給Servlet,這兩個對像以參數的形式傳給service方法。這個方法由javax.servlet.Servlet定義並由具體的Servlet 實現。
   注意:客戶端每次請求Servlet都會運行該方法,該方法判斷訪問類型,然後根據HttpServletRequest的getMethod()方法返回結果判斷是執行doGet還是doPost,doPut。而且無論請求多少次Servlet,最多只有一個Servlet實例。多個客戶端並發請求Servlet時,服務器會啟動多個線程分別執行該Servlet的service()方法。
   在service()方法執行期間,如果發生錯誤,Servlet實例可以拋出ServletException異常或者UnavailableException異常。如果UnavailableException異常指示了該實例永久不可用,Servlet容器將調用實例的destroy()方法,釋放該實例。此後對該實例的任何請求,都將收到容器發送的HTTP 404(請求的資源不可用)回應。如果UnavailableException異常指示了該實例暫時不可用,那麼在暫時不可用的時間段內,對該實例的任何請求,都將收到容器發送的HTTP 503(服務器暫時忙,不能處理請求)回應。

4、終止服務階段(destroy)

   當需要釋放內存或者容器關閉時,容器就會調用Servlet實例的destroy()方法。在destroy()方法調用之後,容器會釋放這個Servlet實例,該實例隨後會被Java的垃圾收集器所回收。如果再次需要這個Servlet處理請求,Servlet容器會創建一個新的Servlet實例。

小結:

   在整個Servlet的生命週期過程中,創建Servlet實例、調用實例的init()和destroy()方法都只進行一次,當初始化完成後,Servlet容器會將該實例保存在內存中,通過調用它的service()方法,為接收到的請求服務。 Servlet有時會用到一些需要初始化與銷毀的資源,因此可以把初始化資源的代碼放入init()方法內,把銷毀資源的代碼放入destroy方法內,而不需要每次處理請求都要初始化與銷毀資源。






補充=====================================================================
when Servlet init() load 
http://guoliangqi.iteye.com/blog/667258



=======================================================================


image 13

Servlet/JSP處理HTTP請求的過程是:

  1. 使用者對Web Server發出HTTP請求
  2. Server收到請求後將其轉給container,並由container分析請求內容後建立相對應的物件
  3. container根據請求裡的URL分配給正確的Servlet 並為這個請求建立或配制執行緒,以及將請求物件與回應物件交予該執行緒處理
  4. container呼叫Servlet的sevice() method 根據請求的類別,service()會再呼叫doGet()或doPost() method
  5. 接著由所呼叫的method建置動態網頁,並將它放入回應物件裡
  6. 執行緒結束,container轉換回應物件為HTTP回應傳回Client端 接著刪除請求與回應物件