在一个ssh项目里,我使用到了strut2标签,因为不熟练,遇到一系列问题,下面整理出来,与大家共享。
要求是这样:在前台页面上要用select下拉框,下拉框的内容是从后台程序读出来的。
1.首先,来看看前台页面baseinfo.jsp:
<%@ page contentType="text/html; charset=GB2312"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title><s:text name="index"/></title> </head> <body> <br> <table width="768" border="0" align="center" cellpadding="0" cellspacing="0"> <tr> <td> <s:form action="baseinfoProcess.action"> <s:select name="nationality" key="label_nationality" list="nations" listKey="id" listValue="nation"/> </s:form> </td> </tr> </table> </body> </html>
2.建立下拉框内容的对象的类,Nation.java:
package auth.model; /** * * @author weiqi * @version 0.1 2009-02-25 */ public class Nation implements java.io.Serializable { // Fields private Integer id; private String nation; /** default constructor */ public Nation() { } /** full constructor */ public Nation(Integer id, String nation) { this.id = id; this.nation = nation; } // Property accessors public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getNation() { return this.nation; } public void setNation(String nation) { this.nation = nation; } }
3.action类:TestAction.java
package auth.action; import java.util.*; import com.opensymphony.xwork2.ActionSupport; import auth.model.Nation; /** * * @author weiqi * @version 0.1 2009-02-25 */ public class TestAction extends ActionSupport { private List nations ; public String execute() throws Exception { List nations =new ArrayList<Nation>(); Nation hz = new Nation(1,"汉族"); Nation tjz = new Nation(2,"土家族"); Nation huiz = new Nation(3,"回族"); nations.add(hz); nations.add(tjz); nations.add(huiz); setNations(nations); return "success"; } public void setNations(List nations) { this.nations = nations; } public List getNations() { return nations; } }
4.再来看看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> <package name="weiqi" extends="struts-default"> <action name="test" class="auth.action.TestAction"> <result name="success">/WEB-INF/jsp/baseinfo.jsp</result> <result name="failure">/WEB-INF/jsp/error.jsp</result> </action> </package> </struts>
应该没错了,运行,测试一下,结果报错了:
2009-02-27 00:18:54 [ http-8080-Processor25:76531 ] - [ ERROR ] Servlet.service() for servlet jsp threw exception tag 'select', field 'list', name 'nationality': The requested list key 'nations' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location] at org.apache.struts2.components.Component.fieldError(Component.java:231) at org.apache.struts2.components.Component.findValue(Component.java:293) at org.apache.struts2.components.ListUIBean.evaluateExtraParams(ListUIBean.java:79) at org.apache.struts2.components.Select.evaluateExtraParams(Select.java:99) at org.apache.struts2.components.UIBean.evaluateParams(UIBean.java:780) at org.apache.struts2.components.UIBean.end(UIBean.java:481)
报错的意思是nations不能转换成/array/map/enumeration/iterator等类型。
仔细查了查,select标签的说明:
---------------------------------------------------------------------------------------------------------------------------
struts2的select标签中,常用的有以下几个属性:
(1)struts2中的select 标签中,必须设置的属性只有一个,即是list。
(2)select标签的list中必须有值,不然会报错。如果没有值,可以加上headerKey, headerValue,这样就可以通过了
其中,即使list中有值,我们也通常会加上headerKey, headerValue,即列表中显示的第一个选项。注意,headerKey不可以为空,不可以为-1
(3)list属性:通常是在action中定义的,必须是一个可以迭代的源,如为一个List, Map, Set等。如果是一个Map,那么map的key就对应于select标签中的value,map中的value就对应于select标签中的option。而如果是一个List或者是一个Set,那么可以通过listKey和listValue指定。
(4)listKey和listValue:listKey即对应于select标签中的value, listValue即对应于select标签中的option。
(5)name属性:即是表单中select的名称。
---------------------------------------------------------------------------------------------------------------------------
我的写法没有问题啊。
后来,我把重点放在了TestAction.java的身上,做了如下改动:
package auth.action;
import java.util.*;
import com.opensymphony.xwork2.ActionSupport;
import auth.model.Nation;
/**
*
* @author weiqi
* @version 0.1 2009-02-25
*/
public class TestAction extends ActionSupport {
private List<Nation> nations ;
public String execute() throws Exception {
List<Nation> nations =new ArrayList<Nation>();
Nation hz = new Nation(1,"汉族");
Nation tjz = new Nation(2,"土家族");
Nation huiz = new Nation(3,"回族");
nations.add(hz);
nations.add(tjz);
nations.add(huiz);
setNations(nations);
return "success";
}
public void setNations(List<Nation> nations) {
this.nations = nations;
}
public List<Nation> getNations() {
return nations;
}
}
再次运行,成功。^_^
希望对大家有帮助。