1. 程式人生 > >JSP三大指令,九大內建物件,JSP動作標籤,EL表示式與函式庫

JSP三大指令,九大內建物件,JSP動作標籤,EL表示式與函式庫

JSP三大指令
----------------------------------------------
  一個jsp頁面中,可以有0~N個指令的定義!

1. page --> 最複雜:格式:<%@page language="java" info="xxx"...%>
  * pageEncoding和contentType:
    > pageEncoding:它指定當前jsp頁面的編碼,只要不說謊,就不會有亂碼!在伺服器要把jsp編譯成.java時需要使用pageEncoding!
    > contentType:它表示新增一個響應頭:Content-Type!等同於response.setContentType("text/html;charset=utf-8");
    > 如果兩個屬性只提供一個,那麼另一個的預設值為設定的那一個。
    > 如果兩個屬性都沒有設定,那麼預設為iso
  * import:導包!可以出現多次
  * errorPage和isErrorPage
    > errorPage:當前頁面如果丟擲異常,那麼要轉發到哪一個頁面,由errorPage來指定
    > isErrorPage:它指定當前頁面是否為處理錯誤的頁面!當該屬性為true時,這個頁面會設定狀態碼為500!而且這個頁面可以使用9大內建物件中的exception!

  *  在web.xml中配置錯誤頁面
             <error-page>
      <error-code>404</error-code>
      <location>/error/errorPage.jsp</location>
      </error-page>
      <error-page>
        <error-code>500</error-code>
        <location>/error/errorPage.jsp</location>
      </error-page>
      <error-page>
        <exception-type>java.lang.RuntimeException</exception-type>
        <location>/index.jsp</location>
      </error-page>
   * autoFlush和buffer
     > autoFlush:指定jsp的輸出流緩衝區滿時,是否自動重新整理!預設為true,如果為false,那麼在緩衝區滿時丟擲異常!
     > buffer:指定緩衝區大小,預設為8kb,通常不需要修改!
   * isELIgnored:是否忽略el表示式,預設值為false,不忽略,即支援!
   * 基本沒用:
     > language:指定當前jsp編譯後的語言型別,預設值為java。
     > info:資訊!
     > isThreadSafe:當前的jsp是否支援併發訪問!
     > session:當前頁面是否支援session,如果為false,那麼當前頁面就沒有session這個內建物件!
     > extends:讓jsp生成的servlet去繼承該屬性指定的類!

2. include --> 靜態包含
  * 與RequestDispatcher的include()方法的功能相似!
  * <%@include%> 它是在jsp編譯成java檔案時完成的!他們共同生成一個java(就是一個servlet)檔案,然後再生成一個class!
  * RequestDispatcher的include()是一個方法,包含和被包含的是兩個servlet,即兩個.class!他們只是把響應的內容在執行時合併了!
  * 作用:把頁面分解了,使用包含的方式組合在一起,這樣一個頁面中不變的部分,就是一個獨立jsp,而我們只需要處理變化的頁面。實現頁面的重用
*唯一屬性 file  

3. taglib --> 匯入標籤庫
  * 兩個屬性:
    > prefix:指定標籤庫在本頁面中的字首!由我們自己來起名稱!
    > uri: 指定標籤庫的位置!
    > <%@taglib prefix="s" uri="/struts-tags"%>
    字首的用法:<s:text>

==========================================================

九個內建物件
--------------------------------------------
* out --> jsp的輸出流,等同於response.getWriter()用來向客戶端響應
* page --> 當前jsp物件! 它的引用型別是Object,即真身中有如下程式碼:Object page = this;
* config --> 它對應真身中的ServletConfig物件!
* pageContext --> 一個頂9個!
* request --> HttpServletEequest
* response --> HttpServletResponse
* exception --> Throwable只有在錯誤頁面中可以使用這個物件
* session --> HttpSession,不是每個JSP頁面都可以使用
* application --> ServletContext

1. pageContext
  * 一個頂9個!
  * Servlet中有三大域,而JSP中有四大域,它就是最後一個域物件!
    > ServletContext:整個應用程式
    > session:整個會話(一個會話中只有一個使用者)
    > request:一個請求鏈!
    > pageContext:一個jsp頁面!這個域是在當前jsp頁面和當前jsp頁面中使用的標籤之間共享資料!
      > 域物件
      > 代理其他域:pageContext.setAttribute("xxx", "XXX",                       PageContext.SESSION_SCOPE);
      >***** 全域查詢:pageContext.findAttribute("xxx");從小到大,依賴查詢!(查詢範圍是JSP四個域)
      > 獲取其他8個內建物件:通過getXxx()方法
注意:九大內建物件中只有exception和session物件可以指定是否可用


JSP動作標籤(20個)
--------------------------------------------
  這些jsp的動作標籤,與html提供的標籤有本質的區別。
  * 動作標籤是由tomcat(伺服器)來解釋執行!它與java程式碼一樣,都是在伺服器端執行的!
  * html由瀏覽器來執行!
    * <jsp:forward>:轉發!它與RequestDispatcher的forward方法是一樣的,一個是在Servlet中使用,一個是在jsp中使用!
    * <jsp:include>:包含:它與RequestDispatcher的include方法是一樣的,一個是在Servlet中使用,一個是在jsp中使用!
      > <%@include>和<jsp:include>有什麼不同!
    * <jsp:param>:它用來作為forward和include的子標籤!用來給轉發或包含的頁面傳遞引數!


