我在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>请问是不是写错了?

解决方案 »

  1.   

    确实是错了。
    首先在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参数这种判断了。
      

  2.   

    我只是写个例子,我知道代码应该在ACTION中的,但如果写例子的话,写在FROM中,可以写少一点
      

  3.   

    问题解决了,但为什么我写的东西和你的有点区别?
    在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"/>就会出错呢?
      

  4.   

    form.setProvinceIds(result);
    是把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的名称",这样也行。