在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-29 11:22 by usherlight是的,感觉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这样的集成开发环境里写的,所以出现了一些错误。
不知道为什么总是报:“FreeMarker template error!”的错误???
报模块找不到的错误,
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./problems/2059 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个,其他的配置也是正确的,而且也测试了多次,在网上也找了一些类似的资料,结果还是报错) 我的struts.xml配置
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts./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> 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> 然后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里的一个键值 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当前选中的对象。 |
|