Jsp技術(shù)總結(jié)
1. 什么是JSP
? ? ? ? JSP即Java Server Pages,它和servlet技術(shù)一樣,都是sun公司定義的一種用于開發(fā)動態(tài)web資源的技術(shù)萌朱。該技術(shù)的最大特點(diǎn)在于:寫JSP就像寫html腺阳,但它相比html而言,html只能為用戶提供靜態(tài)數(shù)據(jù)梆奈,而JSP技術(shù)允許在頁面中嵌套java代碼,為用戶提供動態(tài)數(shù)據(jù)称开。
2. JSP原理
1) web服務(wù)器是如何調(diào)用并執(zhí)行一個(gè)JSP頁面的亩钟?
? ? ? ? 服務(wù)器首先將JSP翻譯為一個(gè)Servlet,翻譯過后的Servlet可以在\tomcat主目錄\work\Catalina\localhost\工程名\org\apache\jsp目錄下查看鳖轰,這是服務(wù)器的工作目錄清酥。打開相應(yīng)的Servlet可以看到,翻譯過后的servlet繼承了org.apache.jasper.runtime.HttpJspBase蕴侣,而HttpJspBase繼承了HttpSerrvlet焰轻。說到這里,我們就明白了昆雀,其實(shí)JSP就是一個(gè)Servlet辱志,訪問jsp即訪問一個(gè)Servlet。
2) JSP頁面中的html排版標(biāo)簽是如何被發(fā)送到客戶端的以及java代碼服務(wù)器是如何執(zhí)行的狞膘?
? ? ? ? 繼續(xù)瀏覽JSP翻譯過后的Servlet揩懒,里面有個(gè)service方法_jspService(request, response),在該方法中可以看到挽封,JSP中的所有內(nèi)容都會翻譯到service方法中旭从,html代碼會通過out輸出,就像學(xué)習(xí)JSP之前场仲,在Servlet中用out輸出html語句一樣和悦,java部分代碼會原封不動的搬到service方法中。
3) web服務(wù)器在調(diào)用JSP時(shí)渠缕,會給JSP提供一些什么java對象鸽素?
? ? ? ? web服務(wù)器在將JSP翻譯成Servlet時(shí),會在service方法中提供web開發(fā)所有的對象亦鳞,這樣在JSP頁面中馍忽,我們就可以直接使用這些對象了,而不用再去獲得燕差。web服務(wù)器所提供的對象(這些對象我們下面戶詳細(xì)分析)有:
[java] view plaincopy
final javax.servlet.jsp.PageContext pageContext;? ? ? ? //pageContext對象?
javax.servlet.http.HttpSession session = null;? ? ? ? ? //session對象?
final javax.servlet.ServletContext application;? ? ? ? ? //application對象?
final javax.servlet.ServletConfig config;? ? ? ? ? ? ? ? //config對象?
javax.servlet.jsp.JspWriter out = null;? ? ? ? ? ? ? ? ? //out對象?
final java.lang.Object page = this;? ? ? ? ? ? ? ? ? ? ? //page對象?
javax.servlet.jsp.JspWriter _jspx_out = null;? ? ? ? ? ? ?
javax.servlet.jsp.PageContext _jspx_page_context = null;?
? ? ? ? 還有service方法的參數(shù)request和response遭笋。所以Servlet可以做的事,JSP都可以做徒探。但是兩者各有特點(diǎn)瓦呼,我們繼續(xù)往下看。
3. JSP的最佳實(shí)踐
? ? ? ? 不管是JSP還是Servlet测暗,雖然都可以用于開發(fā)動態(tài)web資源央串,但是由于這2門技術(shù)各自的特點(diǎn)磨澡,在長期的軟件實(shí)踐中,人們逐漸把servlet作為web應(yīng)用中的控制器組件來使用质和,而把JSP技術(shù)作為數(shù)據(jù)顯示模板來使用稳摄。原因在于,程序的數(shù)據(jù)通常要美化后再輸出饲宿。讓JSP既用java代碼產(chǎn)生動態(tài)數(shù)據(jù)厦酬,又做美化會導(dǎo)致頁面難以維護(hù);讓Servlet既產(chǎn)生數(shù)據(jù)瘫想,又在里面嵌套html代碼美化數(shù)據(jù)仗阅,同樣也會導(dǎo)致程序可讀性差,難以維護(hù)殿托;因此最好的辦法就是讓Servlet負(fù)責(zé)相應(yīng)請求產(chǎn)生的數(shù)據(jù)霹菊,并把數(shù)據(jù)通過轉(zhuǎn)發(fā)技術(shù)帶給JSP剧蚣,JSP用來做數(shù)據(jù)的顯示支竹。
4. JSP語法
1) JSP模板元素
? ? ? ? JSP模板元素即JSP頁面中的HTML內(nèi)容。JSP模板元素定義了網(wǎng)頁的基本骨架鸠按,即定義了頁面的結(jié)構(gòu)和外觀礼搁。
2) JSP腳本表達(dá)式
? ? ? ? JSP腳本表達(dá)式用于將程序數(shù)據(jù)輸出到客戶端。
? ? ? ? 語法:<%= 變量或表達(dá)式 %> 如:當(dāng)前時(shí)間:<%= new java.util.Date() %>
? ? ? ? JSP引擎在翻譯腳本表達(dá)式時(shí)目尖,會將程序數(shù)據(jù)轉(zhuǎn)成字符串馒吴,然后在相應(yīng)位置用out.print(...)將數(shù)據(jù)輸給客戶端。
? ? ? ? 注意:JSP腳本表達(dá)式中的變量或表達(dá)式后面不能有分號(;)
3) JSP腳本片段
? ? ? ? JSP腳本片段用于在JSP頁面中編寫多行java代碼瑟曲。
? ? ? ? 語法:<% 多行java代碼 %>
? ? ? ? 注意:JSP腳本片段只能出現(xiàn)java代碼饮戳,不能出現(xiàn)其他模板元素,JSP引擎在翻譯JSP頁面中洞拨,會將JSP腳本片段中的Java代碼原封不動的放到Servlet的_jspService方法中扯罐。JSP腳本片段中的java代碼必須嚴(yán)格遵循java語法。
? ? ? ? 在一個(gè)JSP頁面中可以有多個(gè)腳本片段烦衣,在兩個(gè)或多個(gè)腳本片段之間可以嵌入文本歹河、HTML標(biāo)記和其他JSP元素。不同腳本片段中的代碼可以相互訪問花吟,猶如將所有的代碼放到一個(gè)<% %>中一樣秸歧。但是所有的腳本片段組合在一起必須是一個(gè)完整的java代碼。
4) JSP聲明
? ? ? ? JSP聲明中的java代碼會被翻譯到_jspService方法的外面衅澈。(面試題)
? ? ? ? 語法:<%! java代碼 %>
? ? ? ? 所以键菱,JSP聲明可用于定義JSP頁面轉(zhuǎn)換成Servlet程序的靜態(tài)代碼塊、成員變量和方法今布。多個(gè)靜態(tài)代碼塊纱耻、變量和方法可以定義在一個(gè)JSP聲明中芭梯,也可以分別單獨(dú)定義在多個(gè)JSP聲明中。
? ? ? ? JSP隱式對象的作用范圍僅限于Servlet的_jspService方法中弄喘,而JSP聲明的代碼會被翻譯到該方法的外面玖喘,所以在JSP聲明中不能使用這些隱式對象。
5) JSP注釋
? ? ? 語法:<%- 注釋信息 -%>
? ? ? JSP引擎在將JSP頁面翻譯成Servlet時(shí)蘑志,忽略JSP頁面中被注釋的內(nèi)容累奈。
? ? ? ? 如果在JSP中使用<!-- 注釋內(nèi)容-->時(shí),注釋內(nèi)容會打給瀏覽器急但,瀏覽器認(rèn)識這個(gè)注釋澎媒,所以不會顯示給用戶。而JSP注釋將注釋內(nèi)容不打給瀏覽器。
6) JSP指令
? ? ? ? JSP指令是為JSP引擎而設(shè)計(jì)的翎嫡,它們并不直接產(chǎn)生任何可見輸出词爬,而只是告訴引擎如何處理JSP頁面中其余的部分。
? ? ? ? 語法:<%@ 指令 屬性名="值" %>
? ? ? ? 如:<%@ page contentType="text/html;charset=UTF-8" %>? ? <%@ page import="java.util.Date" %>
? ? ? ? 如果一個(gè)指令有多個(gè)屬性储玫,這多個(gè)屬性可以寫在一個(gè)指令中,中間用空格隔開萤皂。即上面兩條指令等價(jià)表示如下:? ? ?
[html] view plaincopy
<%@ page contentType="text/html;charset=UTF-8" import="java.util.Date" %>? ? ? ? ?
? ? ? ? 在JSP2.0規(guī)范中共定義了三個(gè)指令:
? ? ? ? 1)page指令:
? ? ? ? page指令用于定義JSP頁面的各種屬性撒穷,無論page指令出現(xiàn)在JSP頁面中的什么地方,它的作用都是整個(gè)JSP頁面裆熙。為了保持程序的可讀性端礼,page指令最好放在整個(gè)JSP頁面的起始位置。?
? ? ? ? ? 語法:
[html] view plaincopy
<%@ page?
? ? ? ? ? ? ? [import="{package.class | package.*},..."]?
? ? ? ? ? ? ? [session="true | false"]?
? ? ? ? ? ? ? [errorPage=""relative_url]?
? ? ? ? ? ? ? [isErrorPage="true | false"]?
? ? ? ? ? ? ? [contentType="mimeType[;charset=characterSet]" | "text/html;charset=ISO-8859-1]?
? ? ? ? ? ? ? [pageEncoding="characterSet | ISO-8859-1"]?
? ? ? ? ? ? ? [isELIgnored="true | false"]?
%>? ?
? ? ? ? JSP引擎會自動導(dǎo)入如下包:java.lang.* / java.servlet.* / javax.servlet.jsp.* / javax.servlet.http.*
? ? ? ? JSP導(dǎo)入多個(gè)包的時(shí)候入录,可以分開寫蛤奥,也可以放在一起寫,放在一起的時(shí)候僚稿,使用逗號分隔:? ? ? ?
[html] view plaincopy
<%@ paga import="java.util.Date,java.sql.*,java.io.*"%>? ? ?
? ? ? ? session屬性設(shè)置為true時(shí)凡桥,翻譯后的servlet中會自動創(chuàng)建session對象,false則不創(chuàng)建贫奠。
? ? ? ? errorPage屬性用來設(shè)置錯誤相應(yīng)頁面唬血。它的值必須使用相對路徑,如果以"/"開頭唤崭,表示相對于當(dāng)前web應(yīng)用程序的根目錄(注意不是站點(diǎn)根目錄)拷恨,否則,表示相對于當(dāng)前頁面谢肾。也可以在web.xml文件中使用<error-page>元素為整個(gè)web應(yīng)用程序設(shè)置錯誤處理頁面腕侄,其中<exception-type>子元素指定異常類的完全限定名,<location>元素指定以"/"開頭的錯誤處理頁面路徑。如果設(shè)置了某個(gè)JSP頁面的errorPage屬性冕杠,那么在web.xml文件中設(shè)置的錯誤處理將不對該頁面起作用微姊。
? ? ? ? isErrorPage為true時(shí),表示該頁面是處理錯誤頁面分预,JSP引擎在翻譯成servlet時(shí)兢交,會定義一個(gè)exception對象,從而就可以用exception隱式對象獲得出錯信息笼痹。
? ? ? ? JSP引擎會根據(jù)page指令的contentType屬性生成相應(yīng)的調(diào)用ServletResponse.setContentType方法的語句配喳。? ? ?
? ? ? ? 2) include指令:?
? ? ? ? include指令用于引入其他JSP頁面,如果使用include指令引入了其他JSP頁面凳干,那么JSP引擎將把這兩個(gè)JSP翻譯成一個(gè)servlet晴裹,所以include指令引入通常稱為靜態(tài)引入。由于JSP引擎會把多個(gè)JSP頁面翻譯成一個(gè)Servlet救赐,所以涧团,在被引入的JSP中,全局架構(gòu)的代碼可以去掉(<html><head><body>等)(當(dāng)然這不是必須的)经磅,這樣避免與當(dāng)前JSP頁面中的重復(fù)泌绣。
? ? ? 語法:
[html] view plaincopy
<% include file="relativeURL"%>?
? ? ? 其中file屬性用于指定被引入文件的路徑。以"/"開頭馋贤,表示代表當(dāng)前web應(yīng)用赞别。
? ? ? 幾個(gè)細(xì)節(jié)需要注意:
? ? ? ? · 被引入的文件必須遵循JSP語法畏陕;
? ? ? ? · 被引入的文件可以使用任意的擴(kuò)展名配乓,即使擴(kuò)展名為html,JSP引擎也會按照處理JSP頁面的方式去處理惠毁,為了見名知意犹芹,JSP規(guī)范建議使用.jspf(JSP fragments)作為靜態(tài)引入文件的擴(kuò)展名;
? ? ? ? · 由于使用include指令將會涉及到2個(gè)JSP頁面,并會把2個(gè)JSP翻譯成一個(gè)Servlet鞠绰,所以這兩個(gè)JSP頁面的指令不能沖突(除了pageEncoding和導(dǎo)包除外)腰埂。比如現(xiàn)在要引入兩個(gè)JSP頁面,一個(gè)JSP中session="true"蜈膨,另一個(gè)JSP中session="false"屿笼,這樣在引入這兩個(gè)JSP頁面時(shí)就會產(chǎn)生沖突,服務(wù)器會報(bào)錯翁巍。
? ? ? 在JSP中也可以使用java代碼實(shí)現(xiàn)動態(tài)包含:?
[java] view plaincopy
<% request.getRequestDispather("relativeURL").include(request,response);%>?
? ? ? 這樣JSP引擎會將不同的JSP頁面翻譯成不同的Servlet驴一,動態(tài)包含只是引入其他JSP頁面的結(jié)果。動態(tài)包含的時(shí)候灶壶,服務(wù)器會調(diào)用多個(gè)web資源肝断,而靜態(tài)包含時(shí),被翻譯成一個(gè)Servlet,服務(wù)器只需要調(diào)用一個(gè)web資源胸懈,所以靜態(tài)包含性能好一點(diǎn)担扑,開發(fā)時(shí)用靜態(tài)包含。
? ? ? ? 3)taglib指令:用來導(dǎo)入自定義標(biāo)簽庫趣钱,見后面自定義標(biāo)簽部分的內(nèi)容
5. JSP運(yùn)行原理和9大隱式對象
? ? ? ? 由上文可知:每個(gè)JSP頁面在第一次被訪問時(shí)涌献,web容器都會把請求交給JSP引擎(即一個(gè)java程序)去處理。JSP引擎現(xiàn)將JSP翻譯成一個(gè)_jspServlet(實(shí)質(zhì)上也是一個(gè)Servlet)首有,然后按照Servlet的調(diào)用方式進(jìn)行調(diào)用洁奈。由于JSP第一次訪問時(shí)會翻譯成Servlet,所以第一次訪問通常會比較慢绞灼,但第二次訪問利术,JSP引擎如果發(fā)現(xiàn)JSP沒有變化,就不再翻譯低矮,而是直接調(diào)用印叁,所以程序的執(zhí)行效率不會受到影響。
? ? ? ? JSP引擎在調(diào)用JSP對應(yīng)的_jspServlet時(shí)军掂,會傳遞或創(chuàng)建9個(gè)與web開發(fā)相關(guān)的對象供_jspServlet使用轮蜕。JSP技術(shù)的設(shè)計(jì)者為便于開發(fā)人員在編寫JSP頁面時(shí)獲得這些web對象的引用,特意定義了9個(gè)相應(yīng)的變量蝗锥,開發(fā)人員在JSP頁面中通過這些變量就可以快速獲得這9大對象的引用跃洛,9大隱式對象是哪些以及各自的作用是什么?
[java] view plaincopy
request://就是Servlet里的request?
response: //就是Servlet里的response?
session: //就是Servlet里的session?
application: //就是servlet里的servletContext?
config: //就是Servlet里的servletConfig?
page: //就是Servlet自己?
exception: //異常终议,只有errorPage才有?
out://JSP頁面輸出?
pageContext:<span style="font-family:Microsoft YaHei;">//</span>pageContext對象是JSP技術(shù)中最重要的一個(gè)對象汇竭,它代表JSP頁面的運(yùn)行環(huán)境?
? ? ? ? pageContext對象是JSP技術(shù)中最重要的一個(gè)對象,它代表JSP頁面的運(yùn)行環(huán)境穴张,這個(gè)對象不僅封裝了對其它8大隱式對象的引用细燎,它自身還是一個(gè)域?qū)ο螅梢杂脕肀4鏀?shù)據(jù)皂甘。并且玻驻,這個(gè)對象還封裝了web開發(fā)中經(jīng)常涉及到的一些常用操作,例如引入和跳轉(zhuǎn)其它資源偿枕、檢索其它域?qū)ο笾械膶傩缘取?br>
[java] view plaincopy
getException<span style="font-family:Microsoft YaHei;">()? //</span>方法返回exception隱式對象?
getPage<span style="font-family:Microsoft YaHei;">()? //</span>方法返回page隱式對象?
getRequest()? //方法返回request隱式對象?
getResponse()? //方法返回response隱式對象?
getgetServletContext()? //方法返回application隱式對象?
getServletConfig()? //方法返回config隱式對象?
getSession()? //方法返回session隱式對象?
getOut()? //方法返回out隱式對象?
pageContext作為一個(gè)域?qū)ο箬邓玻€封裝了下面的方法:
[java] view plaincopy
//pageContext域?qū)ο蟮姆椒ǎ?
public void setAttribute(String name, Object value)?
public Object getAttribute(String name)?
public void removeAttribute(String name)?
//pageContext對象中還封裝了訪問其它域的方法(重要)?
public void setAttribute(String name, Object value, int scope)?
public Object getAttribute(String name, int scope)?
public void removeAttribute(String name, int scope)?
//代表各個(gè)域的常量?
pageContext.APPLICATION_SCOPE?
pageContext.SESSION_SCOPE?
pageContext.REQUEST.SCOPE?
pageContext.PAGE_SCOPE?
? ? ? ? 到現(xiàn)在為止,應(yīng)該可以看出pageContext對象的強(qiáng)大之處了渐夸!另外還有個(gè)findAttribute方法(*重要嗤锉,查找各個(gè)域中的屬性,EL表達(dá)式就依賴于這個(gè)方法)捺萌,可以直接調(diào)用pageContext.findAttribute(String name)档冬,首先會從pageContext里找該屬性膘茎,如果沒有,會依次按照下面順序在相應(yīng)的域中查找:request, session, servletContext酷誓,如果沒找著披坏,返回null,否則返回屬性值盐数。
? ? ? ? pageContext類中定義了一個(gè)forward方法和兩個(gè)include方法分別簡化和替代RequestDispatcher.forward方法和include方法棒拂,方法接收的資源如果以"/"開頭,"/"代表當(dāng)前web應(yīng)用玫氢。不過這里的include是動態(tài)包含帚屉,不建議使用include。
6. JSP標(biāo)簽
? ? ? ? JSP標(biāo)簽也稱為JSP動作元素漾峡,它用于在JSP頁面中提供業(yè)務(wù)邏輯功能攻旦,避免在JSP頁面中直接編寫java代碼造成JSP頁面難以維護(hù)。JSP有三種標(biāo)簽
1) <jsp:include>標(biāo)簽
? ? ? ? <jsp:include>標(biāo)簽用于把另外一個(gè)資源的輸出內(nèi)容插入進(jìn)當(dāng)前JSP頁面的輸出內(nèi)容之中生逸,這種在JSP頁面執(zhí)行時(shí)的引入方式稱為動態(tài)引入牢屋。
? ? ? ? 語法:
[html] view plaincopy
<jsp:include page="relativeURL | <%= expression%>" flush="true | false" />?
? ? ? ? 相當(dāng)于調(diào)用pageContext.include("relativeURL")
? ? ? ? page屬性用于指定被引入資源的相對路徑,它也可以通過執(zhí)行一個(gè)表達(dá)式來獲得槽袄。flush屬性指定在插入其他資源的輸出內(nèi)容時(shí)烙无,是否先將當(dāng)前JSP頁面都已輸出的內(nèi)容刷新到客戶端。
2) <jsp:forward>標(biāo)簽
? ? ? ? <jsp:forward>標(biāo)簽用于把請求轉(zhuǎn)發(fā)給另一個(gè)資源
? ? ? ? 語法:
[html] view plaincopy
<jsp:forward page="relativeURL | <%= expression%>" />?
? ? ? ? page屬性用于指定請求轉(zhuǎn)發(fā)到的資源的相對路徑遍尺,它可以通過執(zhí)行一個(gè)表達(dá)式來獲得截酷。
3) <jsp:param>標(biāo)簽
? ? ? ? 當(dāng)使用<jsp:include>和<jsp:forward>標(biāo)簽引入或?qū)⒄埱筠D(zhuǎn)發(fā)給其它資源時(shí),可以使用<jsp:param>標(biāo)簽向這個(gè)資源傳遞參數(shù)乾戏。
? ? ? ? 語法1:
[html] view plaincopy
<jsp:include page="relativeURL | <%=expression%>">?
? ? ? <jsp:param name="parameterName" value="parameterValue | <%=expression%>" />?
</jsp:include>?
? ? ? ? 相當(dāng)于relativeURL?name=...&value=....
? ? ? ? 語法2:
[html] view plaincopy
<jsp:forward page="relativeURL | <%=exception%>">?
? ? ? <jsp:param name="parameterName" value="parameterValue | <%=expression%>" />?
</jsp:forward>?
? ? ? ? 相當(dāng)于relativeURL?name=...&value=....
? ? ? ? <jsp:param>標(biāo)簽的name屬性用于指定參數(shù)名迂苛,value屬性用于指定參數(shù)值。在<jsp:include>和<jsp:forward>標(biāo)簽中可以使用多個(gè)<jsp:param>標(biāo)簽來傳遞多個(gè)參數(shù)歧蕉。
7. JSP映射
? ? ? ? JSP也可以像Servlet那樣映射灾部,因?yàn)镴SP本來就是Servlet康铭。
[html] view plaincopy
<servlet>?
? ? <servlet-name>SimpleJspServlet</servlet-name>?
? ? <jsp-file>/jsp/simple.jsp</jsp-file>?
</servlet>?
?
<servlet-mapping>?
? ? <servlet-name>SimpleJspServlet</servlet-name>?
? ? <url-pattern>/xxx/yyy.html</url-pattern>?
</servlet-mapping>?
? ? ? ? /jsp/simple.jsp表示在webRoot/jsp目錄下的simple.jsp文件
8. 四個(gè)域?qū)ο?br>
? ? ? ? 到目前為止惯退,web開發(fā)共接觸到了4個(gè)域?qū)ο螅@4個(gè)域?qū)ο笫菍W(xué)習(xí)web的重點(diǎn)从藤,也是筆試經(jīng)炒吖颍考察的知識點(diǎn):
[java] view plaincopy
pageContext(稱為page域): //pageContext中存的數(shù)據(jù)在頁面范圍都可以取出?
request(稱為request域):? //request中存的數(shù)據(jù)在請求范圍內(nèi)都可以取出?
session(稱為session域):? //session中存的數(shù)據(jù)在會話范圍內(nèi)都可以取出?
servletContext(稱為application域)://servletContext中存的數(shù)據(jù)在整個(gè)應(yīng)用程序范圍內(nèi)都可以取出?
? ? ? ? 明確如下兩個(gè)問題:這四個(gè)對象的生命周期?哪種情況下用哪種對象夷野?
? ? ? ? request:如果客戶機(jī)向服務(wù)器發(fā)請求產(chǎn)生的數(shù)據(jù)懊蒸,用戶看完就沒用了,向這樣的數(shù)據(jù)就存在request域中悯搔。如用戶看的新聞骑丸。
? ? ? ? session:如果客戶機(jī)向服務(wù)器發(fā)請求產(chǎn)生的數(shù)據(jù),用戶用完了等一會兒還有用,向這樣的數(shù)據(jù)就存在session域中通危。如用戶購買的東西铸豁,因?yàn)榻Y(jié)賬還要用到。
? ? ? ? servletContext:如果客戶機(jī)向服務(wù)器發(fā)請求產(chǎn)生的數(shù)據(jù)菊碟,用戶用完了還要給其他用戶用节芥,向這樣的數(shù)據(jù)就存在servletContext域中。如聊天室中說出的話逆害,因?yàn)樵捯谧约喉撁嬷锌吹酵纺鳎瑒e人也要看到。
? ? ? ? 實(shí)際中魄幕,能用小的容器就不要用大的相艇,即request能滿足就不要用session,session能滿足就不要用servletContext
9. 總結(jié)
? ? ? ? 由于JSP一般都是通過servlet轉(zhuǎn)發(fā)過來纯陨,servlet會通過容器將數(shù)據(jù)帶過來厂捞,所以會使用JSP從容器中取出數(shù)據(jù)然后顯示出來即可。取數(shù)據(jù)用腳本片段<%%>來取队丝,顯示用腳本表達(dá)式<%= %>處理靡馁。在學(xué)習(xí)了EL表達(dá)式和自定義標(biāo)簽后,腳本片段就可以用自定義標(biāo)簽替代机久,腳本表達(dá)式就可以用EL表達(dá)式替代了臭墨。