熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JSP知識點總結

2022-06-13   來源: Java核心技術 

  JSP(Java Server Page)

  JSP是服務器端運行的頁面JSP本就是一個文檔他不僅可以包含靜態的HTML代碼也可以包含動態的JAVA代碼服務器容器可以將JSP轉換成Servlet發布並接受請求

  Jsp文件只需放在應用文件下就可以了

  JSP例子<html> <head><title>time</title></head> <body> <h><%=new javautilDate()%></h> </body> </html> JSP運行過程JSP文件先要翻譯成Java文件(Servlet)在tomcat中翻譯後的java文件在tomcat下的work\Catalina\localhost中相應名字的應用目錄裡

  編譯Java文件運行class文件Tomcat的全局配置文件在Tomcat下的conf目錄中的webxml是服務器全局的配置文件其中要想關閉列表顯示叫要把<initparam> <paramname>listings</paramname> <paramvalue>false</paramvalue> </initparam> Tomcat的管理員設置在tomcat下的conf目錄中的tomcatusexml文件中可以配置tomcat的用戶角色<tomcatusers> <role rolename=manager description=/> <role rolename=admin/><!——設定角色的名字admin是管理員manager是項目管理——> <user username=manager password= roles=manager/><!——設定用戶名密碼和角色——> <user username=admin password= roles=admin/> </tomcatusers> JSP的特點JSP不需要編譯JSP不需要進行配置JSP本質上就是一個Servlet JSP是以靜態頁面為主的

  JSP的語法格式<%=……%>表達式寫表達式時不要加上分號表達式翻譯成Java代碼也就是直接使用流輸出也就不能加分號了

  <%! int a= %>聲明使用聲明的變量所創建的變量是在service方法體外也就是翻譯成實例變量聲明也可以聲明內部類或者是方法的聲明

  <% if(a==){ a=}%>代碼片斷代碼段會原樣翻譯在代碼段中聲明的變量就會被翻譯的service的方法體中也就是被翻譯成局部變量

  前三種JSP的語法也叫做JSP代碼以上的表示方法都有與之相對應的xml表達形式因為可讀性較差所以較少使用

  <%@ …… %>JSP指令<%@page import=…………%>引入包<%include file=……%>直接引入內容這些內容會直接嵌入到頁面中

  JSP的注釋<%——……——%> JSP指令和JSP動作(標准的JSP標簽)

  JSP指令的語法<%@…… ……%> <%@include file=……%> 包含指令包含指令會將要包含的文件代碼原樣輸出到本頁面(在翻譯時把包含文件的內容引入並合並)不進行翻譯file屬性制定要包含的文件的名字(注意要包含的文件的路徑)這個指令可以實現頁面的復用

  注意<%@include file= %>要包含的JSP文件中不能定義重名的變量如果不使用包含指令那麼JSP中的最小轉換單元就是JSP文件使用了包含指令就會將多個jsp的結果合並到一起

  <%@page ……%>頁面指令<%@page import=……%> 引入包 例<%@page import=javautil*ent*%>(可出現多次)

  <%@page pageEncoding=GBK%>設定頁面顯示的字符集<%@page contentType=text/htmlcharset=GBK%>設置輸出流的編碼方式和文件格式

  注意輸出的字符集編碼方式要和頁面顯示的字符集相同一般定義輸出流的編碼方式注意以上兩個頁面指令在JSP中最好只出現一次注意在請求中傳送的參數的值是中文的話需要調用請求request的setCharacterEncoding(……)方法設置相應的編碼方式只適用於post請求也可以通過Servlet的Filter來進行中文編碼方式的處理

  <%@page language=java%>指定JSP的腳本語言現在只能寫java <%@page extends=……> 指定翻譯後代碼類型的父類最好不要使用這個指令<%@page session=true|false%>指定是否自動創建Session最好不自己指定使用默認值<%@page buffer=…… autoflush=true|false%>設置輸出的緩存和是否自動刷新緩存一般情況下都使用默認值緩存的默認值為KB <%@page isThreadSafe=true|false%>是否線程安全默認為true也就是線程安全只使用默認值

  <%@page info=……%>設置頁面信息一般不用<%@page errorPage=%>指定異常處理頁面<%@page isErrorPage=true|false%>設定本頁面就是異常後跳轉的頁面<%@page isELIgnored=true|false%>設定本頁面是否忽略JSP種EL表達式<%@taglib ……%> 標簽庫指令用於引入自定義標簽庫JSP動作<jsp…… ……> <jspinclude page=…… flush=true|false> include動作是在翻譯和編譯後運行時進行響應的合並也就是對應了Servlet中RequestDispatcher類的include(ServletRequest request ServletResponse response)方法

  include動作可以傳遞參數<jspinclude page=testjsp> <jspparam name=user value= > </jspinclude>在使用參數時可以用request內置對象來獲取參數的值

  <jspforward page=xxx/xxxjsp>forward動作對應的是Servlet中RequestDispatcher類的forward(ServletRequest request ServletResponse response)方法也就是把請求進行轉發

  也可以寫成<jspforward> <jspattribute name=page>xxx/xxxjsp</jspattribute> </jspforward>這種寫法等價於上面的寫法

  在使用Servlet的response的重定向sendRedirect(String location)方法在使用時要包含應用的路徑注意重定向會放棄這個請求並向服務器發送一個新的請求但是響應對象還是一個重定向是用來避免重復提交的

  注意對頁面的刷新操作就會再一次運行程序也就仿佛進行了再一次的提交一樣這也就是重復提交的問題所以需要使用重定向來解決這個問題

  <jspplugin  type=bean|applet code=……>……

  </jspplugin> jspplugin動作可以使頁面上運行applet或者是使用java代碼

  <jspuseBean id=對象名 class=類全名|type=類全名(使用多態時使用) beanName=類全名 scope=page|request|session|application> jspuseBean動作可以通過這個動作來使用java代碼id就是變量名clss和type的區別在於使用type是不會創建對象而只是會先查找如果有該對象就會使用如果沒有就會拋出異常class在沒有該對象存在時則會創建新對象scope是用來保存實例的空間范圍pagerequestsessionapplication由小到大默認為page <jspsetProperty name=對象名 property=屬性名 value=屬性值/>直接指定Bean屬性的值必須類型一致

  <jspsetProperty name=對象名 property=屬性名 param=from表單中的響應的參數名/>用表單中指定的參數來為Bean屬性賦值系統會自動作類型轉換

  <jspsetProperty name=對象名 property=屬性名/>用表單中和Bean屬性同名的標單項來給Bean屬性賦值這樣寫只會為指定的屬性賦值<jspsetProperty name=對象名 property=*/>這種方式會自動用表單中的同名參數來為Bean的所有屬性賦值<jspsetProperty name=對象名 property=屬性名 value=<%= ……%>/>使用表達式來為Bean的屬性進行賦值<jspgetProperty name=對象名 property=屬性名>取得指定的屬性這個動作不常用一般用表達式代替我們可以通過設置屬性名的方法名也就是setXxxx()來控制屬性的賦值用form表單的參數為Bean的屬性賦值時系統會自動的調用與之同名屬性的setXxxx()方法尤其是日期類型可以通過使用這一方法來處理

  例import javasql*public class Person{ private Srting nameprivate Date birthdaypublic void setName(String name){ thisname=name} public void setBirthdayAsString(String birthday){ thissetBirthday(valueOf(birthday))} public void setBirthday(Date birthdays){ thisbirthday=birthday} addjsp <jspuseBean id=person type=Person scope=request> <jspsetProper name=person property=*/> </jspuseBean> toaddjsp <form action=xxx methmod=post> <input type=text name=name> <input type=text name=birhtdayAsString> <input type=submit value=addjsp> </form> JavaBean和EJB的區別JavaBean是可視的或者是不可視的不用部署EJB是不可視的需要部署到服務器中

  JavaBean部署在應用程序中 EJB是部署在容器中可以是有狀態或者是無狀態的聲明式事務

  JavaBean的屬性和方法是普通的EJB是需要遵守規范是需要通過標准的描述符來定義的

  JavaBean是基於事件驅動的EJB中只有消息驅動Bean是基於事件的注意jspuseBean動作用表單為Bean的屬性賦值時也就是jspsetProperty動作直接收請求中表單的信息為使用的Bean的屬性進行賦值也就是說jspuseBean和jspsetProperty不能夠出現在為這個Bean的屬性賦值的form表單的頁面上

  JSP的異常處理<%@page errorPage=xxxjsp%> 指定本頁面出現異常後要轉到的頁面<%@page iserrorPage=true%> 見本頁面指定為異常處理頁面也就是其他出異常的頁面可以指定本頁面為要轉到的異常處理頁面

  處理異常運行時異常) 一個程序運行時重獲的錯誤) 能被一固有的異常對象引用所使用) 可以利用異常引用創建或產生一個JSP頁面顯示異常信息給用戶

  創建一個異常跟蹤方案) 在每一個JSP頁面包含要創建的異常頁面名稱<%@page import=numberguessNumberGuessBean errorPage=errorjsp%> ) 創建一個異常頁面<%@page isErrorPage=true%> JSP頁面中的異常處理) <%=exceptiontoString()%>        打印異常名稱) <%exceptionprintStackTrace()%> 打印當前錯誤流中所有錯誤的列表) <%=exceptiongetMessage()%> 打印錯誤的詳細描述信息JSP中異常頁面的部署描述<errorpage> <errorcode></errorcode> <location>l</location> </errorpage> <errorpage> <exceptiontype>javalangNumberFormatException</exceptionpage> <location>errorjsp</location> </errorpage> JSP隱含內置對象JSP中隱含內置對象名稱         類型                                     注釋和范圍request      javaxservlethttpHttpServletRequest                    request response     javaxservlethttpHttpServletResponse                  response page         javaxlangObject                                 page Exception    javalangThrowable                               page pageContext  javaxservletjspPageContext                          page session      javaxservlethttpHttpSession                         session application  javaxservletServletContext                     ServletContext out          javaxservletjspJspWriter                          OutputStream config       javaxservletServletConfig                           ServletConfig內置對象request(HttpServletRequest)

  )封裝了來自客戶端的請求)方法Parameter related methods+getParameterNames()Enumberation 返回form中對象名稱的枚舉+getParameter(String name)String返回指定名稱的對象值+getParameterValues(String name) String[ ] 返回指定名稱的對象值數組+getParameterMap()Map Attribute related methods+setAttribute(String nameObject value) void  設置屬性+getAttribute(String name) Oject  返回屬性值+removeAttribute(String name) void +getAttributeNames()Enumberation  返回屬性名稱URL related methods+getContextPath()String +getServletPath()String +getPathInfo()String State related methods+getCookies()Cooie[ ] 取得Cookie數組+getSession()HttpSession +getSession(Boolean create) HttpSession

  內置對象response(HttpServletResponse)

  +getWriter()PrintWriter +addCookie(Cookie c) void +encodeURL(String URL) String +sendRedirect(String URL) void +sendError(int errorCode) void

  內置對象session(HttpSession)

  +setAttribute(String nameObject value) void  設置屬性+getAttribute(String name) Oject  返回屬性值+removeAttribute(String name) void +getAttributeNames()Enumberation  返回屬性名稱Other motheds+seMaxInactiveInterval(int seconds) void Invalidate()void

  內置對象pageContext(PageContext)

  +setAttribute(String nameObject value) void  設置屬性+getAttribute(String name) Oject  返回屬性值+removeAttribute(String name) void +getAttributeNames()Enumberation  返回屬性名稱+findAttribute(String name) Object Other motheds+getRequest()HttpServletRequest +getSession()HttpSession +getServletContext()ServletContext +getOut()JspWriter

  內置對象application(ServletContext)

  +setAttribute(String nameObject value) void  設置屬性+getAttribute(String name) Oject  返回屬性值+removeAttribute(String name) void +getAttributeNames()Enumberation  返回屬性名稱Other methods+getRequstDispather(String URL)RequestDispather +getInitParameter(String name) String內置對象out )JSPWriter的一個實例 用於發送響應給客戶端)方法print(String)/println(String) 用於向頁面輸出print(int)/println(int)

  flush() 刷新out對象的緩存內置對象exception ) 用於異常對象的異常實例) 異常頁面在page指令中存在屬性 isErrorPage=true) 方法getMessage()/printStackTrace()/toString()

  內置對象session ) HttpSession的一個實例 用於來維護session的狀態) 方法getAttribute(String name)/setAttribute(String name)

  取得設置的屬性的對應資源/設置屬性的對應資源removeAttribute(String name) 刪除屬性和隊應資源getAttributeNames()

  返回值是一個迭代器可以獲得session中設置的屬性的名字也就是在set時使用的與資源對應的那個名字內置對象application ) ServletContext一個實例用來維護application的狀態) 方法getAttribute()/setAttribute() 和session以及request中的那一對設置屬性及其對應資源的方法getInitParameter()   獲得初始化參數getServletInfo()  獲得Servlet的信息) application的作用域比session大得多一個session和一個client聯系 而application保持了用於所有客戶端的狀態

  注意如果要保存的數據量比較大時就要使用生命周期比較短的request對象page對象只在本頁面中有效也就是會再翻譯後的service方法體內的一個局部變量service運行結束後就會銷毀不像request可以轉發session和application的生命周期都比較長而且作用域比較大

  JSP自定義標簽(tag)

  什麼是自定義標簽?

  用戶自定義的Java語言元素 實質是運行一個或者兩個接口的JavaBean可以非常緊密地和JSP的表示邏輯聯系在一起又具有和普通JavaBean相同的業務邏輯處理能力當一個JSP頁面轉變為servlet時其間的用戶自定義標簽轉化為操作一個稱為標簽hander的對象可操作默認對象處理表單數據訪問數據庫以及其它企業服務自定義標簽庫的特點通過調用頁面傳遞參數實現定制訪問所有對JSP頁面可能的對象修改調用頁面生成的響應自定義標簽間可相互通信在同一個JSP頁面中通過標簽嵌套可實現復雜交互

  如何使用自定義標簽庫聲明標簽庫使標簽庫執行對Web應用程序可用聲明標簽庫使用taglib指令聲明標簽庫語法<%@taglib uri=URI prefix=pre %>注意a uri屬性可以是絕對的也可以是相對URL該URL指向標記庫描述符(TLD)文件b uri屬性也可以是一個並不存在的URL該URL為webxml文件中將標記庫描述符(TLD)文件的絕對URL到本地系統的一個映射范例<%@taglib uri=/WEBINF/templatetld prefix=test %> <%@taglib uri= prefix=core %>使標簽庫執行可用方式一在WEBINF/classes目錄下部署標記處理程序類方式二將標記處理程序類打包成jar文件並置於WEBINF/lib目錄

  幾種典型的標簽不帶屬性和主體的簡單標簽<mytaglibsSomeTag/>不帶主體但有屬性的標簽<mytaglibsSomeTag user=TonyDeng/>帶有主體和屬性的標簽<mytaglibsSomeTag user=TonyDeng>……// 標簽體</mytaglibsSomeTag>注意a 屬性列於start tag中它是在標記庫描述符(TLD)文件中指定服務於標記庫的自定義行為b 標簽體位於start tag和end tag間可以是任何合法的JSP內容或者標簽定義標簽開發實現tag的類(tag handler)編輯標記庫描述符(TLD)文件在webxml中為標記庫描述符(TLD)文件的絕對URL建立一個映射(該步驟可選)標記庫描述符(TLD)文件一個描述標記庫的XML文件內容開始是整個庫的描述然後是tag的描述標記庫描述符(TLD)文件用於Web Container確認tag以及JSP頁面發展工具實現tag的類(標簽處理器)(tag handler)

  是一些在引用了標簽的JSP頁面執行期間被Web Container調用以求自定義標簽值的對象必須實現Tag SimpleTag和BodyTag之一可以繼承TagSupport和BodyTagSupport之一

  標簽庫的接口和類的繼承關系接口的繼承關系☉ interface javaxservletjsptagextJspTag☉ interface javaxservletjsptagextSimpleTag☉ interface javaxservletjsptagextTag☉ interface javaxservletjsptagextIterationTag☉ interface javaxservletjsptagextBodyTag類的繼承關系☉ class javaxservletjsptagextTagSupport(implements javaxservletjsptagextIterationTag javaioSerializable)

  ☉ class javaxservletjsptagextBodyTagSupport(implements javaxservletjsptagextBodyTag)

  ☉ class javaxservletjsptagextSimpleTagSupport(implements javaxservletjsptagextSimpleTag)

  (Interface)

  JspTag | |ˉˉˉˉˉˉˉˉ|(Interface)      (Interface)JSP Tag           SimpleTag ←——SimpleTagSupport |(Interface)

  IterationTag←——TagSupport支持迭代的標簽         | |                 |(Interface)           | BodyTag ←--BodyTagSupport可以處理標簽體自定義標簽的開發步驟寫標簽處理器也就是一個符合自定義標簽規范的類 xxxjava 寫標簽庫定義文件也就是定義標簽的格式規范也要符合自定義標簽的規范 xxxtld 建上述兩步中的相應文件進行部署webxml tld文件中的配置<tag> <name>loop</name> <tagclass>comtagLoopTag</tagclass> <bodycontent>jsp</bodycontent> <!——設定自定義標簽體內的內容可以置為empty也就是只能寫空標簽——> <attribute> <name>counter</name><!——配置自定義標簽的屬性名——> <required>true</required><!——配置屬性是否必須出現——> <rtexprvalue>true</rtexprvalue><!——允許使用表達式作為屬性的值——> <type>int<type><!——配置屬性的類型——> </attribute> </tag>簡單的標簽處理程序類必須實現Tag接口的doStartTag()和doEndTag()方法因為不存在BodydoStartTag()方法必須返回SKIP_BODY如其余頁面要執行doEndTag()方法返回EVAL_PAGE 否則返回SKIP_PAGE對於每一個標簽屬性你必須在標簽處理程序類裡定義一個特性以及get和set方法以一致於JavaBeans   體系慣例帶Body的自定義標簽必須實現Tag接口的doStartTag()和doEndTag()方法可以實現IterationTag接口的doAfterBody()方法可以實現BodyTag接口的doInitBody和setBodyContent方法doStartTag方法可以返回SKIP_BODYEVAL_BODY_INCLUDE或者EVAL_BODY_BUFFERED(當你想使用     BodyContent)doEndTag方法可以返回SKIP_PAGE或EVAL_PAGEdoAfterBody方法可以返回EVAL_BODY_AGAIN SKIP_BODY定義腳本變量的標簽(迭代標簽)

  定義腳本標簽的二個步驟 在標記庫描述符(TLD)文件中列明腳本變量 定義標簽擴展信息類(TEI)並且在TLD文件中包括這個類元素(teiclass)變量必須在標簽處理程序類中使用pageContextsetAttribute()方法設置標簽擴展信息類(TEI)必須繼承TagExtraInfo以及覆蓋getVariableInfo()方法變量的范圍可以是AT_BEGIN NESTED AT_END(標簽擴展信息類(TEI)的VariableInfo中定義)之一腳本變量的有效性變量     |   有效性

  

  NESTED   | 標簽中的參數在starttag到endtag之間是有效的AT_BEGIN | 標簽中的參數在標簽的開始到JSP頁面結束是有效的AT_END   | 標簽中的參數在標簽的結束到JSP頁面結束是有效的Tag接口的方法interface javaxservletjsptagextTag

  

  +EVAL_BODY_INCLUDEint +EVAL_PAGEint//繼續執行頁面+SKIP_BODYint//跳出標簽體+SKIP_PAGEint//跳出頁面也就是整個JSP不會再運行

  

  +release()void +getParent()javaxservletjsptagextTag +setParent(javaxservletjsptagextTag)void +doEndTag()int +doStartTag()int +setPageContext(javaxservletjspPageContext)void Tag的生命周期setPageContext(javaxservletjspPageContext)void setParent(javaxservletjsptagextTag)void setAttributevoid doStartTag()int doEndTag()int release()void BodyTag和Tag接口的關系interface javaxservletjsptagextBodyTag——>interface javaxservletjsptagextTag

  

  +EVAL_BODY_AGAINint//繼續執行標簽體

  

  +doInitBody()void +setBodyContent(javaxservletjsptagextBodyContext)void +doAfterBody()int BodyTag的處理過程setPageContext(javaxservletjspPageContext)void setParent(javaxservletjsptagextTag)void //設置此標簽的父標簽也就是上一層標簽setParent()

  doStartTag()int setBodyContent(javaxservletjsptagextBodyContent)void//設置方法體doInitBody()void// doAfterBody()int /* 這個方法會被不斷的調用直到不再滿足條件通過這個方法來控制返回從而控制循環是否中斷SKIP_BODY是跳出標簽體的EVAL_BODY_INCLUDE是繼續執行標簽體通過返回這兩個值來控制循環是否*/ doEndTag()int release()void SimpleTag接口的方法javaxservletjsptagextSimpleTag

  

  +doTag()void +getParent()JspTag +setJspBody(JspFragment jspBody)void +setJspContext(JspContext pc)void +setParent(JspTag parent)void SimpleTage接口的生命周期(JSP的自定義標簽接口)

  new每次遇到標簽容器構造一個SimpleTag的實例這個構造方法沒有參數和紅典的標簽一樣          SimpleTag不能緩沖故不能重用每次都需要構造新的實例

  setJspContext()setParent() 只有這個標簽在另一個標簽之才調用setParent()方法設置屬性調用每個屬性的setter方法setJspBody()doTag() 所有標簽的邏輯迭代和Body計算都在這個方法中return例package comtagpublic class HelloTag implements Tag { private PageContext pageContextprivate Tag parentpublic HelloTag(){ super()}

  /** *設置標簽的頁面的上下文*/ public void setPageContext(final PageContext pageContext) { thispageContext=pageContext} /** *設置上一級標簽*/ public void setParent(final Tag parent) { thisparent=parent} /** *開始標簽時的操作*/ public int doStartTag() throws JspTagException{ return SKIP_BODY  //返回SKIP_BODY表示不計算標簽體} /** *結束標簽時的操作*/ public int doEndTag() throws JspTagException{ try{ pageContextgetOut()write(Hello World!你好世界!} catch(javaioIOException e){ throw new JspTagException(IO Error + egetMessage())} return EVAL_PAGE} /** *release用於釋放標簽程序占用的資源比如使用了數據庫那麼應該關閉這個連接

  */ public void release() {} public Tag getParent(){ return parent} xxxtld <?xml version= encoding=ISO ?> <taglib xmlns= xmlnsxsi=instance xsischemaLocation= webjsptaglibrary__xsd version=> <tag> <description>Extends TagSupport</description> <name>hello</name> <tagclass>comtagHelloWorldTag</tagclass> <bodycontent>jsp</bodycontent> </tag> </taglib> webxml <webapp> <tagliburi>/xxx</tagliburi> <tagliblocation>/WEBINF/tlds/xxxtld</tagliblocation> </webapp> xxxjsp <%@ taglib uri=/xxx prefix=mytag %> <%@ page contentType=text/html charset=gb %> <html><head><title>first cumstomed tag</title></head><body> <p>以下的內容從Taglib中顯示 </p> <p><i><mytaghello_int/></i> <br> <p><mytaghello_int></mytaghello_int> </body></html> JSP中的表達式語言(EL表達式)

  EL語法EL的語法很簡單他最大的特點就是使用上很方便例${sessionScopeusersex}所有EL都是以 ${ 為起始以} 為結尾的

  上述EL范例的意思是從Session取得用戶的性別如果使用之前JSP代碼的寫法如下<% User user = (User)sessiongetAttribute(userString sex = usergetSex( )%>兩者相比較之下可以發現EL的語法比傳統JSP代碼更為方便簡潔

  EL提供 和 [ ] 兩種運算符來存取數據[ ]可以訪問集合或者是數組的元素Bean的屬性下列兩者所代表的意思是一樣的但是需要保證要取得對象的那個的屬性有相應的setXxx()和getXxx()方法才行

  例${sessionScopeusersex}等於${sessionScopeuser[sex]} 和 [ ] 也可以同時混合使用如下${sessionScopeshoppingCart[]price}返回結果為shoppingCart中第一項物品的價格

  在EL中字符串既可以使用abc可以使用abc EL運算符EL的算術運算符和Java中的運算符的大致相同優先級也相同

  注意+ 運算符不會連接字符串了他只用於加法運算

  EL關系運算符有以下六個運算符關系運算符      說 明                范 例             結果= = 或 eq   |    等於   |${ = = } 或 ${ eq } | true!= 或 ne    |   不等於  |${ != } 或 ${ ne }  | false < 或 lt     |   小於    |${ < }或 ${ lt }    | true

  > 或 gt     |   大於    |${ > }或 ${ gt }    | false

  <= 或 le    |  小於等於 |${ <= }或 ${ le }   | true

  >= 或 ge    |  大於等於 |${ >= }或 ${ ge }   | false

  empty運算符Empty運算符主要用來判斷值是否為null或空的例如${ empty paramname }接下來說明Empty運算符的規則{empty} A如果A為null時返回true如果A不存在時返回true如果A為空字符串時返回true如果A為空數組時返回true如果A為空的Map時返回true如果A為空的Collection時返回true否則返回false注意在使用EL關系運算符時不能夠寫成${parampassword} = = ${parampassword}或者${ ${parampassword } = = ${ parampassword } }而應寫成${ parampassword = = parampassword }使用EL從表單中取得數據與輸入有關的隱含對象有兩個param和paramValues它們是EL中比較特別的隱含對象一般而言我們在取得用戶的請求參數時可以利用下列方法requestgetParameter(String name)

  requestgetParameterValues(String name)

  在EL中則可以使用param和paramValues兩者來取得數據

  ${paramname} ${paramValuesname}可以取得所有同名參數的值${paramValueshobbies[]}可以通過指定下標來訪問特定的參數的值這裡param的功能和requestgetParameter(String name)相同而paramValues和requestgetParameterValues(String name)相同如果用戶填了一個formform名稱有為username的文本框則我們就可以使用${paramusername}來取得用戶填入文本框的值

  EL函數EL中使用函數要寫一個要使用到方法的類然後在配置xxxtld文件然後在JSP中使用時和JSP的自定義標簽相似

  xxxtld中的配置<function> <name>reverse</name><!——函數名——> <functionclass>jspexampleselFunctions</functionclass><!——函數所在的類——> <functionsignature>javalangString reverse( javalangString )</functionsignature> <!——函數原型也就是函數的返回值類型函數名參數表注意一定要寫類型的全名——> </function>使用EL函數的寫法${snupper(abc)}注意在定義EL函數時都必須為公開靜態(public static)

  EL的隱含對象EL也可以使用內置對象中設置的屬性需要使用特定的EL內置對象屬性范圍     |    在EL中的對象Page         |     pageScope Request      |     requestScope Session      |     sessionScope Application  |     applicationScope EL中使用內置對象的屬性${requestScopeuser}等價於<%requestgetAttribute(user)%>如果不寫出特定的范圍 那就會在不同的范圍間進行搜索了例{user}(user是在request范圍 requestsetAttribute(useruser))

  也就等於${requestScopeuser} <%requestgetAttribute(user)%> EL的隱含對象對象                        類 型                  說 明PageContext      |  javaxservletServletContext |表示此JSP的PageContext

  

  PageScope        |         javautilMap         |取得Page范圍的屬性名稱所對應的值

  

  RequestScope     |         javautilMap         |取得Request范圍的屬性名稱所對應的值

  

  sessionScope     |         javautilMap         |取得Session范圍的屬性名稱所對應的值

  

  applicationScope |         javautilMap         |取得Application范圍的屬稱所對應的值

  

  param           |         javautilMap         |如同ServletRequestgetParameter(String                      |                               |name)返回String類型的值

  

  paramValues      |         javautilMap         |如同ServletRequestgetParameterValues                       |                               |(String name)返回String []類型的值

  

  header           |         javautilMap         |如同ServletRequestgetHeader(String name)            |                               |返回String類型的值

  

  headerValues     |         javautilMap         |如同ServletRequestgetHeaders(String name)                  |                               |返回String []類型的值

  

  cookie                |     javautilMap         |如同HttpServletRequestgetCookies( )

  

  initParam             |  javautilMap         |如同ServletContextgetInitParameter(String                |                               |name)返回String類型的值

  

  cookie對象所謂的cookie是一個小小的文本文件它是以keyvalue的方式將Session Tracking的內容記錄在這個文本文件內這個文本文件通常存在於浏覽器的暫存區內JSTL並沒有提供設定cookie的動作因為這個動作通常都是後端開發者必須去做的事情而不是交給前端的開發者如果我們在cookie中設定一個名稱為userCountry的值那麼可以使用${cookieuserCountry}來取得它

  header和headerValues(請求報頭對象)

  header儲存用戶浏覽器和服務端用來溝通的數據當用戶要求服務端的網頁時會送出一個記載要求信息的標頭文件例如用戶浏覽器的版本用戶計算機所設定的區域等其他相關數據如果要取得用戶浏覽器的版本即${header[UserAgent]}另外在很少機會下有可能同一標頭名稱擁有不同的值此時必須改為使用headerValues來取得這些值

  注意因為UserAgent中包含這個特殊字符所以必須使用[]而不能寫成${headerUserAgent}

  initParam就像其他屬性一樣我們可以自行設定web應用的環境參數(Context)當我們想取得這些參數時可以使用initParam隱含對象去取得它例如當我們在webxml中設定如下<?xml version= encoding=ISO?> <webapp xmlns= xmlnsxsi=instance xsischemaLocation=app__xsd version=> <contextparam> <paramname>userid</paramname> <paramvalue>mike</paramvalue> </contextparam> </webapp>那麼我們就可以直接使用 ${initParamuserid}來取得名稱為userid其值為mike的參數下面是之前的做法String userid = (String)applicationgetInitParameter(useridpageContext對象我們可以使用 ${pageContext}來取得其他有關用戶要求或頁面的詳細信息下面列出了幾個比較常用的部分

  Expression                                說 明${pageContextrequest}                  |取得請求對象${pageContextsession}                  |取得session對象${pageContextrequestqueryString}      |取得請求的參數字符串${pageContextrequestrequestURL}       |取得請求的URL但不包括請求之參數字符串${pagntextPath}      |服務的web application的名稱${pagthod}           |取得HTTP的方法(GETPOST)

  ${pageContextrequestprotocol}         |取得使用的協議(HTTP/HTTP/

  ${pageContextrequestremoteUser}       |取得用戶名稱${pageContextrequestremoteAddr }      |取得用戶的IP地址${pageContextsessionnew}              |判斷session是否為新的所謂新的session表示剛由                                                server產生而client尚未使用${pageContextsessionid}               |取得session的ID ${pageContextservletContextserverInfo}|取得主機端的服務信息JSTL(JSP標准標簽庫)

  JSTL由核心標簽<c…… > xml解析標簽 <x……>國際化標簽 <fmt……>數據庫訪問標簽<sql……>函數標簽<fn……>核心標簽Core <%@taglib prefix=c uri=%>屬性設置<cset> 設置屬性<cremove> 移除設置的屬性過程控制<cif test=……> 條件標簽 只有在test屬性的值為true是才會執行標簽體例<cif test=${!(empty userage)}> <h>hello</h> </cif> <cchoose>choose和when是組合在一起使用的有點類似於swith case的語法  <cwhen test=……>when也是條件判斷標簽test屬性的值為true是才會執行標簽體

  例<cchoose> <cwhen test=${paramage<}> <h>you is a child<h> </cwhen> <cwhen test=${paramage> and paramage< }> <h>you is a young person</h> </cwhen> <cwhen test=${paramage>}> <h>you is a old person</h> </cwhen> </cchoose> <cforEach>迭代標簽例<cforEach var=book item=${storebooks} varStatus=status> <h>${bookparice}</h> </cforEach> <cforEach begin= end= step=> <h>hello</h> </cforEach> <cforTokens>字符串迭代標簽<cimport>引入標簽<cimport url=引入內容的url var=別名> ${別名} <curl>url標簽<curl value=……> <cparam name=…… value=……/> </curl> <curl value=……>使用url標簽可以實現URL回寫<credirect uri=xxx/xxx/xxxxx/>國際化標簽<fmtlauguage> <fmtbundel>資源指定標簽<fmtmessage>消息標簽例<fmtsetLocale value=zh/> <fmtbundel basename=messageMessageResources> <fmtmessage>name</fmtmessage> </fmtbundel> xxxxproperties name=\\\


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27134.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.