Job-day13 jstl俭茧、el、自定義EL函數(shù)漓帚、自定義標(biāo)簽母债、mvc思想及開發(fā)流程

1、JSTL標(biāo)簽庫概述

  • JSP標(biāo)準(zhǔn)標(biāo)簽庫尝抖。
    * 作用:和EL表達(dá)式一起 取代<% %>
    * 版本:1.0 1.1和1.2(區(qū)別不大)
    * 【1.0EL表達(dá)式?jīng)]有納入規(guī)范】
    * 1.1和1.2EL表達(dá)式納入規(guī)范

      * 下載jar包毡们,導(dǎo)入到工程中
          jstl.jar
          standard.jar
          
      * 標(biāo)簽庫
          c.tld       核心的標(biāo)簽庫
          fn.tld      EL表達(dá)式標(biāo)簽庫
    
  • JSTL的快速入門
    * 導(dǎo)入相應(yīng)jar包。
    * 新建JSP的文件昧辽,引入標(biāo)簽庫
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    * 直接使用標(biāo)簽庫

2衙熔、 JSTL的標(biāo)簽---輸出的內(nèi)容都是已經(jīng)存在于某個域中的。

  • <c:out> 輸出內(nèi)容
    value :輸出的內(nèi)容(常量或者變量)
    default :默認(rèn)值
    escapeXml:默認(rèn)是true奴迅,進(jìn)行轉(zhuǎn)義青责,設(shè)置成false,不轉(zhuǎn)義取具。

          代碼:
              <c:out value="Hello"></c:out>
              <c:out value="${name }"></c:out>
              <!-- "" -->
              <c:out value="${ city }" default="北京"></c:out>
              <c:out value="<a href='#'>超鏈接</a>" escapeXml="false"/>--此時就可正常顯示為一個超鏈接脖隶,而非字符串。
    
  • <c:set>
    * 屬性
    var :定義屬性
    value :存入的值
    scope :域范圍

              target  :修改JavaBean對象
              property:修改的屬性
              
          * 向4個web域?qū)ο蟠嫒胫?          <c:set var="i" value="10" scope="request" ></c:set>
              
          * 修改JavaBean對象屬性的值  
              <c:set target="${ user }" property="username"  value="小鳳"></c:set>
    
  • <c:remove>
    * 屬性
    var :刪除的屬性
    scope :在域的范圍

          * 代碼
              <c:set var="name" value="小鳳" scope="page"></c:set>
              ${ name }
    
              <c:remove var="name" scope="page"/>
              ${name }
    
  • <c:catch>
    * 屬性:var 把異常的信息保存變量中
    * 代碼
    <c:catch var="e">
    <%
    int a = 10/0;
    %>
    </c:catch>
    ${ e.message }

  • <c:if> 沒有<c:else>標(biāo)簽
    * 屬性
    * test 判斷的條件
    * var 計算的結(jié)果保存到變量中
    * scope 域的范圍

          * 代碼
              <c:set var="i" value="10" scope="page"></c:set>
              <c:if test="${ i ge 10 }" var="x" scope="page">
                  i >= 10
              </c:if>
              <c:if test="${ i lt 10 }">
                  i < 10
              </c:if>
              ${ x }
    
  • <c:choose>標(biāo)簽暇检,必須和以下標(biāo)簽同時用产阱。如果當(dāng)。块仆。构蹬。時,否則當(dāng)悔据。庄敛。時。
    <c:when>
    <c:otherwise>

          代碼:
              <c:set var="i" value="10" scope="page"></c:set>
              <c:choose>
                  <c:when test="${ i ge 10 }">
                      i >= 10
                  </c:when>
                  <c:when test="${ i lt 10 }">
                      i < 10
                  </c:when>
                  <c:otherwise>
                      其他
                  </c:otherwise>
              </c:choose>
    
  • <c:forEach>(*****)
    * 循環(huán)遍歷數(shù)據(jù)(數(shù)組科汗,集合藻烤,Map集合)
    * 屬性
    var :遍歷數(shù)據(jù)的類型
    items :要遍歷的內(nèi)容

              begin   :從哪開始
              end     :到哪結(jié)束
              step    :步長
              
              varStatus:記錄循環(huán)遍歷的信息
                  * index
                  * count(常用)
                  * first
                  * last
                  
          * 代碼
              <%
                  String [] arrs = {"美美","小鳳","芙蓉","小蒼"};
                  request.setAttribute("arrs", arrs);
              %>
              <!-- for(String s : arrs){ }  -->
              <c:forEach var="s" items="${ arrs }">
                  ${ s }
              </c:forEach>
    
              <h4>遍歷集合</h4>
              <%
                  List<String> list = new ArrayList<String>();
                  list.add("美美");
                  list.add("小鳳");
                  list.add("芙蓉");
                  list.add("小澤");
                  request.setAttribute("list", list);
              %>
              <c:forEach var="s" items="${ list }">
                  ${ s }
              </c:forEach>
    
              <h4>遍歷Map集合</h4>
              <%
                  Map<String,String> map = new HashMap<String,String>();
                  map.put("aa", "美美");
                  map.put("bb", "小鳳");
                  map.put("cc", "芙蓉");
                  request.setAttribute("map", map);
              %>
              <c:forEach var="entry" items="${ map }">--entry可以隨意寫。
                  ${ entry.key } -- ${ entry.value }
              </c:forEach>
              
              <h4>遍歷對象的集合</h4>
              <%
                  List<User> uList = new ArrayList<User>();
                  uList.add(new User("美美","123"));
                  uList.add(new User("小風(fēng)","234"));
                  uList.add(new User("芙蓉","345"));
                  request.setAttribute("uList", uList);
              %>
              <c:forEach var="user" items="${ uList }">
                  ${ user.username } -- ${ user.password }
              </c:forEach>
              
              
              <h4>迭代數(shù)據(jù)</h4>
              <h4>迭代從1到10</h4>
              <c:forEach var="i" begin="1" end="10" step="2">
                  ${ i }
              </c:forEach>
    
    
              <h4>計算從1加到100的和</h4>
              <c:set var="sum" value="0" scope="page"></c:set>
              <c:forEach var="i" begin="1" end="100" step="1">
                  <c:set var="sum" value="${ sum + i }"></c:set>
              </c:forEach>
              ${ sum }
              
              <h4>遍歷10到100的偶數(shù),每到第3個數(shù)怖亭,顯示紅色</h4>
              <c:forEach var="i" begin="10" end="100" step="2" varStatus="status">
                  <c:choose>
                      <c:when test="${ status.first }">
                          <font color="blue">${ i }</font>
                      </c:when>
                      <c:when test="${ status.count % 3 eq 0 }">
                          <font color="red">${ i }</font>
                      </c:when>
                      <c:otherwise>
                          ${ i }
                      </c:otherwise>
                  </c:choose>
              </c:forEach>
    
  • <c:param> 傳遞參數(shù)--與import涎显、redirect等結(jié)合使用,
    * 屬性
    name :參數(shù)名稱
    value :參數(shù)的值

  • <c:import> 包含頁面
    * url :引入頁面的地址
    * context :虛擬路徑
    * var :引入頁面保存到屬性中--指的是頁面中的內(nèi)容
    * scope :域的范圍

          * 代碼
              <c:import url="/jstl/choose.jsp" context="/day13" var="i" scope="page">
                  <c:param name="username" value="meimei"></c:param>
                  可在包含的choose頁面中接收該參數(shù)
              </c:import>
              ${ i }
    
  • <c:url>
    <c:url>標(biāo)簽用于在JSP頁面中構(gòu)造一個URL地址兴猩,其主要目的是實現(xiàn)URL重寫期吓。
    URL重寫就是將會話標(biāo)識號以參數(shù)形式附加在URL地址后面,如cookie被禁用時的追蹤技術(shù):
    http://localhost/day12/demo?jsessionid=xxxxxxxxxxxxxxxxxx;

          * 屬性
              * var       :聲明屬性
              * value     :地址
              * scope     :域范圍-可選
              * context   :虛擬路徑-可選
              
          * 代碼
              <c:url var="i" value="/jstl/choose.jsp" scope="request" context="/day13">
                  <c:param name="username" value="xiaofeng"></c:param>
              </c:url>
    
              <a href="${ i }">choose</a>
    
  • <c:redirect>重定向
    * 屬性
    * url :重定向的地址
    * context :虛擬路徑
    * 代碼
    <c:redirect url="/jstl/choose.jsp" context="/day13">
    <c:param name="username" value="furong"></c:param>
    </c:redirect>

  • <c:forTokens>分隔字符串(了解)
    <h4>分隔字符串</h4>
    <c:set var="i" value="aa,bb,cc" scope="page"></c:set>
    <c:forTokens items="${i }" delims="," var="x">
    ${ x }
    </c:forTokens>

