<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JSTL詳解(九)

    9.9? 完整示例

    在這一小節中,將修改在第三章中曾經給出的 Struts 框架示例,以 Struts 框架和 JSTL 的協同工作來實現。

    對于第三章的示例,要將 JSTL 整合進去,需要做以下幾步工作。

    1 下載 JSTL 并配置。

    1 )修改原先的 web.xml 使其作為 Servlet2.4 的實現。

    3 )修改 JSP 顯示頁面,整合 JSTL Struts 標簽庫一起工作。

    9.9.1? 下載 JSTL 并配置

    可以從 http://java.sun.com/products/jsp/jstl 網址中下載 JSTL1.1 的最新版本。要使用這些標簽庫需要做 3 個步驟的工作。

    1 )將下載的 jstl.jar 放置到 Web 應用的 WEB-INF lib 目錄下。

    2 )將下載的 TLD 文件放置到 Web 應用的 WEB-INF 目錄下。

    3 )在需要使用的 JSP 頁面中聲明該標簽庫。

    9.9.2? 修改 web.xml 使其作為 Servlet2.4 的實現

    在第三章的示例中所給出的 web.xml Servlet2.3 規范的,因此無法很好的支持 JSTL1.1 ,要修改為符合 Servlet2.4 規范的代碼。使 web.xml 成為 Servlet2.4 規范是十分容易的,需要修改的是其頭部 DTD 聲明。

    Servlet2.3 之前,校驗和規范 web.xml 都是使用 DTD ,因此其頭部聲明如下:

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>

    </web-app>

    而到了 Servlet2.4 規范,首此使用了 xmlns 來聲明 web.xml ,因此其頭部聲明為:

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app version="2.4"

    ???????? xmlns="http://java.sun.com/xml/ns/j2ee"

    ???????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ???????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

    ???????? http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd ">

    </web-app>

    所以,為了支持 Servlet2.4 規范,應該將第三章示例的 web.xml 改成如例 9.6 的樣子。

    9.6 :修改后的 web.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app version="2.4"

    ???????? xmlns="http://java.sun.com/xml/ns/j2ee"

    ???????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ???????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

    ???????? http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    ?<filter>

    ????? <filter-name>Set Character Encoding</filter-name>

    ????? <filter-class>struts.sample.cap1.sample3.util.SetCharacterEncodingFilter</filter-class>

    ????? <init-param>

    ??????????????? <param-name>encoding</param-name>

    ??????????????? <param-value>UTF-8</param-value>

    ????? </init-param>

    ?</filter>

    ?<filter-mapping>

    ????? <filter-name>Set Character Encoding</filter-name>

    ????? <url-pattern>*.do</url-pattern>

    ?</filter-mapping>

    ?<servlet>

    ??? <servlet-name>action</servlet-name>

    ??? <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

    ??? <init-param>

    ????? <param-name>config</param-name>

    ????? <param-value>/WEB-INF/struts-config.xml</param-value>

    ??? </init-param>

    ??? <init-param>

    ????? <param-name>debug</param-name>

    ????? <param-value>2</param-value>

    ??? </init-param>

    ??? <load-on-startup>1</load-on-startup>

    ?</servlet>

    ?<servlet-mapping>

    ??? <servlet-name>action</servlet-name>

    ??? <url-pattern>*.do</url-pattern>

    ?</servlet-mapping>

    ?<welcome-file-list>

    ??? <welcome-file>setSolution.jsp</welcome-file>

    ?</welcome-file-list>

    ?<taglib>

    ??? <taglib-uri>/WEB-INF/struts-template.tld</taglib-uri>

    ??? <taglib-location>/WEB-INF/struts-template.tld</taglib-location>

    ?</taglib>

    ?<taglib>

    ??? <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>

    ??? <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>

    ?</taglib>

    ?<taglib>

    ??? <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>

    ??? <taglib-location>/WEB-INF/struts-html.tld</taglib-location>

    ?</taglib>

    ?<taglib>

    ??? <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>

    ??? <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>

    ?</taglib>

    ?<taglib>

    ??? <taglib-uri>/WEB-INF/struts-template.tld</taglib-uri>

    ??? <taglib-location>/WEB-INF/struts-template.tld</taglib-location>

    ?</taglib>

    ?<taglib>

    ??? <taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>

    ??? <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>

    ?</taglib>

    ?<taglib>

    ??? <taglib-uri>/WEB-INF/struts-nested.tld</taglib-uri>

    ??? <taglib-location>/WEB-INF/struts-nested.tld</taglib-location>

    ?</taglib>

    </web-app>

    修改的地方不多,僅僅是頭部的聲明。其他地方完全不必改動,這樣的 web.xml 已經支持了 Servlet2.4 規范了。

    9.9.3?JSP 部分: <logic:notEmpty> <c:if> 標簽

    對于 JSP 顯示頁面的修改是整合的核心部分,在第三章示例的 showAttackSolution.jsp 中出現了這樣的語句:

    <logic:notEmpty name="allAttackSolution">

    ...

    </logic:notEmpty>

    將類型為 ArrayList 的變量“ allAttackSolution ”從作用范圍中取出,利用 <logic:notEmpty> 標簽判斷該 ArrayList 是否為空。

    根據之前討論的“所有判斷標簽被 EL 表達式和 <c:if> 標簽替換”,可以利用 <c:if> 標簽和 EL 表達式來修改該段 JSP 代碼。

    修改后的結果如下:

    <c:if test="${(requestScope.allAttackSolution != null)

    && fn:length(requestScope.allAttackSolution) != 0}">

    ...

    </c:if>

    <logic:notEmpty> 標簽其本身具有多種功能:

    q???????? 一是判斷是否為 null 。

    q???????? 二是當它為 String 類型的變量時,判斷字符串長度是否為 0 。

    q???????? 三是當它為集合類型的變量時,利用集合類的 isEmpty 方法可以判斷是否是一個空的集合。

    本示例既然要在替換后與替換前的工作一致,就應該對集合做兩個判斷:

    q???????? 一是該集合不為 null 。

    q???????? 二是該集合中的對象數量不為 0

    !=null ”的 EL 表達式實現了集合實例不為 null 的判斷; fn:length() 函數實現了集合內對象數量不為 0 的判斷,兩個判斷用“ && ”連接起來就實現了 <logic:notEmpty> 標簽對于集合判斷的工作。

    在這里應該利用“ <logic:notEmpty> 標簽”,還是利用“ EL 表達式和 <c:if> 標簽”呢? <logic:notEmpty> 標簽相對來說可讀性更強些, EL 表達式作為判斷條件則可讀性稍差些。然而,這些僅是就本示例的改動而言的,其他情況下,利用 EL 表達式和 <c:if> 標簽還是有其優勢的。


    9.9.4?JSP 部分: <logic:iterate> <c:forEach> 標簽

    在第三章示例的 showAttackSolution.jsp 中出現了這樣的使用:

    <logic:iterate name="allAttackSolution"

    id="attackSolution"

    type="struts.sample.cap1.sample3.entity.AttackSolution">

    ???????? <tr>

    ?????????????????? <td style="word-break: break-all;">

    ??????????????????????????? <bean:write property="attack_event_code" name="attackSolution" />

    ?????????????????? </td>

    ?????????????????? <td style="word-break: break-all;">

    ??????????????????????????? <bean:write property="attack_mean" name="attackSolution" />

    ?????????????????? </td>

    ?????????????????? <td style="word-break: break-all;">

    ??????????????????????????? <bean:write property="attack_action" name="attackSolution" />

    ?????????????????? </td>

    ?????????????????? <td style="word-break: break-all;">

    ??????????????????????????? <input type="button"

    ??????????????????? onclick="del('<%=attackSolution.getAttack_event_code()%>');"

    value="<bean:message key="message.delete"/>">

    ?????????????????? </td>

    ???????? </tr>

    </logic:iterate>

    由于在 Action 中將顯示的內容作為 ArrayList 類型的實例保存在 request 中,因此這段 JSP 頁面標簽的工作是:

    1 )利用 <logic:iterate> 標簽對保存在 ArrayList 實例中的所有對象進行循環取得。

    2 ArrayList 類型實例中的對象為 struts.sample.cap1.sample3.entity.AttackSolution 類型, AttackSolution Java 類中的變量屬性都有 get 、 set 方法,因此可以被認為是一個標準的 JavaBean 。利用 <bean:write> 標簽將 AttackSolution 實例的變量屬性讀取出來,并顯示。

    根據之前討論的“ <logic:iterate> 標簽被 <c:forEach> 標簽和 EL 表達式替換”,可以利用 <c:forEach> 標簽和 EL 表達式來修改該段 JSP 代碼。修改的方式有兩種:

    q???????? 完全使用 <c:forEach> 標簽和 EL 表達式來替換全部。

    q???????? 僅使用 EL 表達式來替換 <bean:write> 標簽。

    1. <c:forEach> 標簽和 EL 表達式

    <c:forEach> 標簽和 EL 表達式:

    <c:forEach items="${requestScope.allAttackSolution}"

    var="attackSolution">

    ???????? <tr>

    ???????? ???????? <td style="word-break: break-all;" >

    ??????????????????????????? ${attackSolution.attack_event_code}

    ?????????????????? </td>

    ?????????????????? <td style="word-break: break-all;" >

    ??????????????????????????? ${attackSolution.attack_mean}

    ?????????????????? </td>

    ?????????????????? <td style="word-break: break-all;" >

    ?????????????????? ???????? ${attackSolution.attack_action}

    ?????????????????? </td>

    ?????????????????? <td style="word-break: break-all;" >

    <input type="button"

    onclick="del('${attackSolution.attack_event_code}');"

    value="<bean:message key="message.delete"/>">

    </td>

    ???????? </tr>

    </c:forEach>

    這種修改方式將屏棄 Struts 框架的 <logic:iterate> 標簽,而以 <c:forEach> 標簽來作為循環迭代的工作。它的最大優點是無需關注集合中的對象類型,只要保證該對象是一個標準的 JavaBean 就可以了。

    2. 使用 EL 表達式來替換 <bean:write> 標簽

    <logic:iterate name="allAttackSolution"

    id="attackSolution"

    type="struts.sample.cap1.sample3.entity.AttackSolution">

    ???????? <tr>

    ?????????????????? <td style="word-break: break-all;" >

    ?????????????????? ??? ${attackSolution.attack_event_code}

    ?????????????????? </td>

    ?????????????????? <td style="word-break: break-all;" >

    ?????????????????? ??? ${attackSolution.attack_mean}

    ?????????????????? </td>

    ?????????????????? <td style="word-break: break-all;" >

    ?????????????????? ??? ${attackSolution.attack_action}

    ?????????????????? </td>

    ?????????????????? <td style="word-break: break-all;" >

    <input type="button"

    onclick="del('${attackSolution.attack_event_code}');"

    value="<bean:message key="message.delete"/>">

    </td>

    ???????? </tr>

    </logic:iterate>

    這種方式對原來的代碼沒有做多大的改動,依然會使用 <logic:iterate> 標簽來作為循環標簽。不過對于原來使用 <bean:write> 標簽做顯示功能的地方,摒棄了 <bean:write> 標簽而直接使用 EL 表達式。靈活的 EL 表達式對頁面顯示邏輯有很大幫助,這種方式比較適合熟悉 <logic:iterate> 標簽的程序設計者。

    9.9.5? 完整的 JSP

    下面看一個完整的修改后 JSP 頁面的代碼,注釋掉的是被替換之前的代碼,讀者可以比較一下兩種實現方法。請見例 9.7

    9.7 :修改后 showAttackSolution.jsp 。

    <%@ page contentType="text/html; charset=utf-8"%>

    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

    <html>

    ?<head>

    ??? <!-- 略過 JavaScript 部分 -->

    ...

    ?</head>

    ?<body>

    ?? <em><bean:message key="message.attacksolutionDB"/></em><p>

    ?? <table>

    ??????? <html:errors/>

    ??? </table>

    <bean:message key="message.attackcode"/>:

    <input name="attack_event_codeC" value="" type="text">&nbsp;

    <bean:message key="message.attackdesc"/>:

    <TEXTAREA style="height:100" name=attack_meanC></TEXTAREA>&nbsp;

    <bean:message key="message.attacksolution"/>:

    <TEXTAREA style="height:100" name=attack_actionC></TEXTAREA>&nbsp;

    ??? <p/>

    ??? <html:form action="AddAttackSolutionAction.do">

    ??????? <html:hidden property="attack_event_code"/>

    ??????? <html:hidden property="attack_mean"/>

    ??????? <html:hidden property="attack_action"/>

    ??????? <input type="button" onclick="add();" value="<bean:message key="message.add"/>">

    ??????? <input type="button"?

    onclick="search();"

    value="<bean:message key="message.search"/>">

    ??? </html:form>

    ??? <table border=1 cellspacing=1 cellpadding=2>

    ??????? <tr>

    ??????????? <td style="background-color: #808080;font-size: 12pt;color: #ffffff;font-weight:

    ?bold;line-height: 15pt;border: 1px solid #808080;">

    ??????????????? <bean:message key="message.attackcode"/>

    ??????????? </td>

    ??????????? <td style="background-color: #808080;font-size: 12pt;color: #ffffff;font-weight:

    ?bold;line-height: 15pt;border: 1px solid #808080;">

    ??????????????? <bean:message key="message.attackdesc"/>

    ??????????? </td>

    ??????????? <td style="background-color: #808080;font-size: 12pt;color: #ffffff;font-weight:

    ?bold;line-height: 15pt;border: 1px solid #808080;">

    ??????????????? <bean:message key="message.attacksolution"/>

    ??????????? </td>

    ??????????? <td style="background-color: #808080;font-size: 12pt;color: #ffffff;font-weight:

    ?bold;line-height: 15pt;border: 1px solid #808080;">

    ??????????????? <bean:message key="message.delete"/>

    ??????????? </td>

    ??????? </tr>

    ??????? <!-- 沒有替換前的代碼 -->

    ??????? <!--

    ??????????? <logic:notEmpty name="allAttackSolution">

    ??????????????? <logic:iterate name="allAttackSolution"

    id="attackSolution"

    type="struts.sample.cap1.sample3.entity.AttackSolution">

    ??????????????????? <tr>

    ??????????????????????? <td style="word-break: break-all;" >

    ??????????????????????????? <bean:write property="attack_event_code"

    name="attackSolution"/>

    ??????????????????????? </td>

    ??????????????????????? <td style="word-break: break-all;" >

    ??????????????????????????? <bean:write property="attack_mean" name="attackSolution"/>

    ??????????????????????? </td>

    ??????????????????????? <td style="word-break: break-all;" >

    ??????????????????????????? <bean:write property="attack_action" name="attackSolution"/>

    ??????????????????????? </td>

    ??????????????????????? <td style="word-break: break-all;" >

    ??????????????????????????? <input type="button"

    onclick="del('

    <bean:write

    property="attack_event_code"

    name="attackSolution"/>');"

    value="<bean:message key="message.delete"/>">

    ??????????????????????? </td>

    ??????????????????? </tr>

    ??????????????? </logic:iterate>

    ??????????? </logic:notEmpty>

    ??????? -->

    ?? ?????

    ??????? <!-- 僅替換 <bean:write> 標簽的代碼 -->

    ??????? <!--

    ??????????? <logic:notEmpty name="allAttackSolution">

    ??????????????? <logic:iterate name="allAttackSolution"

    id="attackSolution"

    type="struts.sample.cap1.sample3.entity.AttackSolution">

    ????????? ??????????<tr>

    ??????????????????????? <td style="word-break: break-all;" >

    ??????????????????????????? ${attackSolution.attack_event_code}

    ??????????????????????? </td>

    ??????????????????????? <td style="word-break: break-all;" >

    ???????????????????????? ???${attackSolution.attack_mean}

    ??????????????????????? </td>

    ??????????????????????? <td style="word-break: break-all;" >

    ??????????????????????????? ${attackSolution.attack_action}

    ??????????????????????? </td>

    ??????????????????????? <td style="word-break: break-all;" >

    ??????????????????????????? <input type="button"

    onclick="del('${attackSolution.attack_event_code}');"

    value="<bean:message key="message.delete"/>">

    ??????????????????????? </td>

    ??????????????????? </tr>

    ??????????????? </logic:iterate>

    ??????????? </logic:notEmpty>

    ??????? -->

    ???????

    ??????? <!-- 替換后的實現代碼 -->??????

    ??????? <c:if test="${(requestScope.allAttackSolution != null)

    && fn:length(requestScope.allAttackSolution) != 0}">

    ??????????? <c:forEach items="${requestScope.allAttackSolution}" var="attackSolution">

    ??????????????? <tr>

    ??????????????????? <td style="word-break: break-all;" >

    ??????????????????????? ${attackSolution.attack_event_code}

    ??????????????????? </td>

    ??????????????????? <td style="word-break: break-all;" >

    ??????????????????????? ${attackSolution.attack_mean}

    ??????????????????? </td>

    ??????????????????? <td style="word-break: break-all;" >

    ??????????????????????? ${attackSolution.attack_action}

    ??????????????????? </td>

    ??????????????????? <td style="word-break: break-all;" >

    ??????????????????????? <input type="button"

    ????????????????????????????? onclick="del('${attackSolution.attack_event_code}');"

    value="<bean:message key="message.delete"/>">

    ??????????????????? </td>

    ??????????????? </tr>

    ??????????? </c:forEach>

    ??????? </c:if>

    ??? </table>

    ?</body>

    </html>

    可以看到,在這個被修改的 JSP 頁面代碼中,利用了 Struts 框架提供的標簽來實現提交部分的工作以及國際化資源配置文件讀取顯示的工作,也利用 JSTL 的標簽庫和 EL 表達式來實現頁面邏輯部分的工作。

    JSP 頁面使用 JSTL 是一種規范,也是一件令人興奮的事情,因為它使 JSP 部分的程序設計變得更加有效合理。



    posted on 2007-01-18 15:22 nbt 閱讀(3741) 評論(1)  編輯  收藏 所屬分類: Servele&JSP和js

    評論

    # re: JSTL詳解(九) 2007-06-26 17:51 gostseraph

    拷貝你的WEB.XML 有錯誤
    <taglib> 錯誤

    QQ122767028
    XCH-521@163.COM
    等你解決
      回復  更多評論   

    <2007年1月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導航

    統計

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    Java技術網站

    友情鏈接

    國內一些開源網站

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一级a性色生活片久久无少妇一级婬片免费放 | 免费大片av手机看片| 国产成人A在线观看视频免费| 亚洲卡一卡2卡三卡4卡无卡三| 中国一级特黄的片子免费 | 免费人妻无码不卡中文字幕系| 亚洲成AV人在线观看天堂无码| a毛看片免费观看视频| 亚洲毛片αv无线播放一区| 国产免费内射又粗又爽密桃视频| 久久精品国产精品亚洲| 久久一区二区三区免费| 亚洲国产精品无码AAA片| 亚洲欧洲免费视频| 亚洲综合无码一区二区三区| 久草视频在线免费| 亚洲码和欧洲码一码二码三码| 国产人成免费视频| 久久国产福利免费| 亚洲精品日韩专区silk| 蜜桃视频在线观看免费网址入口| 亚洲av无码成人精品区一本二本| 免费大黄网站在线看| 中国人免费观看高清在线观看二区| 亚洲国产女人aaa毛片在线| 成年黄网站色大免费全看| 精品亚洲成A人在线观看青青| 亚洲中文字幕视频国产| 91在线免费视频| 亚洲免费观看网站| 国产一级高清免费观看| 在线观看片免费人成视频播放| 亚洲国产模特在线播放| 日韩精品免费一区二区三区| 免费无码又爽又刺激一高潮| 亚洲jjzzjjzz在线观看| 亚洲av再在线观看 | 最近中文字幕免费mv视频7| 三级片免费观看久久| 亚洲伊人tv综合网色| 国产伦一区二区三区免费|