在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(),直接呼叫就好
※如果將方法寫在<% %>就會編譯錯誤
沒有留言:
張貼留言