云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Struts2中doubleselect的使用方法

          Posted on 2008-03-27 22:08 云自無心水自閑 閱讀(12157) 評論(16)  編輯  收藏 所屬分類: Java心得體會Struts2
          在Struts2的官方網站上,有doubleselect的用法示例,但是那個例子比較簡單。
          <s:doubleselect label="doubleselect test2" name="menu" list="#{'fruit':'Nice Fruits', 'other':'Other Dishes'}" doubleName="dishes" doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" />
          上面的例子演示了doubleselect的基本用法,但是其list和doubleList都是固定的。尤其是doublelist的切換使用了3目運算符 ? :,并沒有太大的實際使用價值。在實際應用中,list往往是action返回的一個List<DataObject>,listKey和listValue來顯示第一級下拉框,doubleList往往是一個Map<Integer, List<DataObject>>,其中Map中的Key值是第一級下拉框的listKey。
          舉個例子:
          Data Object:
          public class Book {
                  
          private int id;
                  
          private String name;
                  
          private int categoryId;

                  
          // getter and setter..
          }


          public class Category {
                  
          private int id;
                  
          private String name;

                  
          // getter and setter..
          }


          JSP:
          <s:doubleselect list="categoryList" listKey="id" listValue="name"
             doubleName="bookId" doubleList="bookMap.get(top.id)" doubleListKey="id" doubleListValue="name" theme="simple"/>

          此處要注意的是top的用法,開始我以為top就是指代list的值,所以使用的是bookMap.get(top),但是二級下拉框一直是空白,后來我突然想到說不定top是一個Category實例呢,嘗試了一下top.id,果然成功了。

          Action:

          public class DemoAction {
                  
          private Map<Integer, List<Book>> bookMap;
                  
          private List<Category> categoryList;

                  
          public String execute() throws Exception {
                          categoryList 
          = new ArrayList<Cateogry>();

                          Category category;
                          category 
          = new Category();
                          category.setId(
          1);
                          category.setName(
          "Fiction");
                          categoryList.add(category);
                          category 
          = new Category();
                          category.setId(
          2);
                          category.setName(
          "Java");
                          categoryList.add(category);

           

                          bookMap 
          = new HashMap<Integer, List<Book>>();

                          List
          <Book> bookList = new ArrayList<Book>();
                          Book book;
                          book 
          = new Book();
                          book.setId(
          1);
                          book.setName(
          "Harry Porter");
                          book.setCategoryId(
          1);
                          bookList.add(book);

                          book 
          = new Book();
                          book.setId(
          2);
                          book.setName(
          "Nightmare");
                          book.setCategoryId(
          1);
                          bookList.add(book);

                          bookMap.put(
          1, bookList);

           

                          bookList 
          = new ArrayList<Book>();
                          book 
          = new Book();
                          book.setId(
          3);
                          book.setName(
          "Thinking in Java");
                          book.setCategoryId(
          2);
                          bookList.add(book);
                          book 
          = new Book();
                          book.setId(
          4);
                          book.setName(
          "Head First Design Patterns");
                          book.setCategoryId(
          2);
                          bookList.add(book);

                          bookMap.put(
          2, bookList);


                          
          return SUCCESS;
                  }

                  
          // getter and setter..
          }






          評論

          # re: Struts2中doubleselect的使用方法[未登錄]  回復  更多評論   

          2008-03-28 12:43 by allenny
          Struts2很多標簽的用法要靠猜的,真是很郁悶

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-03-29 11:22 by usherlight
          是的,感覺struts2的文檔還是不夠詳細具體。

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-04-08 16:44 by struts2
          經測試這段代碼有以下幾個問題,
          1、代碼第二行,
          private Map<Integer, List<Book>> bookList;
          應該是
          private Map<Integer, List<Book>> bookMap;
          2、book 里面只有一個值,由于沒有聲明book 類型為singleton,所有你存那么多值,最終在頁面最的時候只有一個,那就是 "Head First Design Patterns"

          最后謝謝樓主給了我一個提示,最終解決了我的問題。

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-04-10 10:40 by usherlight
          謝謝你指出代碼中的錯誤。我這段代碼不是在Eclipse這樣的集成開發環境里寫的,所以出現了一些錯誤。

          # re: Struts2中doubleselect的使用方法[未登錄]  回復  更多評論   

          2008-04-14 18:09 by 阿偉
          不知道為什么總是報:“FreeMarker template error!”的錯誤???

          # re: Struts2中doubleselect的使用方法[未登錄]  回復  更多評論   

          2008-04-14 18:17 by 阿偉
          剛解決,<s:form 里面沒加name這個屬性,瘋掉....

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-06-26 10:05 by wu
          報模塊找不到的錯誤,
          The module has not been deployed.
          See the server log for details.
          at org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:174)
          at org.netbeans.modules.j2ee.ant.Deploy.execute(Deploy.java:104)
          at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
          at sun.reflect.GeneratedMethodAccessor121.invoke(Unknown Source)
          在netbeans中加入struts2,只加了最基本的5個jar包。偶是菜鳥。。。
          完全不知道怎么解決。

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-06-27 13:12 by usherlight
          @wu
          是在什么地方發現的這個錯誤?能說得再詳細一些嗎?

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-08-04 11:45 by xingdian119
          高手,拜托給看看這個問題,先謝謝啦。
          http://www.javaeye.com/problems/2059

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-09-12 18:50 by waylon
          LZ我按照你上面寫的做了一下,結果不能成功
          拋出了異常
          嚴重: Servlet.service() for servlet jsp threw exception
          tag 'doubleselect', field 'list': The requested list key 'categoryMap.get(top.id)' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]

          貌似這個標簽本身就有個缺陷......
          (注:我的配置包就是最基本的5個,其他的配置也是正確的,而且也測試了多次,在網上也找了一些類似的資料,結果還是報錯)

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-09-12 18:50 by waylon
          我的struts.xml配置
          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd">
          <!-- struts 是struts2 的根元素 -->
          <struts>

          <!-- Struts2 的action 必須放在制定的包空間下定義 -->
          <package name="login" extends="struts-default">
          <action name="Login" class="org.waylon.DemoAction">
          <result name="success">/index.jsp</result>
          </action>
          </package>

          </struts>

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-09-12 18:53 by waylon
          index.jsp

          <%@ page language="java" pageEncoding="UTF-8"%>
          <%@ taglib prefix="s" uri="/struts-tags"%>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
          <head>
          <title>dfsdfd</title>
          <s:head />
          </head>
          <body>
          <s:form action="Login" name="login">
          <s:doubleselect list="categoryList" listKey="id" listValue="name"
          doubleName="bookId" doubleList="bookMap.get(top.id)" doubleListKey="id" doubleListValue="name" theme="simple" formName="login"/>
          </s:form>

          </body>
          </html>

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-09-12 18:54 by waylon
          然后3個java文件和你的一樣,但是就是運行不起....
          不知道為什么?
          望LZ給予解答

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-09-13 18:59 by usherlight
          @waylon
          根據錯誤信息,錯誤是因為你的bookMap.get(top.id)返回的結果不是一個list,
          那么需要檢查以下一些東西:
          1. bookMap的值是否正確(bookMap是否為空,bookMap集合里的元素值是否正確)
          2. top.id的值是否正確(也就是categoryList的值是否正確)
          3. categoryList里的第一個值是否是bookMap里的一個鍵值

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-10-15 11:22 by zgxer
          listKey與doubleListKey 如何關聯,我好像沒法通過listkey篩選???

          # re: Struts2中doubleselect的使用方法  回復  更多評論   

          2008-10-21 19:24 by usherlight
          @zgxer
          doubleSelect的運行原理是這樣的:
          list屬性指定了一個list,這個list中的值可以是一個key-value對,也可以是一個JavaBean,如果是JavaBean,需要用listKey和listValue來指定list的key和value使用JavaBean中的哪個屬性。
          doubleList也是一個list,但是如何實現聯動的呢?關鍵就是在于bookList的寫法是:top關鍵字的應用。在我的例子中是這樣的:doubleList="bookMap.get(top.id)",bookMap.get(top.id)返回的就是一個List,而且是根據top.id返回的List,top代表是就是list當前選中的對象。
          主站蜘蛛池模板: 东丰县| 丹江口市| 漳平市| 龙南县| 科技| 池州市| 称多县| 措勤县| 舒城县| 寿宁县| 连平县| 汝南县| 河源市| 河南省| 海安县| 宜丰县| 密山市| 桃园县| 湟源县| 青海省| 汉中市| 巨野县| 杭锦旗| 剑河县| 美姑县| 扬中市| 玉门市| 崇义县| 读书| 婺源县| 岢岚县| 获嘉县| SHOW| 闽清县| 古丈县| 海晏县| 太原市| 绩溪县| 通许县| 沙洋县| 潮州市|