鐵手劍譜

          上善若水
          數據加載中……
          Struts秘籍之第2段:第3.10式:過濾文本輸入

          第3.10式. 過濾文本輸入

          問題

          你想要渲染包含HTML標記的數據,并且希望該數據被瀏覽器當作HTML標記解釋和處理。

          動作要

          很簡單,可以使用:

          <bean:write name="myForm" property="freeText" filtered="false"/>

           

          在使用JSTL時,你也可以使用未過濾的值:

          <c:out value="${myForm.freeText}" escapeXml="false"/>

           

          動作變化

          在你使用Struts bean:write標簽來產生文本時,默認情況下任何對HTML處理敏感的字符都要被它們的對等實體代替。例如,大于號字符(>) 將被替代為&gt;字符實體。這種特征稱為是響應過濾( response filtering),默認情況下是激活的。在大多數情況下,過濾正是希望的行為,因為未經過濾的文本可能被瀏覽器誤解釋。Table 3-4 列出了被bean:write標簽過濾的字符和它們的對應實體。

          Table 3-4. 被過濾的字符

          字符名稱

          字符值

          替代實體

          大于

          &lt;

          小于

          &gt;

          &符號

          &

          &amp;

          雙引號

          "

          &quot;

          反斜杠

          \

          &#39;

           

          但是有時候,你希望被渲染的文本中包括HTML 標簽。假設你有一個在線日志應用,允許用戶輸入將要顯示在一個頁面中的文本。允許使用HTML 標簽將使得用戶可以那些可以格式化文本的標記。文本中可能包含超鏈接,不同的字體,以及圖像等等。在其他情形下,你的應用可能可能還會從其他來源,比如另一個URL,一個XML文件,一個Web Service或者數據庫中,獲得HTML模板文本。

          通過將bean:write標簽的filtered屬性設置為false,你就可以告訴Struts標簽不要使用相應的實體替換 tag not to 特殊字符。首先,我們來看一下過濾是如何工作的。假設一個用戶在表單中輸入了下面的文本:

          Apache Struts Web Framework <b>rocks</b>!

           

          現在這個文本將被bean:write標簽來渲染顯示。當filtered 屬性設施為true時,特殊字符將被其對等物替換,這樣文本看起來就會是:

          Apache Struts Web Framework &lt;b&gt;rocks&lt;/b&gt;!

          這很有可能不是用戶所想要的。他想要的是"Apache Struts Web Framework rocks!"。但是,因為意圖是想要允許用戶輸入裝飾文本的HTML標簽,那么將filtered屬性設置為false 就會得到正確的渲染:

          Apache Struts Web Framework <b>rocks</b>!

           

          瀏覽器將認識這個標簽,并且按其所愿正確的應用HTML 標記。

          這在渲染一個Web頁面時式一個有用的機制。但是,在使用這個方法時必須足夠小心。如果數據是沒有過濾的,那么就可能會危及渲染后的 HTML頁面的布局,整個頁面可能會看起來遭到破壞。例如,假定下面的文本被輸入:

          Apache Struts Web Framework <b>rocks<b>!

           

          咋看起來,這沒什么問題。但是,注意到b元素的后面一個關閉標簽的斜杠缺失了。這個錯誤很容易發生,而且這可能會使得頁面中后面的所有文本都是粗體。

          不幸的是,要避免這類錯誤是很困難的。最好還是試圖確保輸入的數據都是正確有效的HTML。還有個選擇就是通過XML 解析器來處理輸出。它會檢測諸如標記不匹配之類的問題。你還可以通過一些能夠試圖糾正問題的解析器來完成,比如Jtidy。最后,如果數據是來自于非受控的來源,你可以選擇完全不允許HTML。如果你還想使用一些文本裝飾功能的話,還可以考慮使用WikiText 或者UBB Code之類的格式表示來替代。

          相關動作

          JTidy 提供了一個命令行接口和Java API 來解析和整理HTML。關于JTidy 的細節請訪問http://jtidy.sourceforge.net。

          UBBCode 是PHP本身支持的一種標記格式。也可以在Java中處理UBBCode。一個解析UBBCode 的PHP函數,有人在Java中重寫了,地址可見:http://www.firegemsoftware.com/other/tutorials/ubb.php.

          posted on 2005-07-01 09:57 鐵手 閱讀(2345) 評論(2)  編輯  收藏 所屬分類: JavaStruts系列

          評論

          # Struts 秘籍(CookBook)[TrackBack] 2005-11-12 18:29 阿泠

          本系列源改編自O'Reily的Strus Cookbook
          [引用提示]阿泠引用了該文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
            回復  更多評論    

          # re: Struts秘籍之第2段:第3.10式:過濾文本輸入 2006-03-02 14:55 adam

          呵呵,不知道你用的那個版本,我是用的是1.2.7。

          在這個版本中應該寫“filter”,而不是"filtered"。
            回復  更多評論    
          主站蜘蛛池模板: 罗城| 酉阳| 白玉县| 金堂县| 潮安县| 正蓝旗| 镇原县| 蒙阴县| 博爱县| 米泉市| 根河市| 温州市| 大冶市| 郴州市| 惠州市| 荆门市| 安阳县| 马鞍山市| 民权县| 潍坊市| 舟山市| 永济市| 蒲城县| 德安县| 五家渠市| 名山县| 邵阳市| 广灵县| 夏邑县| 高清| 闽侯县| 彭山县| 周至县| 山阴县| 六枝特区| 哈巴河县| 晋城| 武川县| 厦门市| 合川市| 北碚区|