一、jsp簡介
jsp是一種特殊的servlet,是一種動態的網頁技術標準,它可以在傳統的html頁面中插入Java程序,在服務器端執行,但是最終返回的是HTML頁面。jsp最終在程序中生成一個.java文件,這個Java中可以看出jsp繼承於JspServlet,而JSPServlet則是繼承於HttpServlet的。
Jsp頁面的目的就是是的前端展示和後端邏輯servlet分離,所以一般不推薦在jsp中寫Java代碼。jsp在整個執行的過程中,用戶通過瀏覽器請求到達服務器,服務器調用jsp引擎(一個Java程序),jsp引擎會將jsp翻譯爲一個servet,所以第一次訪問這個jsp的時候會略微慢一些,之後如果jsp引擎發現這個jsp沒有發生變化就會直接調用之前生成的servlet。
二、jsp中Java腳本的書寫方式
1、Java小腳本
<%
Java語句
%>
在這裏面的語句,翻譯成servlet之後會直接放入,servlet中service方法中,並且在這裏面是不能定義方法的。注意小腳本中可以使不完整的,只要保證多個小腳本連一起是完整的就行。
2、聲明元素
<%!
聲明
%>
聲明中可以定義一些變量、方法,這裏面的內容是放在service方法之外的。
3、表達式
<%=EL %>
表達式中是不能以”;”結尾的。表達式是一個簡化的了的out.println語句。
三、jsp指令
jsp指令是爲了JSP引擎設計的,不會直接產出任何輸出,但是可以用來告訴jsp引擎一些jsp頁面其他的處理過程。
JSP2.0中指令一共有三種:page、include、taglib,其語法格式一般爲<%@ %>
1、page指令
其作用主要是用於指定頁面的各種實行,常用的實行如下:
<%@page
[language="java" ] 語言
[extends="package.class" ]
[import="{package.class | package.*}, ..." ] 導包
[session="true | false" ]
[buffer="none | 8kb | sizekb" ]
[autoFlush="true | false" ]
[isThreadSafe="true | false" ]
[info="text" ]
[errorPage="relative_url" ]
[isErrorPage="true | false" ]
[contentType="mimeType [ ;charset=characterSet ]" |"text/html ; charset=ISO-8859-1" ]
[pageEncoding="characterSet | ISO-8859-1" ] //指定編碼集
[isELIgnored="true | false" ]
%>
可以在一條page指令的import屬性中引入多個類或包,其中的每個包或類之間使用逗號(,)分隔。例如:
<%@ page import="java.util.Date,java.io.*,java.sql.*"%>
page設置錯誤頁面,當然也可以在web.xml中指定全局的錯誤頁面。errorPage屬性的設置值必須使用相對路徑,如果以"/"開頭代表的是當前應用程序的根目錄,而不是站點的根目錄。
在web.xml文件中使用<error-page>設置整個web應用的錯誤頁面,<error-page>下面有三個子元素。
<error-code>指定錯誤的狀態碼
<exception-type>指定異常類的完全限定名
<location>指定以"/"爲開頭的錯誤的處理頁面的路徑
問題:我在設置了404、500狀態碼頁面和error頁面,404錯誤是跳轉到了404頁面,但是500狀態碼跳轉到了error頁面,並沒有跳轉到500頁面中,好奇怪啊!!以後在研究研究
<!--
使用page指令的isErrorPage屬性顯式聲明頁面爲錯誤頁面
好處:
將error.jsp頁面顯式聲明爲錯誤處理頁面後,有什麼好處呢,好處就是Jsp引擎在將jsp頁面翻譯成Servlet的時候,
在Servlet的_jspService方法中會聲明一個exception對象,然後將運行jsp出錯的異常信息存儲到exception對象中
於Servlet的_jspService方法中聲明瞭exception對象,那麼就可以在error.jsp頁面中使用exception對象,
這樣就可以在Jsp頁面中拿到出錯的異常信息了
-->
對不起,出錯了,請聯繫系統的管理員!!<br>
異常信息如下:<%=exception.getMessage() %><!-- 如果不指定isErrorPage的話就會編譯錯誤!-->
2、include指令
include指令用於包含其他頁面,一共有兩種方式,一種是靜態包含一種是動態包含。
靜態包含:<%@includefile=”header.jsp”%>,這種方式中被引入的文件是必須遵從jsp規範的,不論是什麼擴展名,jsp引擎都會按照jsp的規範處理它的內容,被include涉及的jsp頁面最終只會被翻譯爲一個servlet,所以這兩個頁面的指令不能衝突(pageEncoding和導包除外)。
動態包含:<jsp:includepage=”/user/test”flush=”true”/>,如果被包含的是jsp頁面,則會先處理在進行包含,如果不是jsp頁面,只會靜態的包含,於@include類似。
靜態包含和動態包含有什麼區別?
靜態包含是在編譯期包含,雖然有兩個jsp頁面文件,但是生成的servlet卻只有一個,而動態包含在運行期進行,每個jsp都會產生一個servlet,效率上面還是靜態包含要好!
3、taglib指令用於在JSP頁面中導入標籤庫,如JSTLjava標準標籤庫和自定義的標籤。
四、JSP九大隱式對象
SP引擎在調用JSP對應的_jspServlet時,會傳遞或創建9個與web開發相關的對象供_jspServlet使用。
NO
內置對象
類型
1
pageContext
javax.servlet.jsp.PageContext
2
request
Javax.servlet.http.HttpServletRequest
3
response
javax.servlet.http.HttpServletResponse
4
session
Javax.servlet.http.HttpSession
5
application
Javax.servlet.ServletContext
6
config
Javax.servlet.ServletConfig
7
out
Javax.servlet.jsp.JspWriter
8
page
Java.lang.Object
9
exception
Java.lang.Throwable
page隱式對象說明
page對象代表的是這個頁面本身,就是將頁面看做爲一個對象,基本不咋用。
out隱式對象
out對象用於想瀏覽器發送文本信息,out對象同調用pageContext的getOut方法得到和response的getPrintWriter方法返回的PrintWriter對象非常類似,out對象是JspWriter類型,相當於帶了緩存功能的printWriter,實際上即便向out中寫入了內容,只有滿足如下之一才能將該內容寫入到Servlet引擎的緩存區中:
設置page的buffer屬性關閉out的緩存功能,
out的緩衝區已經滿了
刷新緩衝區
整個jsp頁面結束
<%
out.write("hahahahaha<br/>");
response.getWriter().write("wowowowowowo<br/>");
%>
從效果上面已經可以看出來,JSPWriter對象中帶有的緩存效果了。
注意:記住不要同時使用out和response.getWriter()輸出數據,原因上面已經說的很清楚了,最好是隻使用out對象來輸出數據。
pageContext隱式對象
pageContent對象是九大隱式對象中最重要的一個對象了,代表了JSP頁面的運行環境,這個對象不僅封裝了其他8大隱式對象的引用,自身也是一個域對象,可用於存放數據,它的生命週期就是這個jsp頁面的生命週期,執行的時候上來就會創建pageContext對象,但是jsp執行完了就會死亡。這個對象還封裝了web開發中經常涉及的一些常用操作,例如引入跳轉其它資源,檢索其它對象的屬性。
通過pageContext獲取其它隱式對象
getException方法返回exception隱式對象。
getPage方法返回page隱式對象。
getRequest方法返回request隱式對象。
getResponse方法返回response隱式對象。
getServletConfig方法返回config隱式對象。
getServletContext方法返回application隱式對象。
getSession方法返回session隱式對象。
getOut方法返回out隱式對象。
pageContext封裝其它8大內置對象的意義。
思考:如果在編程過程中,把pageContext對象傳遞給一個普通java對象,那麼這個java對象將具有什麼功能?
答:如果在編程過程中,把pageContext對象傳遞給一個普通java對象,那麼這個java對象將可以獲取8大隱式對象,此時這個java對象就可以和瀏覽器交互了,此時這個java對象就成爲了一個動態web資源了,這就是pageContext封裝其它8大內置對象的意義。把pageContext傳遞給誰,誰就能成爲一個動態web資源。
思考:那麼什麼情況下需要把pageContext傳遞給另外一個java類呢,什麼情況下需要使用這種技術呢
答:在比較正規的開發中,jsp頁面是不允許出現java代碼的(jsp頁面裏面是不能出現一行java代碼的,在軟件開發裏面,你要想你這個jsp是一個合格、良好的jsp的話,jsp頁面裏面是不準出現一行java代碼的),如果jsp頁面出現了java代碼,那麼就應該想辦法把java代碼移除掉。我們可以開發一個自定義標籤來移除jsp頁面上的java代碼,首先圍繞自定義標籤寫一個java類,jsp引擎在執行自定義標籤的時候就會調用圍繞自定義標籤寫的那個java類,在調用java類的時候就會把pageContext對象傳遞給這個java類,由於pageContext對象封裝了對其它8大隱式對象的引用,因此在這個java類中就可以使用jsp頁面中的8大隱式對象(request,response,config,application,exception,Session,page,out)了,pageContext對象在jsp自定義標籤開發中特別重要。
pageContext作爲域對象
常用的方法
void setAttribute(String name , Object value)
ObjectgetAttribute(String name)
voidremoveAttribute(String name)
findAttribute(Stringname)---查找各個域中的屬性
findAttribute方法按照查找順序”page→request→session→application”在這四個對象中去查找,只要找到了就返回屬性值,如果四個對象都沒有找到要查找的屬性,則返回一個null。
EL表達式語句在執行時,會調用pageContext.findAttribute方法,用標識符爲關鍵字,分別從page、request、session、application四個域中查找相應的對象,找到則返回相應對象,找不到則返回””(注意,不是null,而是空字符串)
五、JSP標籤說明
JSP標籤也稱之爲JspAction(JSP動作)元素,它用於在Jsp頁面中提供業務邏輯功能,避免在JSP頁面中直接編寫java代碼,造成jsp頁面難以維護。
jsp的常用標籤有以下三個:
<jsp:include>標籤
<jsp:forward>標籤
<jsp:param>標籤
<jsp:include>
標籤
用於把另外一個資源的輸出內容插入進當前JSP頁面的輸出內容之中,這種在JSP頁面執行時的引入方式稱之爲動態引入。其語法爲:
page屬性用於指定被引入資源的相對路徑,它也可以通過執行一個表達式來獲得。
flush屬性指定在插入其他資源的輸出內容時,是否先將當前JSP頁面的已輸出的內容刷新到客戶端。
用於把請求轉發給另外一個資源。其語法爲:<jsp:forwardpage="relativeURL | <%=expression%>" />
在實際開發中,我們要爲網站設置首頁,訪問首頁時,我們要將數據交給Servlet進行處理,但我們又不能在項目的web.xml文件中配置一個servlet
解決方案是:在項目的web.xml中配置網站的首頁,如下:
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
然後在index.jsp在使用jsp:forward標籤跳轉到Servlet,如下:
<!-- <jsp:forward>
標籤的應用場景
-->
<jsp:forward page="/IndexServlet"></jsp:forward>
<jsp:param>
標籤
當使用<jsp:include>
和<jsp:forward>
標籤引入或將請求轉發給其它資源時,可以使用<jsp:param>
標籤向這個資源傳遞參數。
語法
1
<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
語法
2
<jsp:forward page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
比如在
1.
jsp
中導入
<jsp:include page="/
2
.jsp">
<jsp:param value="hello" name="parm1"/>
<jsp:param value="world" name="parm2"/>
</jsp:include>
那麼
<h1>
接收從
IncludeTagTest2.jsp
頁面中傳遞過來的參數:
</h1>
<h2><%=request.getParameter("parm1") %></h2>
<h2><%=request.getParameter("parm2") %></h2>
就可以接收到
1.jsp
中傳遞過來的參數了
六、JSP中的四大作用域
JSP的四大作用域:page、request、session、application
這四大作用域,其實就是其九大內置對象中的四個,爲什麼說他們也是JSP的四大作用域呢?因爲這四個對象都能存儲數據,比如request.setAttribute()注意和request.setParameter()區分開來,一個是存儲在域中的、一個是請求參數,session.setAttribute()、application其實就是SerlvetContext,自然也有setAttribute()方法。而page作用域的操作就需要依靠pageContext對象來進行了。在上面我們也有提到JSP的四大作用域,
page作用域:代表變量只能在當前頁面上生效
request:代表變量能在一次請求中生效,一次請求可能包含一個頁面,也可能包含多個頁面,比如頁面A請求轉發到頁面B
session:代表變量能在一次會話中生效,基本上就是能在web項目下都有效,session的使用也跟cookie有很大的關係。一般來說,只要瀏覽器不關閉,cookie就會一直生效,cookie生效,session的使用就不會受到影響。
application:代表變量能一個應用下(多個會話),在服務器下的多個項目之間都能夠使用。比如baidu、wenku等共享帳號。
七、jsp標籤(標準標籤)
EL表達式
1、訪問相關的屬性(bean)
訪問屬性的順序是:pageContext、request、session、application。只要找到藍就會返回,沒有找到的話就會返回””---空字符串。
${user.name}或者${user["name"]}、${user.interest[0]},可以訪問數組下標,要有get方法。
2、運算
算術運算+、-、×、/
關係運算:>、<、>=、<= 、==
邏輯運算:&&|| !
empty運算:用來判斷集合是否爲空,或者是否是一個空字符串
JSRL核心標籤庫
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
if
<c:iftest="${user.gender == 'm'}" var="flag"scope="request">男</c:if> 等價於request.setAttribute("flag",運行結果true/false) ,scope可以寫page,session,application
choose相當於if{}else{}else{}
when可以出現1次或者多次。當test屬性爲true時,會執行該分支。
otherwise可以出現0次或者1次。表示例外。
<c:choose>
<c:whentest="${user.gender == 'm'}">男
</c:when>
<c:whentest="${user.gender == 'f'}">女
</c:when>
<c:otherwise>保密
</c:otherwise>
</c:choose>
3)、forEach標籤,用來遍歷集合或者數組。每次從集合或者數組中取一個元素,然後將其綁定到pageContext上,綁定名由var屬性來指定。
<c:forEachitems="${userlist}" var="u" varStatus="s">
<trclass="row${s.index%2+1}"> //css寫個row1row2的class,表格行顏色互換
<td>${u.name}</td>
<td>${u.gender}</td>
<td>${u.age}</td>
<td>${s.index}</td>
<td>${s.count}</td>
</tr>
</c:forEach>
自定義標籤
八、總結
1、什麼是JSP?
JSP本質上就是一個servlet,因爲servlet輸出html太麻煩了,所以就有了JSP,JSP就是專門用來書寫html的,當然其中也能寫java代碼。
2、JSP的內容包括什麼?
模版數據和元素。其中元素有包括腳本(java代碼)、指令(頁面屬性)、和行爲(標籤,爲了JSP中不嵌入那麼多java代碼衍生的)
3、JSP中九大內置對象是哪九個?
九大內置對象, page、config、appliction、request、response、session、out、exception、pageContext
4、九大內置對象和servlet中對象的關係
page就是jsp轉換爲servletservlet對象本身,也就是this
config-- Servlet中的servletConfig
application-- Servlet中的ServletContext
request --Servlet中的request
response --Servlet中的response
session --Servlet中的session
out -- JspWriter
exception --異常對象
pageContext --表示 jsp頁面上下文(jsp管理者)類型:PageContext,
其中pageContext對象最牛逼,有了他就擁有了天下,哈哈~
5、JSP中的四大作用域。
page、request、session、application
其中操作page域中屬性需要藉助pageContext對象。
6、JSP中還有其他兩大塊內容
一個是EL表達式,很重要,
另一個是jstl標籤庫的使用