我在STRUTS中添加了一个下拉框,但是没有成功,问是不是写错了?在FORM中 private String provinceId; public String getProvinceId()
{
return "1";
} public void setProvinceId(String provinceId)
{
this.provinceId = provinceId;
} private List provinceIds = null; public List getProvinceIds()
{
provinceIds.add(0,"aaa");
provinceIds.add(1,"aaa");
provinceIds.add(2,"aaa");
return provinceIds;
}在JSP中<html:select property="provinceId" styleClass="table-list">
<html:optionsCollection property="provinceIds"/>
</html:select>请问是不是写错了?
{
return "1";
} public void setProvinceId(String provinceId)
{
this.provinceId = provinceId;
} private List provinceIds = null; public List getProvinceIds()
{
provinceIds.add(0,"aaa");
provinceIds.add(1,"aaa");
provinceIds.add(2,"aaa");
return provinceIds;
}在JSP中<html:select property="provinceId" styleClass="table-list">
<html:optionsCollection property="provinceIds"/>
</html:select>请问是不是写错了?
首先在form中你有一个属性
private String provinceId;即可,但它的get方法你不应该修改,你的本意可能是想给它设置初值,但不应该在get方法中。要么放在form的reset方法中,要么放在action中来初始化,建议是后者。
对于rivate List provinceIds = null;也不用放在form中,可以放在action中。
在action中,
import org.apache.struts.util.LabelValueBean;
List result = new ArrayList();
result.add(new LabelValueBean("aaa", "0");
result.add(new LabelValueBean("bbb", "1");
result.add(new LabelValueBean("ccc", "2");
request.setAttribute("provinceIds", result);
form.setProvinceId("1");
return mapping.findForward("你的jsp");
在jsp中,
<html:select styleId="provinceId" name="xxxForm" property="provinceId">
<html:option value="">请选择</html:option>
<html:options collection="provinceIds" property="value" labelProperty="label" filter="false"/>
</html:select>这样配置后,下拉列表中第一项会显示一个“请选择”,你也可以把它去掉。后边会有你在action中初始化的3个选项,分别显示为"aaa","bbb","ccc",对应的值是0,1,2。由于form中的provinceId被设置为1,所以最终显示出来的列表中,会默认选中"bbb"这一项,因为它的值是1。我不知道lz开发的时候是习惯让用户先访问jsp页面,然后再提交到Action处理呢,还是使用常用的模式:让用户先访问一个.do到action中,然后初始化各种数据,再跳转到jsp中,用户再提交数据回Action处理。
我这里的例子用的是后者,因为action中只有一个execute方法,为了区分是用户直接访问过来还是用户从jsp提交请求过来,你可以用一个参数来标识一下,如直接访问的时候为/xxx.do?todo=visit,而提交的时候则在jsp中放一个隐藏域<html:hidden property="todo" value="submit"/>,在action的execute方法中你就可以通过判断todo的值来完成初始化或数据保存然后跳转到对应的各个jsp去。
如果你会用struts的dispatch action,则action可以有多个方法允许用户直接访问到或者提交到,就无需上边todo参数这种判断了。
在ACTION中 List result = new ArrayList();
result.add(new LabelValueBean("aaa", "0"));
result.add(new LabelValueBean("bbb", "1"));
result.add(new LabelValueBean("ccc", "2"));
form.setProvinceIds(result);
form.setProvinceId("1");
我用的是
form.setProvinceIds(result);
你用的是
request.setAttribute("provinceIds", result);
这有什么不同?还有,在JSP中
我用
<html:optionsCollection property="provinceIds"/>就可以,但用你的<html:options collection="provinceIds" property="value" labelProperty="label" filter="false"/>就会出错呢?
是把provinceIds作为你的form对象的一个子对象(属性)放在request中的,所以在jsp上用<html:optionsCollection property="provinceIds"/>,而且外围要有一个<html:form>,这样才能获得provinceIds。
而request.setAttribute("provinceIds", result);是把provinceIds作为一个独立的对象放在request中,所以<html:options collection="provinceIds" property="value" labelProperty="label" filter="false"/>来取,并且外围不需要<html:form>。用前一种方法也可以不要外围的<html:form>,但<html:optionsCollection中需要加上一个name="form的名称",这样也行。