javascript
方立勋_30天掌握JavaWeb_JSP
JSP運行原理
- JSP全稱是Java Server Pages,它和servle技術一樣,都是SUN公司定義的一種用于開發動態web資源的技術。
- JSP這門技術的最大的特點在于,寫jsp就像在寫html,但它相比html而言,html只能為用戶提供靜態數據,而Jsp技術允許在頁面中嵌套java代碼,為用戶提供動態數據。
- Jsp快速入門:在jsp頁面中輸出當前時間。
ie瀏覽器請求servlet處理請求,通過轉發到jsp頁面(這樣只有一個請求),jsp頁面就可以拿到request。
JSP語法
jsp模板元素
- JSP頁面中的HTML內容稱之為JSP模版元素。
- JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。
jsp腳本表達式
- JSP腳本表達式(expression)用于將程序數據輸出到客戶端
語法:<%= 變量或表達式 %>
舉例:當前時間:<%= new java.util.Date() %> - JSP引擎在翻譯腳本表達式時,會將程序數據轉成字符串,然后在相應位置用out.print(…) 將數據輸給客戶端。
- JSP腳本表達式中的變量或表達式后面不能有分號(;)。
jsp腳本片斷
- JSP腳本片斷(scriptlet)用于在JSP頁面中編寫多行Java代碼。語法:
<%
多行java代碼
%> - 注意:JSP腳本片斷中只能出現java代碼,不能出現其它模板元素, JSP引擎在翻譯JSP頁面中,會將JSP腳本片斷中的Java代碼將被原封不動地放到Servlet的_jspService方法中。
JSP腳本片斷中的Java代碼必須嚴格遵循Java語法,例如,每執行語句后面必須用分號(;)結束。
在一個JSP頁面中可以有多個腳本片斷,在兩個或多個腳本片斷之間可以嵌入文本、HTML標記和其他JSP元素。
舉例:<%
int x = 10;
out.println(x);
%>
<p>這是JSP頁面文本
<%
int y = 20;
out.println(y);
%>多個腳本片斷中的代碼可以相互訪問,猶如將所有的代碼放在一對<%%>之中的情況。如:out.println(x);
單個腳本片斷中的Java語句可以是不完整的,但是,多個腳本片斷組合后的結果必須是完整的Java語句,例如:
<%
for (int i=1; i<5; i++)
{
%>
<H1>www.it315.org
<%
}
%>
jsp聲明
- JSP頁面中編寫的所有代碼,默認會翻譯到servlet的service方法中, 而Jsp聲明中的java代碼被翻譯到_jspService方法的外面。語法:
<%!
java代碼
%> 所以,JSP聲明可用于定義JSP頁面轉換成的Servlet程序的靜態代碼塊、成員變量和方法 。
多個靜態代碼塊、變量和函數可以定義在一個JSP聲明中,也可以分別單獨定義在多個JSP聲明中。
JSP隱式對象的作用范圍僅限于Servlet的_jspService方法,所以在JSP聲明中不能使用這些隱式對象。
jsp注釋
JSP注釋的格式:
<%– 注釋信息 –%>JSP引擎在將JSP頁面翻譯成Servlet程序時,忽略JSP頁面中被注釋的內容。
jsp指令
JSP指令(directive)是為JSP引擎而設計的,它們并不直接產生任何可見輸出,而只是告訴引擎如何處理JSP頁面中的其余部分。在JSP 2.0規范中共定義了三個指令:
- page指令
- Include指令
- taglib指令
JSP指令簡介
1. JSP指令的基本語法格式:
<%@ 指令 屬性名=”值” %>
舉例:<%@ page contentType=”text/html;charset=gb2312”%>
2. 如果一個指令有多個屬性,這多個屬性可以寫在一個指令中,也可以分開寫。
例如:
<%@ page contentType=”text/html;charset=gb2312”%>
<%@ page import=”java.util.Date”%>
也可以寫作:
<%@ page contentType=”text/html;charset=gb2312” import=”java.util.Date”%>
Page指令
page指令用于定義JSP頁面的各種屬性,無論page指令出現在JSP頁面中的什么地方,它作用的都是整個JSP頁面,為了保持程序的可讀性和遵循良好的編程習慣,page指令最好是放在整個JSP頁面的起始位置。
使用page指令解決JSP中文亂碼
假如jsp頁面使用記事本寫的,其默認是gb2312編碼存入本地硬盤(假設:“中國” 98 、99),web服務器把jsp頁面翻譯成servlet,但是tomcat5.0服務器默認是iso8859-1編碼,所以翻譯成servlet時候就亂碼了,解決方法:可以在jsp頁面 page指令pageEncoding=”gb2312”通知web服務器使用gb2312編碼。但是回顯給瀏覽器端同時也需要告知瀏覽器使用哪個編碼打開(做法:jsp頁面page指令,contentType=”text/html; charset=gb2312”)。
但是在eclipse開發工具中,這個問題就不用那么麻煩了,如果jsp頁面pageEncoding=“”指定了哪個編碼,其保存到硬盤也是哪個編碼,而且contentType也不需要指定編碼告知瀏覽器用哪個編碼打開(這里也已經默認是和pageEncoding指定的編碼相同)。
include指令
- include指令用于引入其它JSP頁面,如果使用include指令引入了其它JSP頁面,那么JSP引擎將把這兩個JSP翻譯成一個servlet。所以include指令引入通常也稱之為靜態引入。
- 語法:
<%@ include file=”relativeURL”%>
其中的file屬性用于指定被引入文件的路徑。路徑以“/”開頭,表示代表當前web應用。 - 細節:
- 被引入的文件必須遵循JSP語法。
- 被引入的文件可以使用任意的擴展名,即使其擴展名是html,JSP引擎也會按照處理jsp頁面的方式處理它里面的內容,為了見明知意,JSP規范建議使用.jspf(JSP fragments)作為靜態引入文件的擴展名。
- 由于使用include指令將會涉及到2個JSP頁面,并會把2個JSP翻譯成一個servlet,所以這2個JSP頁面的指令不能沖突(除了pageEncoding和導包除外)。
taglib指令
Taglib指令用于在JSP頁面中導入標簽庫,講自定義標簽技術時講。
jsp九大隱式對象
| Request | |
| Response | |
| Session | |
| Application | servletContext |
| Config | servletConfig |
| Page | this |
| Exception | |
| Out | jspWriter |
| pageContext |
out隱式對象
- 設置page指令的buffer屬性關閉了out對象的緩存功能
- out對象的緩沖區已滿
- 整個JSP頁面結束
out隱式對象的工作原理圖
注意:同時使用out和response.getwriter()輸出數據。
<body><%out.write("aaaa");response.getWriter().write("bbbb");%></body>瀏覽器結果:
這是因為:這個過程out.write使得jspWrite對象緩沖區有aaa,response.getWriter().writeres使得reponse對象緩沖區bbb,然后aaa進入response緩沖對象,然后進入jsp引擎處理。
pageContext對象
pageContext對象是JSP技術中最重要的一個對象,它代表JSP頁面的運行環境,這個對象不僅封裝了對其它8大隱式對象的引用,它自身還是一個域對象,可以用來保存數據。并且,這個對象還封裝了web開發中經常涉及到的一些常用操作,例如引入和跳轉其它資源、檢索其它域對象中的屬性等。
getException方法返回exception隱式對象
getPage方法返回page隱式對象
getRequest方法返回request隱式對象
getResponse方法返回response隱式對象
getServletConfig方法返回config隱式對象
getServletContext方法返回application隱式對象
getSession方法返回session隱式對象
getOut方法返回out隱式對象
pageContext封裝其它8大內置對象的意義,思考:如果在編程過程中,把pageContext對象傳遞給一個普通java對象,那么這個java對象將具有什么功能?
pageContext對象的方法
public void setAttribute(java.lang.String name,java.lang.Object value)
public java.lang.Object getAttribute(java.lang.String name)
public void removeAttribute(java.lang.String name)
pageContext對象中還封裝了訪問其它域的方法
public java.lang.Object getAttribute(java.lang.String name,int scope)
public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
public void removeAttribute(java.lang.String name,int scope)
代表各個域的常量
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
findAttribute方法 (*重點,查找各個域中的屬性) EL表達式
注:PageContext類中定義了一個forward方法和兩個include方法來分別簡化和替代RequestDispatcher.forward方法和include方法。
方法接收的資源如果以“/”開頭, “/”代表當前web應用。
jsp標簽
JSP標簽也稱之為Jsp Action(JSP動作)元素,它用于在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護。
常用標簽:
<jsp:include>標簽
<jsp:forward>標簽
<jsp:param>標簽
<jsp:include>標簽
<jsp:include>標簽用于把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之為動態引入。
語法:
<jsp:include page=”relativeURL | <%=expression%>” flush=”true|false” />
- page屬性用于指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。
flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。
<jsp:include>標簽是動態引入, <jsp:include>標簽涉及到的2個JSP頁面會被翻譯成2個servlet,這2個servlet的內容在執行時進行合并。
而include指令是靜態引入,涉及到的2個JSP頁面會被翻譯成一個servlet,其內容是在源文件級別進行合并。
不管是<jsp:include>標簽,還是include指令,它們都會把兩個JSP頁面內容合并輸出,所以這兩個頁面不要出現重復的HTML全局架構標簽,否則輸出給客戶端的內容將會是一個格式混亂的HTML文檔。
<jsp:forward>標簽
<jsp:forward>標簽用于把請求轉發給另外一個資源。
語法:
<jsp:forward page=”relativeURL | <%=expression%>” />
page屬性用于指定請求轉發到的資源的相對路徑,它也可以通過執行一個表達式來獲得。
<jsp:param>標簽
當使用<jsp:include>和<jsp:forward>標簽引入或將請求轉發給其它資源時,可以使用標簽向這個資源傳遞參數。
語法1:
語法2:
<jsp:forward page="relativeURL | <%=expression%>"><jsp:param name="parameterName" value="parameterValue|<%= expression %>" /></jsp:include><jsp:param>標簽的name屬性用于指定參數名,value屬性用于指定參數值。在<jsp:include>和<jsp:forward>標簽中可以使用多個<jsp:param>標簽來傳遞多個參數。
映射jsp
<servlet><servlet-name>SimpleJspServlet</servlet-name><jsp-file>/jsp/simple.jsp</jsp-file><load-on-startup>1</load-on-startup > </servlet>…… <servlet-mapping><servlet-name>SimpleJspServlet</servlet-name><url-pattern>/xxx/yyy.html</url-pattern> </servlet-mapping>如何查找jsp頁面中的錯誤
JSP最佳實踐
- 不管是JSP還是Servlet,雖然都可以用于開發動態web資源。但由于這2門技術各自的特點,在長期的軟件實踐中,人們逐漸把servlet作為web應用中的控制器組件來使用,而把JSP技術作為數據顯示模板來使用。
- 其原因為,程序的數據通常要美化后再輸出:
- 讓jsp既用java代碼產生動態數據,又做美化會導致頁面難以維護。
- 讓servlet既產生數據,又在里面嵌套html代碼美化數據,同樣也會導致程序可讀性差,難以維護。
- 因此最好的辦法就是根據這兩門技術的特點,讓它們各自負責各的,servlet只負責響應請求產生數據,并把數據通過轉發技術帶給jsp,數據的顯示jsp來做。
重點
到此為止,web開發接觸到了4個域對象,這4個域對象是學習web的重點,也是筆試經常考察的知識點
pageContext(稱之為page域)
request(稱之為request域)
session(稱之為session域)
servletContext(稱之為application域)明確如下問題:
什么是域?
這4個對象的生命周期?
哪種情況下用哪種域對象。
總結
以上是生活随笔為你收集整理的方立勋_30天掌握JavaWeb_JSP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web三个域对象的区别
- 下一篇: HTML button 和 input