3倾芝、* EL函數(shù)(操作字符串的)

  • 自定義EL函數(shù)(入門)
    * 編寫一個類讨勤,方法必須是【靜態(tài)】方法。
    * 在【W(wǎng)EB-INF目錄】下創(chuàng)建tld的文件晨另,配置悬襟。
    * 選擇2.0

      * 完成配置
          <!-- 配置自定義的EL函數(shù) -->
           <function>
              <!-- 配置方法名稱 -->
              <name>【sayHi】</name>
              <!-- 方法所在的類 -->
              <function-class>cn.itcast.el.ElDemo1</function-class>
              <!-- 配置方法的簽名 -->
              <function-signature>java.lang.String sayHello(java.lang.String)</function-signature> 即 返回值的類型 【方法名】(參數(shù)類型)
           </function>
    
  • 自定義標(biāo)簽
    * 實現(xiàn)SimpleTag接口
    * 編寫一個類,繼承SimpleTagSupport類拯刁。
    * 重寫5個方法
    * void setJspContext(JspContext pc)
    * void setParent(JspTag parent)
    * void setJspBody(JspFragment jspBody)
    * void doTag()

          * JspTag getParent() 
    
  • 快速入門的步驟(自定義沒有標(biāo)簽體的標(biāo)簽)
    * 編寫一個類,繼承SimpleTagSupport逝段。
    * 選擇重寫的方法垛玻,doTag()必須有的。
    * 需要配置

    <tag>

    <name>print</name>

    <tag-class>cn.itcast.tag.TagDemo1</tag-class>

    <body-content>empty</body-content>
    </tag>
    * 在JSP頁面上奶躯,引入標(biāo)簽庫
    <%@ taglib uri="http://www.itcast.cn/1110/myc" prefix="myc" %>
    * 使用標(biāo)簽了帚桩。

  • 帶有標(biāo)簽主體的標(biāo)簽
    * 編寫類,繼承SimpleTagSupport嘹黔。
    * 重寫doTag()
    * 獲取標(biāo)簽主體對象
    JspFragment jf = getJspBody();
    jf.invoke(null);
    * 配置

    <tag>

    <name>out</name>

    <tag-class>cn.itcast.tag.TagDemo2</tag-class>

    <body-content>scriptless</body-content>
    </tag>

              <body-content>元素的可選值有:
                  empty:不能有標(biāo)簽體內(nèi)容账嚎。
                  JSP:標(biāo)簽體內(nèi)容可以是任何東西:EL、JSTL儡蔓、<%=%>郭蕉、<%%>,以及html喂江;但不建議使用Java代碼段召锈,SimpleTag已經(jīng)不再支持使用<body-content>JSP</body-content>;
                  scriptless:標(biāo)簽體內(nèi)容不能是Java代碼段获询,但可以是EL涨岁、JSTL等;
                  tagdependent:標(biāo)簽體內(nèi)容不做運(yùn)算吉嚣,由標(biāo)簽處理類自行處理梢薪,無論標(biāo)簽體內(nèi)容是EL、JSP尝哆、JSTL秉撇,都不會做運(yùn)算。
    
  • 帶有屬性的標(biāo)簽
    * * 編寫類,繼承SimpleTagSupport畜疾。
    * 重寫doTag()
    * 編寫一個屬性赴邻,屬性必須和標(biāo)簽中的屬性是相同
    * 提供set方法
    * 獲取標(biāo)簽主體對象
    JspFragment jf = getJspBody();
    jf.invoke(null);
    * 配置

    <tag>

    <name>if</name>

    <tag-class>cn.itcast.tag.TagDemo3</tag-class>

    <body-content>scriptless</body-content>

    <attribute>

    <name>test</name>

    <required>true</required>

    <rtexprvalue>true</rtexprvalue>

    <type>boolean</type>
    </attribute>
    </tag>

  • JSP開發(fā)的模式(MVC),一種分層思想

  • 完成注冊的需求

      * 注冊表單(案例)
      * 數(shù)據(jù)庫(沒有)
          * 使用xml來代替啡捶。
          
      * 架構(gòu)
          Servlet + JSP + JavaBean
          
      * 技術(shù)
          * 解析XML使用DOM4J技術(shù)
          * Servlet技術(shù)
          * BeanUtils技術(shù)
          * JSTL+EL表達(dá)式
      
      * 創(chuàng)建新的項目
      * 導(dǎo)入jar包
      * 創(chuàng)建包結(jié)構(gòu)
      
      
      * 開發(fā)的步驟
          * 編寫注冊的頁面姥敛,
              用戶名,密碼瞎暑,確認(rèn)密碼彤敛,別名,郵箱了赌,驗證碼   
              
          * 先完成數(shù)據(jù)的校驗  onsubmit()
              * 都不能為空墨榄,密碼和確認(rèn)密碼一致
              * 郵箱格式正確(正則表達(dá)式)
              
          * 發(fā)送請求,請求Servlet勿她,接收數(shù)據(jù)袄秩,封裝,處理數(shù)據(jù)
              
          * 顯示到JSP上逢并。
    
  • 課程回顧:
    • 完成注冊和登陸的功能之剧。

    • 準(zhǔn)備的工作

      • 技術(shù)、開源jar包
    • 開發(fā)的功能使用MVC模式

    • C:控制層(接收請求和從客戶端發(fā)送過來的參數(shù))

      • 接收參數(shù)(request對象)
      • 為了操作方便(封裝數(shù)據(jù)砍聊,內(nèi)省背稼,BeanUtils開源的工具)
      • 自己new User(); user.setXXX數(shù)據(jù)
      • 完成業(yè)務(wù)邏輯的代碼(不推薦寫在Servlet) new UserService();
      • 接收結(jié)果,通過結(jié)果把顯示的數(shù)據(jù)發(fā)送給JSP玻蝌。(把結(jié)果存入域?qū)ο螅?/li>
    • M:模型層(JavaBean封裝數(shù)據(jù)蟹肘,其他JavaBean處理業(yè)務(wù))

      • 處理業(yè)務(wù)邏輯根據(jù)注冊的功能。(用戶名不能重名俯树,郵箱不能重名)
      • 需要把結(jié)果返回去帘腹。
    • V:視圖層(完成數(shù)據(jù)的顯示)

      • 到JSP的頁面,通過EL表達(dá)式取域的值许饿。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末竹椒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子米辐,更是在濱河造成了極大的恐慌胸完,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘贮,死亡現(xiàn)場離奇詭異赊窥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狸页,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門锨能,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扯再,“玉大人,你說我怎么就攤上這事址遇∠ㄗ瑁” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵倔约,是天一觀的道長秃殉。 經(jīng)常有香客問我,道長浸剩,這世上最難降的妖魔是什么钾军? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮绢要,結(jié)果婚禮上吏恭,老公的妹妹穿的比我還像新娘。我一直安慰自己重罪,他們只是感情好樱哼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剿配,像睡著了一般唇礁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惨篱,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音围俘,去河邊找鬼砸讳。 笑死,一個胖子當(dāng)著我的面吹牛界牡,可吹牛的內(nèi)容都是我干的簿寂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼宿亡,長吁一口氣:“原來是場噩夢啊……” “哼常遂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起挽荠,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤克胳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后圈匆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漠另,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年跃赚,在試婚紗的時候發(fā)現(xiàn)自己被綠了笆搓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖满败,靈堂內(nèi)的尸體忽然破棺而出肤频,到底是詐尸還是另有隱情,我是刑警寧澤算墨,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布宵荒,位于F島的核電站,受9級特大地震影響米同,放射性物質(zhì)發(fā)生泄漏骇扇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一面粮、第九天 我趴在偏房一處隱蔽的房頂上張望少孝。 院中可真熱鬧,春花似錦熬苍、人聲如沸稍走。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婿脸。三九已至,卻和暖如春柄驻,著一層夾襖步出監(jiān)牢的瞬間狐树,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工鸿脓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抑钟,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓野哭,卻偏偏與公主長得像在塔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拨黔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1什么是JSTLJSTL是apache對EL表達(dá)式的擴(kuò)展(也就是說JSTL依賴EL)蛔溃,JSTL是標(biāo)簽語言!JSTL...
    TY_閱讀 370評論 0 1
  • JSP 基本結(jié)構(gòu)JSP 頁面組成:模板文本(HTML,XML,純文本)篱蝇,JSP 元素贺待;JSP 元素:腳本元素,指令...
    jslancer閱讀 835評論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法零截,類相關(guān)的語法狠持,內(nèi)部類的語法,繼承相關(guān)的語法瞻润,異常的語法喘垂,線程的語...
    子非魚_t_閱讀 31,597評論 18 399
  • 一甜刻、JSP基礎(chǔ) 1.1什么是JSP JSP(Java ServerPage)是Java服務(wù)器端動態(tài)頁面技術(shù)。是su...
    晨星資源閱讀 1,139評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理正勒,服務(wù)發(fā)現(xiàn)得院,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139