details.jsp页面上提供如下表单:
<%
List<City> cities = new ArrayList<City>();
cities.add(new City(1001,"gz"));
cities.add(new City(1002,"sz"));
cities.add(new City(1003,"wh"));
request.setAttribute("cities", cities);
%>
<s:form action="save.action">
<s:checkboxlist list="#request.cities"
listKey="cityId" listValue="cityName"
label="city^^" name="cities"></s:checkboxlist>
<s:submit type="submit" value="tijiao"></s:submit>
</s:form>
struts.xml配置文件中配置action:
<action name="save" class="com.atguigu.struts2.valuestack.User"
method="save">
<result name="success">/details.jsp</result>
</action>
在User类中定义了setter方法:
public class User {
private List<City> cities;//City类已经定义好了,有cityId和cityName两个属性,且有相应的getter和setter方法。
...
public void setCities(List<City> cities) {
this.cities = cities;
System.out.println(cities);
}
...
}
按照struts2的运行流程,勾选中的选项应该可以构成一个list对象,通过setCities方法注入到cities属性中,但是跑起来却发现cities参数为空。
然后查看了一下cities的Class类型,发现是struts2自定义的继承自ArrayList的XWorkList类。只有将setCities方法的参数以及User的cities属性均修改为XWorkList才能完成注入。
确实挺奇葩的!关键在于从jsp页面提交过来的是一个struts2自定义类型的对象,这就比较麻烦了。所以在开发中尽量简化jsp页面中表单的形式,一方面简洁明了,另一方面也便于struts2注入。