云自无心水自闲

天平山上白云泉,云自无心水自闲。何必奔冲山下去,更添波浪向人间!
posts - 288, comments - 524, trackbacks - 0, articles - 6
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Struts2中doubleselect的使用方法

Posted on 2008-03-27 22:08 云自无心水自闲 阅读(12141) 评论(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当前选中的对象。

只有注册用户登录后才能发表评论。


网站导航: