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

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

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

    posts - 14,  comments - 37,  trackbacks - 0
    在JSP裏混用JSF元件與HTML/JavaScript,輸出到Client時會被分離之迷解答

    開發JSF頁面及元件這半年來,常遇到一個問題,
    在JSF的頁面裏,混著寫html/javascript文字及元件tag時,
    輸出結果在最後output到client端時有時會被分離成兩組輸出,
    而不是以我們在JSP看到的順序輸出。
    例如一:
    <ui:Panel id="panel">
        <div>
            <script>alert("A")</script>
            <ui:Button id="button"/>
        </div>
    </ui:Panel>
     
     
    期望在client端應該是,
    <div id="form1:panel>
        <div>
        <script>alert("A")</script>
        <input type="button" id="form1:button"/>
        </div>
    </div>
     
    但事實上會變成
     
    <div>
    <script>alert("A")</script>
    </div>
    <div id="form1:panel>
        <input type="button" id="form1:button"/>
    </div>
     
    這個列子在初步一看一定覺得不合理,
    而且在實際的開發上,一定會產生困優。
     
    但這件事經過最終看完source後,又覺得無可厚非
     
    會發生這件事情的主要元因是JSF的架構性的問題...
     
    當你使用的元件是一個Container時(例如Panel這類的元件)
    他可能會期望自己來排列兒子的順序(例如grid layout)
    而不是依tag寫的"單純"順序去輸出結果。
     
    這時候,這顆元件會(應該)去改寫getRenderChildren(),並retrun true,表示他要自己來render兒子.
    (以gridPanel來看,就必需在各個兒子間用tr/td來作排版)
    即表示,這時候利用的JSP裏tag的順序來out是不合用的,
    因為tag跟tag中間可能要有其parent的客制化輸出
     
    從JSF規格的source(UIComponentTag)來看
    當一個元件不用自己render兒子元件時,
    他的encodeStart會在doStartTag被呼叫
    他的encodeEnd會在doEndTag被呼叫
    他其兒子就理所當然的依JSP裏tag執行的順序被呼叫到,(而不呼叫該元件的encodeChildren)
    而穿插在tag中的純文字輸出就理所當然依順序被輸出
    例如JSP的JAVA Code:
        panel_tag.doStartTag()
        out.write("<div>")
        out.wirte("<script>alert(\"A\")</script>");
        button_tag.doStartTag();
        button_tag.doEndTag();
        out.write("</div>");
        panel_tag.doEndTag();
     
    可是當一顆元件需要自己render兒子元件時
    元件會設定了一個suppressed falg,(還有其他狀況的設suppressed,列如這個元件是在facet裏)
    則它的encodeStart,encodeChildren及encodeEnd就會只在doEndTag時被呼叫(UIComponentTag的實作)
    從這個元件之後.
    它的所有下層元件將被壓制,不再在doStartTag,及doEndTag裏來輸出,
    而這顆元件有將其下層元件呼叫輸出的義務(直到遇到下層中另外一顆也需自己輸出兒子的元件)。
     
    從JSP的JAVA CODE來看.
        panel_tag.doStartTag() ==> no output
        out.write("<div>")
        out.wirte("<script>alert(\"A\")</script>");
        button_tag.doStartTag(); ==> no output
        button_tag.doEndTag(); ==> no output
        out.write("</div>");
        panel_tag.doEndTag(); ==> out panel & button
     
    很明顯的,將導致輸出被分離的結果。
     
     
    結論是,當一個頁面用了類似Panel這種要自己layout children的Componet後,
    在裏面寫的HTML或javascript,必需不包含位置及序頁的特性
     
    也就是說JavaScript寫成在.js裏,HTML....應該是沒救了...不要寫HTML~~~
    Or,請愛用Tiles Panel元件~~~~~將script及html寫在tiles對應的layout.jsp裏
    posted on 2007-07-12 16:53 冰封的愛 閱讀(867) 評論(0)  編輯  收藏 所屬分類: J2EE
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 91精品国产免费久久国语蜜臀| 91精品成人免费国产| 最近中文字幕完整免费视频ww| 国产亚洲精品观看91在线| 你是我的城池营垒免费看| 青青草原亚洲视频| a级毛片免费播放| 久久久久亚洲AV片无码| 最近免费中文字幕高清大全| 亚洲天堂中文字幕在线观看| 美女视频黄a视频全免费| 亚洲一级毛片在线播放| 成年女人免费v片| 妇女自拍偷自拍亚洲精品| 亚洲国产精品人人做人人爱| 久久国产精品免费一区| 久久国产精品亚洲一区二区| 久久国产色AV免费观看| 国产精品亚洲专区在线观看 | 免费一级毛片一级毛片aa| 看Aⅴ免费毛片手机播放| 精品国产亚洲男女在线线电影 | 色爽黄1000部免费软件下载| 中文字幕日韩亚洲| 久久久久国产精品免费看| 亚洲日韩在线视频| 国产女高清在线看免费观看| 国产黄片不卡免费| 亚洲啪啪免费视频| 国产精品成人无码免费| 日本黄色动图免费在线观看| 国产精品亚洲一区二区麻豆| 亚洲欧洲久久久精品| 99久久99热精品免费观看国产| 亚洲色精品三区二区一区| 最新国产AV无码专区亚洲| 999国内精品永久免费观看| 偷自拍亚洲视频在线观看| 亚洲AV日韩AV天堂一区二区三区| 日韩免费精品视频| 国产精品极品美女自在线观看免费|