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:
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:
<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..
}
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..
}
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"
最后谢谢楼主给了我一个提示,最终解决了我的问题。
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包。偶是菜鸟。。。
完全不知道怎么解决。
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
http://www.javaeye.com/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个,其他的配置也是正确的,而且也测试了多次,在网上也找了一些类似的资料,结果还是报错)
抛出了异常
严重: 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.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>
<?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>
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>
<%@ 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给予解答
不知道为什么?
望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里的一个键值
根据错误信息,错误是因为你的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当前选中的对象。
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当前选中的对象。