2016年4月6日 星期三

JSP 和 Servlet 的關係 (JSP 2.x 一)

Oracle的JSP spec,各版本連結 2.02.12.22.3
在spec的1.8.3 有9個隱含物件(就是不用new了,直接拿來使用)

.request:javax.servlet.http.HttpServletRequest
.response:javax.servlet.http.HttpServletResponse
.pageContext:javax.servlet.jsp.PageContext
.session:javax.servlet.http.HttpSession
.application:javax.servlet.ServletContext
.out:javax.servlet.jsp.JspWriter
.config:javax.servlet.ServletConfig
.page:java.lang.Object
.exception:java.lang.Throwable

以上的9個的scope如下:
request 為 request scope
session 為 session scope
application 為 application scope
其他都是page scope



※測試準備

<h1>JSP路徑</h1>
<%=request.getServletContext().getAttribute("javax.servlet.context.tempdir")%>

※以上的程式碼在Servlet 四有提過

※此行印出
D:\eclipse-jee-mars-R-win32-x86_64\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\TestJSP,最後的TestJSP是專案名稱

※不同的container可能不一樣,我是用tomcat8

※到目錄後還要再進去org\apache\jsp,這樣才會看到由servlet變出來的.java和.class



※測試
<%!int i = 0;%>
<%
    int j = 10;
    i++;
    j++;
%>
<%=i%><br />
<%=j%>

※寫這樣然後去剛剛的.java看一下,大部分都是自動產生出來的,我把自動的去除以後,大概如下的樣子:
public final class exercise_jsp extends HttpJspBase implements JspSourceDependent, JspSourceImports {
    int i = 0;
    
    try {
        out.write('很多HTML');
        
        int j = 10;
        i++;
        j++;
        
        out.write('很多HTML');
        out.print(i);
        out.print(j);
    } catch (Throwable t) {
        // ...
    } finally {
        // ...
    }
}

※可以看出JSP一樣有_jspInit、_jspDestroy、_jspService

※exercise.jsp是我取的名字,會變成 exercise_jsp.java,也就是將「.」變成「_」,然後產生.java,最後編譯成.class

※類別是final的

※繼承和實作都是org.apache.jasper.runtime 包
繼承 HttpJspBase,實作 JspSourceDependent 和 JspSourceImports

※<%! %>:寫全域變數和方法的地方

※<% %>:寫區域變數和方法內容的地方,看生出來的.java就可以知道,所以方法前沒辦法加synchronized

※<%= %>:印出變數,類似servlet的PrintWriter,要注意最後沒有「;」

※<%-- --%>:註解,和以下三種相同
<%// ... %>
<%
  /*
...
*/
%>
<%
/**
...
*/
%>
因為<% %>和<%! %>本來就是寫java的地方,所以當然可以用這三種註解,以上這幾種註解叫伺服器端註解

<!-- ... -->:這是HTML的註解,不是JSP的,這叫用戶端註解
和伺服器端註解比較起來,不同的地方是按右鍵-->檢視原始碼時,伺服器端的看不到

※剛剛沒有在<%! %>裡面寫方法,這裡寫一下
<%!
    public String xxx(){
        return "abc";
    }
%>
<%
    String s = this.xxx() + "def";
%>
<%=s%>

※寫static也可以,但不能用exercise_jsp.xxx(),直接呼叫就好

※如果將方法寫在<% %>就會編譯錯誤

沒有留言:

張貼留言