JavaBean
--------------------------------------------
javaBean的規範:
  1. 必須要有一個預設構造器!(即無參的)
  2. 提供get/set方法,如果只有get方法也可以,那麼這個屬性是隻讀屬性!
  3. 屬性:有get/set方法的成員稱之為屬性;還可以沒有成員,只有get/set方法。屬性名稱由get/set方法來決定!而不是成員名稱!
  4. 方法名稱滿足一定的規範,那麼它就是屬性!
    boolean型別的屬性,它的讀方法可以是is開頭,也可以是get開頭!


內省:
  內省類(Introspector) --> Bean資訊(BeanInfo) --> 屬性描述符(PropertyDescriptor) --> 屬性的get/set對應的Method! --- > 可以反射了!

-----------------------

commons-beanutils,它是依賴內省完成!
  * 導包:
    > commons-beanutils.jar
    > commons-logging.jar

BeanUtils.getProperty(Object bean, String propertyName)
BeanUtils.setProperty(Object bean, String propertyName, String propertyValue)
BeanUtils.populate(Map map, Object bean)

CommontUtils.toBean(Map map, Class class)

-----------------------

jsp中與javaBean相關的動作 標籤!

* <jsp:useBean> --> 查詢或建立bean
  * <jsp:useBean id="user1" class="cn.itcast.domain.User" scope="session"/> 在session域中查詢名為user1的bean,如果不存在,建立之
* <jsp:setProperty>
  * <jsp:setProperty property="username" name="user1" value="admin"/> 設定名為user1的這個javabean的username屬性值為admin
* <jsp:getProperty>
  * <jsp:getProperty property="username" name="user1"/> 獲取名為user1的javabean的名為username的 屬性值

===========================================
EL表示式
--------------------------------------------
1. EL是JSP內建的表示式語言!
  * jsp2.0開始,不讓再使用java指令碼,而是使用el表示式和動態標籤來替代java指令碼!
  * EL替代的是<%= ... %>,也就是說,EL只能做輸出!

2. EL表示式來讀取四大域
  * ${xxx},全域查詢名為xxx的屬性,如果不存在,輸出空字串,而不是null。
  * ${pageScope.xxx}、${requestScope.xxx}、${sessionScope.xxx}、${applicationScope.xxx},指定域獲取屬性!

3. javaBean導航
  <%
    Address address = new Address();
    address.setCity("北京");
    address.setStreet("西三旗");
    
    Employee emp = new Employee();
    emp.setName("李小四");
    emp.setSalary(123456);
    emp.setAddress(address);
    
    request.setAttribute("emp", emp);
  %>

<h3>使用el獲取request域的emp</h3>
${requestScope.emp.address.street }<!-- request.getAttribute("emp").getAddress().getStreet() --><br/>


4. EL可以輸出的東西都在11個內建物件中!11個內建物件,其中10個是Map!pageContext不是map,它就是PageContext型別,1個頂9個。
    * 我們已經學習了四個:  pageScope,requestScope,sessionScope,applicationScope。
  * param:對應引數,它是一個Map,其中key引數名,value是引數值,適用於單值的引數。
  * paramValues:對應引數,它是一個Map,其中key引數名,value是多個引數值,適用於多值的引數。
  * header:對應請求頭,它是一個Map,其中key表示頭名稱,value是單個頭值,適用於單值請求頭
  * headerValues:對應請求頭,它是一個Map,其中key表示頭名稱,value是多個頭值,適用於多值請求頭
  * initParam:獲取<context-param>內的引數!
    <context-param>
      <param-name>xxx</param-name>
      <param-value>XXX</param-value>
  </context-param>
  <context-param>
      <param-name>yyy</param-name>
      <param-value>YYY</param-value>
  </context-param>

    ${initParam.xxx}

  * cookie:Map<String,Cookie>型別,其中key是cookie的name,value是cookie物件。 ${cookie.username.value}  例:獲取sessionID,${cookie.JSESSIONID.value}
  * pageContext:它是PageContext型別!${pageContext.request.contextPath}
注意:map.key 這是el的語法,map['key']也可以操作map,也是el語法

=========================================

EL函式庫(由JSTL提供的)
--------------------------------------------
  * 匯入標籤庫:<%@ tablib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
    String toUpperCase(String input):把引數轉換成大寫
    String toLowerCase(String input):把引數轉換成小寫
    int indexOf(String input, String substring):從大串,輸出小串的位置!
    boolean contains(String input, String substring):檢視大串中是否包含小串
    boolean containsIgnoreCase(String input, String substring):忽略大小寫的,是否包含
    boolean startsWith(String input, String substring):是否以小串為字首
    boolean endsWith(String input, String substring):是否以小串為字尾
    String substring(String input, int beginIndex, int endIndex):擷取子串
    String substringAfter(String input, String substring):獲取大串中,小串所在位置後面的字串
    substringBefore(String input, String substring):獲取大串中,小串所在位置前面的字串
    String escapeXml(String input):把input中“<”、">"、"&"、"'"、""",進行轉義
    String trim(String input):去除前後空格
    String replace(String input, String substringBefore, String substringAfter):替換
    String[] split(String input, String delimiters):分割字串,得到字串陣列
    int length(Object obj):可以獲取字串、陣列、各種集合的長度!
    String join(String array[], String separator):聯合字串陣列!

=========================================

自定義函式庫
--------------------------------------------
 * 寫一個java類,類中可以定義0~N個方法,但必須是static,而且有返回值的!
 * 在WEB-INF目錄下建立一個tld檔案
   <function>
    <name>fun</name>
    <function-class>cn.itcast.fn.MyFunction</function-class>
    <function-signature>java.lang.String fun()</function-signature>
  </function>

 * 在jsp頁面中匯入標籤庫
   <%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast.tld" %>
 * 在jsp頁面中使用自定義的函式:${it:fun() }