<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 閱讀(3724) 評論(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技術網站

    友情鏈接

    國內一些開源網站

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成人福利免费视频| 亚洲 小说区 图片区 都市| 亚洲AV无码无限在线观看不卡| 精品国产免费观看| 老司机精品免费视频| 亚洲精品福利在线观看| 国产精品免费视频网站| 国产色爽免费无码视频| 亚洲国产人成在线观看| 久久久久一级精品亚洲国产成人综合AV区| 无码人妻一区二区三区免费看| 亚洲中文字幕无码久久| 亚洲精品国产精品乱码视色 | 久久久久久99av无码免费网站| 免费国产高清毛不卡片基地| 中文字幕亚洲色图| 全亚洲最新黄色特级网站 | 国产一级做a爱免费视频| 四虎国产精品永久免费网址| 婷婷亚洲综合五月天小说在线| 亚洲乱亚洲乱淫久久| 免费看国产一级片| 国产麻豆视频免费观看| XXX2高清在线观看免费视频| 亚洲精品无码久久久久A片苍井空| 亚洲AV中文无码乱人伦下载 | 337p日本欧洲亚洲大胆色噜噜| 亚洲国产精品一区二区三区久久| 国产精品视频免费| 最好免费观看高清在线 | 免费在线看黄的网站| 国产亚洲精品国产福利在线观看 | 韩国免费a级作爱片无码| 亚洲精品GV天堂无码男同| 亚洲黄网站wwwwww| 精品久久久久久亚洲| 亚洲av无码成人精品区| 国产精品久免费的黄网站 | 亚洲精品色婷婷在线影院| 国产精品色午夜视频免费看 | 色噜噜综合亚洲av中文无码|