struts2 向action提交list
1. 基本原理
在action里面定义
private List<String> list=new ArrayList<String>();
页面写上
<input type="text" name="list[0]"/>
<input type="text" name="list[1]"/>
<input type="text" name="list[2]"/>
那么提交过去就是3个元素的list了
如果list里面是自己的类
可以这样
private List<User> users;
在页面这样
<input type="text" name="users[0].name" value="aaa" />
<input type="text" name="users[1].name" value="bbb" />
就可以了。
注:这种方法存在一个问题,就是list的控制是手动控制的,如果为null就会引发异常。但是个是简单的示例,下面用iterator标签控制数据的加载,并为action获取数据做保证。
2. 实现方法
Struts2中支持使用List在页面和Action之间直接传递表格数据。下面是一个示例:
public class Person {
int id;
String name;
int age;
float height;
}
这是一个POJO,getter和setting省略了。
action中可以这样使用:
public class MyAction {
public List getPeopleList() { … }
public void setPeopleList( List peopleList ) { … }
…
}
在我们使用Person类之前,需要添加一个配置文件,MyAction-conversion.properties,把这个文件和MyAction放在一起。
这个文件里只有一行内容:
Element_peopleList=Person
前缀Element_是一个常量,表明等号左边的表达式中跟在这个常量后面的是Action类中一个List类型的字段名。
等号右边的表达式是全类名(包含package)
下面是一个页面的代码片段:
<s:form action="update" method="post" >
<s:iterator value="peopleList" status="stat">
<s:hidden
name="peopleList[%{#stat.index}].id"
value="%{peopleList[#stat.index].id}"/>
<s:textfield label="Name"
name="peopleList[%{#stat.index}].name"
value="%{peopleList[#stat.index].name}"/>
<s:textfield label="Age"
name="peopleList[%{#stat.index}].age"
value="%{peopleList[#stat.index].age}" />
<s:textfield label="Height"
name="peopleList[%{#stat.index}].height"
value="%{peopleList[#stat.index].height}"/>
<br/>
s:iterator>
<s:submit value="Update"/>
s:form>
使用这段代码,Struts2会创建一个Person类的ArrayList,并且用setPersonList这个方法把页面表格中的值传递回Action。
如果你是想从用户界面中动态创建列表值,需要允许Struts2给列表中类的实例。那么在配置文件MyAction-conversion.properties中添加一行:
CreateIfNull_peopleList = true
1 楼 艳沐石 2011-04-15 关于转换器(Conversion)
特定类型的转换器配置文件(局部转换):PointAction-conversion.properties,做法是:
在该Action类的包中添加一个格式为“类名-conversion.properties”的配置文件,并在其中加入“待
转换的属性的名字=转换器类的全名”对,即待转换类型的具体属性=转换器类的全名。
全局类型转换配置文件:xwork-conversion.properties(名称唯一,不可更改)
其下内容为“待转换属性的类的全名=转换器的全名”对
应用转换器的流程(个人 理解):
客户端把请求参数(a)传给struts2.0控制器FilterDispatcher,根据配置文件struts.xml相关配置
找到相关Action(b),流程转到该Action(b),生成该Action的一个实例(c)。该实例(c)根据JSP页面
的name属性(d)得到Action类(b)的相关属性(e)的值,通过该属性(e)的set方法进行赋值。但在对每一
个属性(e)赋值之前要检查该属性(e)有没有自定义的类型转化,如果没有,按照自己默认的行为进行类型转化。
如果有该属性(e)自定义好的类型转化,则根据xx-conversion.properties里的内容进行转化,
(“待转换的属性的名字=转换器类的全名”对)根据=号左面的值确定要转化的属性(或该属性所在的类)(e),
根据=号右面的值确定用哪一个转化类(f)来进行属性(e)的转化,此时流程跳转到该转化类(f)。在此类(f)中,
首先判断转化方向,如果是从客户端转化(String数组)到服务器端(对象),则进行相关步骤后返回一个对象(g)
给该Action(b),通过Action类(b)的待转化属性(e)的set方法,把转化类(f)返回的对象(g)赋值给该属性(e)。
至此,从客户端提交给Action的参数(a)完成了类型转化和赋值。接着执行Action(b)的主方法(默认的是execute()方法),
并返回一个字符串(String)。接着根据struts.xml ..<action>的<result/>的相关配置,转到相应的页面。
在该页面显示相应的内容:但在每显示一个属性时,从Action里调用get方法,得到相关属性的值并显示。但在输出相关属性值的时候,
要检查该页面属性有没有自定义的类型转化。发现有,流程转到转化类,执行数据从服务器端转化到客户端的方法,并返回一个字符串(String),
并直接赋值给该页面属性。
package class org.apache.struts2.util;
public abstract StrutsTypeConverter extends DefaultTypeConverter{}
整个类有public Object convertFromString(Map context, String[] values, Class toClass) 方法
和public String convertToString(Map context, Object o) 方法。
前者表示是客户端数据(String类型)转化为服务器端对象(Object对象)。
后者表示服务器端对象(Object对象)转化为客户端数据(String类型)。