close

● Web Container

負責管理JSP/Servlet運行過程中所需要的各種資源,並負責與 Web伺服器進行溝通,管理JSP/Servlet中所有物件的產生與消滅,它其實是個用Java撰寫而成的程式。

以JSP來說,容器負責將JSP轉換為Servlet程式碼,然後編譯Servlet程式碼,將之載入執行環境並執行,容器也提供了許多資源,除了基本的 Servlet載入與執行之外,例如Web環境設定、使用者認證、session追蹤等等,沒有容器,JSP轉譯而成的Servlet或直接撰寫的 Servlet程式,就不稱之為Servlet,而只是一個Java類別,要想真正發揮JSP/Servlet的功能,正確的設計出良好架構與功能的 Web應用程式,瞭解容器的特性是不可少的。

 

Tomcat嚴格來說是Web Container,不是HTTP伺服器,只不過下載Tomcat並安裝後,會附帶一個簡單的HTTP伺服器程式。

 

在安裝好 Tomcat 之後,Web應用程式應該放在安裝目錄的 webapps 下,該目錄下有一個 ROOT 目錄,它是 Tomcat 附帶的 HTTP 伺服器預設根目錄,當您使用 http://localhost:8080/ 連接時,將會執行 ROOT/index.jsp 這個JSP網頁並顯示 Tomcat的預設首頁。

若要測試練習,可以自行在webapps下建立一個專用的練習目錄(TestApp),並在練習目錄下建立FirstApp.jsp檔案,同時建立WEB - INF目錄,並撰寫好web.xml (可參考 ROOT/WEB-INF/目錄下的web.xml),這是在Web容器下建立一個基本Web應用程式該有的步驟。

FirstApp.jsp

<html>
<body>
This is My First App<br>
Now time is: <%=new java.util.Date()%> <br>
<%
    // 這是Java的註解方式,會出現在轉譯的Servlet原始碼中之對應位置
    out.println("隨便顯示一段文字<br>"); 
%>
<%!
    String str1;
    int i, j;
%>
<%
    /*
        這是源自C的註解方式,也會出現在轉譯的Servlet原始碼中之對應位置
    */  

%>
1) Output is: <%=str1%> <br>
<%
    str1 = "This is a test!";
    i = 10;
    j = 20;
%>
<%-- 這是 HTML 的註解文字,不會出現在轉譯的Servlet原始碼中 --%>
2) Output is: <%=str1%> <br>
<%
      out.println("&lt;%%\>被用來作為JSP中Java語法的部份");
%>
</body>
</html>

web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app 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-app_2_4.xsd"
    version="2.4">

  <display-name>My Web Application</display-name>    設定站台名稱
  <description>      描述站台
     A application for test.
  </description>

</web-app>

最後可於網址列鍵入測試執行結果(Tomcat 必須是啟動的狀態喔~)。(Quoting 和 Escape 規則 於後詳述)

 

http://localhost:8080/TestApp/FirstApp.jsp

This is My First App
Now time is: Thu Apr 01 16:51:29 CST 2010
隨便顯示一段文字
1) Output is: null
2) Output is: This is a test!
<% 與 %>被用來作為JSP中Java語法的部份

完整產生的Servlet原始碼放置於 work\Catalina\localhost\TestApp\org\apache\jsp (由於 package 是 org.apache.jsp ) 下的 FirstApp_jsp.java,編譯好的 Servlet 類別檔 FirstApp_jsp.class 也在其下。

FirstApp_jsp.java

