在一个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;
}
}
再次运行,成功。^_^
希望对大家有帮助。