1.九大內(nèi)置對(duì)象
在一篇中我們知道tomcat服務(wù)器翻譯成了java源文件掸掸,每次說(shuō)jsp文件時(shí)都會(huì)調(diào)用_jspService方法,當(dāng)該方法中我們可以看到:
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
當(dāng)用page指定指定當(dāng)前頁(yè)面是否為錯(cuò)誤處理頁(yè)面時(shí)還會(huì)多幾行:
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
以上即為我們所說(shuō)的JSP九大內(nèi)置對(duì)象昔瞧,JSP技術(shù)的設(shè)計(jì)者為便于開(kāi)發(fā)人員在編寫(xiě)JSP頁(yè)面時(shí)獲得這些web對(duì)象的引用昆咽,特意定義了9個(gè)相應(yīng)的變量呛伴,開(kāi)發(fā)人員在JSP頁(yè)面中通過(guò)這些變量就可以快速獲得這9大對(duì)象的引用臣疑。
概括如下:
注意:
out隱式對(duì)象:
out隱式對(duì)象用于向客戶(hù)端發(fā)送文本數(shù)據(jù)。
out對(duì)象是通過(guò)調(diào)用pageContext對(duì)象的getOut方法返回的,其作用和用法ServletResponse.getWriter方法返回的PrintWriter對(duì)象非常相似缨称。
JSP頁(yè)面中的out隱式對(duì)象的類(lèi)型為JspWriter凝果,JspWriter相當(dāng)于一種帶緩存功能的PrintWriter,設(shè)置JSP頁(yè)面的page指令的buffer屬性可以調(diào)整它的緩存大小睦尽,甚至關(guān)閉它的緩存器净。
只有向out對(duì)象中寫(xiě)入了內(nèi)容,且滿(mǎn)足如下任何一個(gè)條件時(shí)当凡,out對(duì)象才去調(diào)用ServletResponse.getWriter方法山害,并通過(guò)該方法返回的PrintWriter對(duì)象將out對(duì)象的緩沖區(qū)中的內(nèi)容真正寫(xiě)入到Servlet引擎提供的緩沖區(qū)中:
- 1.設(shè)置page指令的buffer屬性關(guān)閉了out對(duì)象的緩存功能
- 2.out對(duì)象的緩沖區(qū)已滿(mǎn)
- 3.刷新緩存區(qū)
- 4.整個(gè)JSP頁(yè)面結(jié)束
pageContext對(duì)象:
pageContext對(duì)象的類(lèi)型是PageContext,叫jsp的上下文對(duì)象
封裝了其它8大隱式對(duì)象的引用,代表當(dāng)前JSP頁(yè)面的運(yùn)行環(huán)境,可以通過(guò)pageContext獲取其他八個(gè)內(nèi)置對(duì)象
- 1.getException方法返回exception隱式對(duì)象
- 2.getPage方法返回page隱式對(duì)象
- 3.getRequest方法返回request隱式對(duì)象
- 4.getResponse方法返回response隱式對(duì)象
- 5.getServletConfig方法返回config隱式對(duì)象
- 6.getServletContext方法返回application隱式對(duì)象
- 7.getSession方法返回session隱式對(duì)象
- 8.getOut方法返回out隱式對(duì)象
2. 四大域?qū)ο?/h2>
用于保存數(shù)據(jù)沿量、獲取數(shù)據(jù)和共享數(shù)據(jù)
2.1 域?qū)ο蠓椒ǎ?/h3>
2.1.1 保存數(shù)據(jù)
用于保存數(shù)據(jù)沿量、獲取數(shù)據(jù)和共享數(shù)據(jù)
2.1.1 保存數(shù)據(jù)
setAttribute("name",Object); //pageContext對(duì)象還可以保存數(shù)據(jù)到指定域浪慌,默認(rèn)為page域
2.1.1 獲取數(shù)據(jù)
getAttribute("name") ; //pageContext對(duì)象還可以獲取指定域的數(shù)據(jù),默認(rèn)為page域
2.1.1 清除數(shù)據(jù)
removeAttribute("name")
2.1.1 搜索數(shù)據(jù)
pageContext.findAttribute("name"); //pageContext特有,自動(dòng)在四個(gè)域中搜索數(shù)據(jù)
順序: page域 -> request域 -> session域- > context域(application域)
3.EL表達(dá)式
全名為Expression Language朴则,用于向?yàn)g覽器輸出域?qū)ο笾械淖兞恐祷虮磉_(dá)式計(jì)算的結(jié)果
語(yǔ)法: ${變量或表達(dá)式}
1)輸出基本數(shù)據(jù)類(lèi)型變量
1.1 從四個(gè)域獲取
${name}
1.2 指定域獲取
${pageScope.name}
域范圍: pageScope/ requestScope / sessionScope / applicationScope
2)輸出對(duì)象的屬性值
Student
3)輸出集合對(duì)象
List 和 Map
4)EL表達(dá)式計(jì)算
舉例1:獲取域中的變量
<%--
1)從四個(gè)域自動(dòng)搜索
--%>
${name }
<%--
${name } 等價(jià)于
<%=pageContext.findAttribute("name")%>
--%>
<%--
2) 從指定的域中獲取數(shù)據(jù)
--%>
${pageScope.name }
<%--
pageScope為EL中的隱含對(duì)象权纤,像這樣的還有requestScope,sessionScope乌妒,applicationScope汹想,pageContext等十一個(gè)
${pageScope.name } 等價(jià)于
<%= pageContext.getAttribute("name",PageContext.PAGE_SCOPE)%>
--%>
舉例2:獲取域中的對(duì)象
<%
//保存數(shù)據(jù)
Student student = new Student("eric",20);
//放入域中
pageContext.setAttribute("student",student);
//List
List<Student> list = new ArrayList<Student>();
list.add(new Student("rose",18));
list.add(new Student("jack",28));
list.add(new Student("lucy",38));
//放入域中
pageContext.setAttribute("list",list);
//Map
Map<String,Student> map = new HashMap<String,Student>();
map.put("100",new Student("mark",20));
map.put("101",new Student("maxwell",30));
map.put("102",new Student("narci",40));
//放入域中
pageContext.setAttribute("map",map);
%>
<%--使用EL獲取對(duì)象 --%>
${student.name} - ${student.age }
<%--
${student.name} 等價(jià)于 (點(diǎn)相對(duì)于調(diào)用getXX()方法)
<%=((Student)pageContext.findAttribute("student")).getName()%>
--%>
<hr/>
<%--使用EL獲取List對(duì)象 --%>
${list[0].name } - ${list[0].age }<br/>
${list[1].name } - ${list[1].age }<br/>
${list[2].name } - ${list[2].age }
<%--
list[0]等價(jià)于 (中括號(hào)相對(duì)于調(diào)用get(參數(shù))方法)
((List)pageContext.findAttribute("list")).get(0)
--%>
<hr/>
<%--使用EL獲取Map對(duì)象 --%>
${map['100'].name } - ${map['100'].age }<br/>
${map['101'].name } - ${map['101'].age }<br/>
${map['102'].name } - ${map['102'].age }<br/>
舉例3:表達(dá)式計(jì)算
<%--
1)算術(shù)表達(dá)式
+ - * /
--%>
${10+5 }<br/>
${10*5 }
<hr/>
<%--
2)比較運(yùn)算
> < >= <= == !=
--%>
${10>5 }<br/>
${10<5 }<br/>
${10!=10 }
<hr/>
<%--
3)邏輯運(yùn)算
&& || !
--%>
${true && false }<br/>
${true || false }<br/>
${!false }<br/>
<hr/>
<%--
4)判空
null 或 空字符串: empty
--%>
<%
//String name = "eric";
//String name = null;
String name = "";
pageContext.setAttribute("name",name);
%>
判斷null: ${name==null }<br/>
判斷空字符: ${name=="" }<br/>
判空: ${name==null || name=="" }
另一種判空寫(xiě)法: ${empty name }