import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class FirstApp_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static java.util.List _jspx_dependants;

  public Object getDependants() {
    return _jspx_dependants;
  }

  public void _jspService(HttpServletRequest request, HttpServletResponse response)
        throws java.io.IOException, ServletException {

    JspFactory _jspxFactory = null;
    PageContext pageContext = null;
    HttpSession session = null;
    ServletContext application = null;
    ServletConfig config = null;
    JspWriter out = null;
    Object page = this;
    JspWriter _jspx_out = null;
    PageContext _jspx_page_context = null;


    try {
      _jspxFactory = JspFactory.getDefaultFactory();
      response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("<html><body> \r\n");
      out.write("This is My First App<br>\r\n");
      out.write("Now time is: ");
      out.print(new java.util.Date());
      out.write("<br> \r\n");

      // 這是Java的註解方式,會出現在轉譯的Servlet原始碼中之對應位置

      out.println("隨便顯示一段文字<br>");

      out.write('\r');
      out.write('\n');
      out.write('\r');
      out.write('\n');

    /*
        這是源自C的註解方式,也會出現在轉譯的Servlet原始碼中之對應位置
    */ 


      out.write("\r\n");
      out.write("1) Output is: ");
      out.print(str1);
      out.write(" <br>\r\n");

    str1 = "This is a test!";
    i = 10;
    j = 20;

      out.write('\r');
      out.write('\n');
      out.write("\r\n");
      out.write("2) Output is: ");
      out.print(str1);
      out.write(" <br>\r\n");
      out.println("&lt;%%\>被用來作為JSP中Java語法的部份");
      out.write("</body></html>\r\n");
    } catch (Throwable t) {
      if (!(t instanceof SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          out.clearBuffer();
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
      }
    } finally {
      if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

 

在轉換為 Servlet 之後,由<% 與 %>包括的部份主要集合為一個 _jspService() 方法。

 

● JSP 生命週期

執行 JSP 網頁可分為兩個時期:

1. 轉譯時期 Translation Time:JSP 網頁轉譯成 Servlet 類別 (.jsp → .java → .class)。

    轉譯後的 Servlet 內容主要包含三部份: (Servlet 的生命週期請參考此)

public void _jspInit() {
    ...
    // 若欲在JSP網頁開始執行時,進行某些資料的起始,您可利用 jspInit 函數完成,此函數將在JSP網頁重新整理時,並不會被再度執行。
}

public void _jspDestroy() {
    ...
    // 當關閉伺服器時,jspDestroy函數將被呼叫,您可利用該函數進行資料的善後處理。
}

public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {
    ...
}

若要對 JSP 撰寫一些初始化的動作,是重新定義 jspInit() 方法,為了要能夠指定特定的初始參數給特定的JSP網頁,您必須要在 web.xml 中如下定義,然後使用 config 隱含物件取得初始參數:

 web.xml
<servlet>
    <servlet-name>JSPConfigTest</servlet-name>
    <jsp-file>/config.jsp</jsp-file>
    <init-param>
        <param-name>count</param-name>
        <param-value>100</param-value>
    </init-param>
</servlet>  

 

2. 請求時期 Request Time:Servlet 類別執行後,回應結果至客戶端。

 

 


 

● JSP的構成元件

JSP 網頁主要可分為以下兩部份:

1. Elements:必須由 JSP Container 處理的部份,其有4種型態:

    (1) Scripting Elements:描述語言元素

    (2) Directive Elements:指令元素

    (3) Action Elements:動作元素

    (4) EL Elements:

2. Template Data:JSP Container 不處理的部份,e.g. HTML 內容

 


 

◎ 撰寫註解 (Comments) 語法

<%
    // 這是Java的註解方式,會出現在轉譯的Servlet原始碼中之對應位置
 
 
    /*
        這是源自C的註解方式,也會出現在轉譯的Servlet原始碼中之對應位置
    */
   
%>

<% -- 這註解文字,不會出現在轉譯的Servlet原始碼中 -- %>

 

◎ Quoting 和 Escape 規則

<%%>是 寫JSP語法專用符號,若要畫面顯示出 <%、%>、 ' (單引號)、" (雙引號)、\ (斜線),需要做些是適當的修改。

     <% 符號請使用 &lt;%

    %> 符號請使用 %\>%&gt

    ' 單引號請使用 \'

    " 雙引號請使用 \"

    \ 斜線請使用 \\

 

 

參考:良葛格學習筆記 JSP/Servlet

arrow
arrow
    全站熱搜

    tsuozoe 發表在 痞客邦 留言(0) 人氣()