JAVA

          人生若只如初見,何事秋風(fēng)悲畫扇。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            50 隨筆 :: 25 文章 :: 157 評論 :: 0 Trackbacks

            在Struts應(yīng)用中,到JSP頁面上顯示下拉列表框應(yīng)該是常有的事。
            在基于是Struts的MVC框架中顯示下拉框,有好些方法,用自定義標(biāo)簽庫就是其中之一。

            若我們的此下拉框是放在基于HtmlForm中的。Struts可以通過ActionForm來保存其歷史記錄(不排除我們?nèi)藶榈亟o此ActionForm清理一下)。然而此自定義標(biāo)簽庫卻沒有此功能!因為它沒有通過過ActionForm中的字段來保存其記錄。所以選擇的時候可以根據(jù)自己的需要來定(我覺得在ActionForm中處理List列表框真的是一件非常龐大的工程:) )。

            JSP中對標(biāo)簽的應(yīng)用:

          <% @?taglib?uri = " /WEB-INF/self-html.tld " ?prefix = " test " ? %>
          < div? class ="formitem" >
          ??????
          < span? class ="parameter_name" > 所屬欄目: </ span >
          ??????
          < span? class ="parameter_value" >
          ??????
          < test:category? name ="dto.id" ?type ="17" />
          ??????
          </ span >
          ?????
          </ div >

            
            web.xml配置文件中:

          <!-- ?self?Tag?Library?Descriptors? -->
          ??
          < taglib >
          ????
          < taglib-uri > /WEB-INF/self-html.tld </ taglib-uri >
          ????
          < taglib-location > /WEB-INF/self-html.tld </ taglib-location >
          ??
          </ taglib >
          self-html.tld定義:
          < taglib >
          ?
          < tlibversion > 1.0 </ tlibversion >
          ?
          < jspversion > 1.1 </ jspversion >
          ?
          < shortname > netedu </ shortname >
          ??
          ?
          < tag >
          ??
          < name > category </ name >
          ??
          < tagclass > com.CategoryTag </ tagclass > ?
          ??
          < bodycontent > empty </ bodycontent >
          ??
          < info > tag?here </ info > ??
          ??
          < attribute >
          ??
          < name > name </ name >
          ??
          < required > false </ required >
          ??
          < rtexprvalue > false </ rtexprvalue >
          ??
          </ attribute >
          ??
          < attribute >
          ??
          < name > id </ name >
          ????
          ?
          </ tag >
          </ taglib >

            以后自己就有什么擴(kuò)展的需要就是在這兒加參數(shù)了!


            總算是到了標(biāo)簽庫的定義的地方了:

          /**
          ?*?
          @author ?test?
          ?
          */

          public ? class ?CategoryTag? extends ?TagSupport? {
          ?
          /* ?(non-Javadoc)
          ?????*?@see?javax.servlet.jsp.tagext.Tag#doStartTag()
          ?????
          */

          ????
          public ? int ?doStartTag()? throws ?JspException? {
          ????????
          // ?TODO?Auto-generated?method?stub
          ???????? try ? {
          ????????????JspWriter?out?
          = ?pageContext.getOut();
          ????????????
          // jspwriter是一個隱含對象,用于向jsp網(wǎng)頁輸出內(nèi)容。輸出的目標(biāo)由
          ????????????CategoryManager?manager? = ?getManager();
          ????????????List?options
          = null ;
          ????????????
          ????????????
          if (type == Constants.SORT_VALUE_ARCHIVE_YEAR)
          ????????????????options
          = getArchiveYear();
          ????????????
          if (options == null || options.size() == 0 )
          ????????????????options
          = UMParameterUtil.getParameters(type);
          ????????????
          ????????????
          if (options == null || options.size() == 0 )
          ???????????????options
          = ?manager.getCategorys(type);
          ????????????
          ????????????BaseCategoryDTO?dto;
          ????????????ParametersDTO?param;
          ????????????Object?o?
          = ? null ;

          ????????????
          if ?(bean? != ? null )
          ????????????????????o?
          = ?RequestUtils.lookup(pageContext,?bean,?property,?scope);
          ???????????
          ????????????
          if ?(o? != ? null ? && ?((? ! (o? instanceof ?Integer)) && (? ! (o? instanceof ?Long)) && ?( ! (o? instanceof ?List)) && ?( ! (o?

          instanceof ?Long[]))?))
          ????????????????????
          throw ? new ?JspException(
          ????????????????????????????
          " bean?or?property?must?be?instanceof?Long?or?List " );
          ????????????
          ????????????out.print(
          " <select? " ? + ?TaglibUtil.attrFormat( " name " ,?name));
          ????????????out.print(TaglibUtil.attrFormat(
          " id " ,?id));
          ????????????out.print(TaglibUtil.attrFormat(
          " multiple " ,?multiple));
          ????????????out.print(TaglibUtil.attrFormat(
          " class " ,?styleClass));
          ????????????out.print(TaglibUtil.attrFormat(
          " size " ,?String.valueOf(size)));
          ????????????out.print(TaglibUtil.attrFormat(
          " onchange " ,?onchange));
          ????????????out.print(TaglibUtil.attrFormat(
          " style " ,?style));
          ????????????out.print(TaglibUtil.attrFormat(
          " disable " ,?disable));
          ????????????out.print(
          " > " );
          ????????????
          if ?(showAll)?out.print( " <option?value=-1>不限</option> " );
          ????????????
          if ?(showNull)?out.print( " <option?value=''></option> " );
          ????????????????printOption(out,?options,?o);
          ??out.print(
          " </select> " );
          ?}
          ? catch ?(IOException?ioException)? {
          ????????????
          throw ? new ?JspException(ioException.getMessage());
          ????????}
          // catch
          ???????? return ?(SKIP_BODY);
          ????????
          // return?super.doStartTag();
          ????}



            注:
            有options= manager.getCategorys(type);其中manager是CategoryManager類。此方法返回的一個List就是下拉框的值。具體實現(xiàn)可由我們自己來定義好了!記得在JSP中也有<test:category name="dto..id" type="17"/>,其中的type="17"(比如說可以是傳一個DB中的一個表的一個外鍵)就是此方法中的初始化參數(shù)值了(關(guān)于此標(biāo)簽庫的定義的一些setter and getter方法中也舍了).既然是庫當(dāng)然要通用。這個type就是通用的一個關(guān)鍵入口,不過顯然這樣一樣可讀性打了幾分折扣。

            TaglibUtil.attrFormat("name", name)的方法如下:

          public ? class ?TaglibUtil? {

          ?
          public ? static ?String?attrFormat(String?attrName,?Object?attrValue)? {
          ?????
          if ?(attrValue != null )
          ?????????
          return ? " ? " ? + ?attrName? + ? " = " ? + ? " \ "" ?+?attrValue?+? " \ "" ;
          ?????
          else
          ?????????
          return ? " ? " ;
          ?}

          }


            還有一個就是printOption,這個方法應(yīng)該比較重要了。它負(fù)責(zé)生成了列表框的選擇的值與名稱。如:

          ? if ?( ! excludeFlag)? {
          ????????????out.print(
          " <option? "
          ????????????????????
          + ?TaglibUtil.attrFormat( " value " ,?id
          ????????????????????????????.toString()));
          ????????????out.println(TaglibUtil.attrFormat(
          " sysValue " ,?sysValue));
          ????????????
          if (o != null ) {
          ????????????????
          if (o? instanceof ?Long) {
          ????????????????????
          if ?(id.equals(o))?out.print( " selected? " );
          ????????????????}

          ????????????????
          else
          ????????????????????
          if (o? instanceof ?List) {
          ????????????????????????
          if ?(((List)o).contains(id))?
          ????????????????????????????out.print(
          " selected? " );??
          ????????????????????}
          else ?
          ????????????????????????
          if (o? instanceof ?Long[]) {
          ????????????????????????????
          if (isSelected(id,(Long[])o))
          ????????????????????????????????out.print(
          " selected? " );?
          ????????????????????????}

          ????????????}

          ???????????
          // ?if?(dto.getId().equals(o))?out.print("selected?");
          ????????????out.print( " > " );
          ????????????out.print(name);
          ????????????out.print(
          " </option> " );
          ????????}


            不要郁悶id是如何來的。當(dāng)然是從options= manager.getCategorys(type)中來的了。

            也許說得不是太詳細(xì),代碼也有些殘缺。不過實現(xiàn)過程基本全在這里了。我覺得它非常棒,直到我用到它的onchange,style時!簡直在直接跟使用html中的list一樣!

             out.print(TaglibUtil.attrFormat("size",?String.valueOf(size)));
          ????????????out.print(TaglibUtil.attrFormat(
          "onchange",?onchange));
          ????????????out.print(TaglibUtil.attrFormat(
          "style",?style));
          ????????????out.print(TaglibUtil.attrFormat(
          "disable",?disable));


            至少給我們指明了一些自定義標(biāo)簽庫的經(jīng)驗!

          posted on 2006-04-06 18:55 Jkallen 閱讀(5957) 評論(8)  編輯  收藏 所屬分類: JEE學(xué)習(xí)其它開源

          評論

          # re: Struts自定義標(biāo)簽庫-----列表顯示 2006-12-18 10:31 knight[匿名]
          代碼不全,不知所云  回復(fù)  更多評論
            

          # re: Struts自定義標(biāo)簽庫-----列表顯示 2007-07-11 16:43 darkdragonking
          干嗎不把全部代碼弄上呢,出于保密?
          實話實說,
          寫的不是很明白
          但是感謝摟主作出的貢獻(xiàn)all the same  回復(fù)  更多評論
            

          # re: Struts自定義標(biāo)簽庫-----列表顯示 2007-09-03 18:27 臨沂師院
          寫的更明白些會更好了,不果頂一下  回復(fù)  更多評論
            

          # re: Struts自定義標(biāo)簽庫-----列表顯示 2008-01-13 11:26 alonely
          感覺概念說的還不是很清楚
          http://www.3y11.com  回復(fù)  更多評論
            

          # re: Struts自定義標(biāo)簽庫-----列表顯示 2008-10-02 18:03 力五
          寫的還不錯!那位有自定義標(biāo)簽的一些運行順序圖,發(fā)給我啊!謝謝
          QQ:105677211  回復(fù)  更多評論
            

          # re: Struts自定義標(biāo)簽庫-----列表顯示[未登錄] 2008-10-03 07:34 藍(lán)天
          剛剛畢業(yè)之時起的筆,現(xiàn)在一些特殊原因,不能再發(fā)了...  回復(fù)  更多評論
            

          # re: Struts自定義標(biāo)簽庫-----列表顯示 2009-06-07 09:54 馬馬虎虎,還需努力
          馬馬虎虎,還需努力  回復(fù)  更多評論
            

          # re: Struts自定義標(biāo)簽庫-----列表顯示[未登錄] 2013-07-11 00:13 Randy
          如果可能,麻煩把完整的源碼發(fā)給我下:362563734@qq.com
          感激不盡!~  回復(fù)  更多評論
            

          主站蜘蛛池模板: 剑川县| 璧山县| 文昌市| 五河县| 化州市| 沙坪坝区| 江都市| 福安市| 樟树市| 安陆市| 修水县| 微博| 九寨沟县| 东至县| 东乌珠穆沁旗| 洛阳市| 萝北县| 炉霍县| 北安市| 江达县| 建阳市| 合川市| 淳化县| 耿马| 沛县| 四会市| 望都县| 平邑县| 博白县| 北辰区| 正蓝旗| 无为县| 淄博市| 德安县| 宁化县| 五原县| 吉木萨尔县| 改则县| 綦江县| 嘉兴市| 阿坝|