Action接受页面的请求参数,有两种类型模型驱动、属性驱动,可以分为三种方式
1、Action自身作为model对象,使用setter封装页面参数(属性驱动)
jsp
<form action="${pageContext.request.contextPath }/demo05/param1.action" method="post">
文本<input type="text" name="username" /><br/>
多选
<input type="checkbox" name="programmes" value="C" />C
<input type="checkbox" name="programmes" value="Java" />Java
<input type="checkbox" name="programmes" value="C++" />C++
<br />
<input type="submit" value="提交" />
</form>
Action类,为Action类中的属性提供setter(),页面的属性名必须与其对应,这种方式把Action本身看作为model,但不能把Action对象传递到Service、DAO层,所有要对页面参数手动封装到JavaBean中
public class ParamAction1 extends ActionSupport {
private String username;
private String[] programmes;
@Override
public String execute() throws Exception {
System.out.println(username);
System.out.println(Arrays.toString(programmes));
return NONE;
}
public void setUsername(String username) {
this.username = username;
}
public void setProgrammes(String[] programmes) {
this.programmes = programmes;
}
}
struts配置
<package name="demo05" namespace="/demo05" extends="struts-default"> <action name="param1" class="demo05.ParamAction1"> </action> </package>
2、创建独立的model对象(属性驱动)
jsp,参数的name属性要和action中model对象的名称对应
<form action="${pageContext.request.contextPath }/demo05/param2.action" method="post">
文本<input type="text" name="param.username" /><br/>
多选
<input type="checkbox" name="param.programmes" value="C" />C
<input type="checkbox" name="param.programmes" value="Java" />Java
<input type="checkbox" name="param.programmes" value="C++" />C++
<br />
<input type="submit" value="提交" />
</form>
Action,为页面参数创建独立的model对象ParamBean,为其提供getter、setter属性,当封装第一参数时创建ParamBean,需要setter(),封装第二个参数是时需要getter()所以这两个方法都需要
public class ParamAction2 extends ActionSupport {
private ParamBean param;
@Override
public String execute() throws Exception {
System.out.println(param);
return NONE;
}
public ParamBean getParam() {
return this.param;
}
public void setParam(ParamBean param) {
this.param = param;
}
}
这种参数的请求封装有拦截器自动完成
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
model
public class ParamBean {
private String username;
private String[] programmes;
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String[] getProgrammes() {
return this.programmes;
}
public void setProgrammes(String[] programmes) {
this.programmes = programmes;
}
@Override
public String toString() {
return "ParamBean [username=" + this.username + ", programmes=" + Arrays.toString(this.programmes) + "]";
}
}
配置
</action> <action name="param2" class="demo05.ParamAction2"> </action>
3、使用ModelDriven接口(模型驱动)
jsp,那么属性要和model中的属性对应
<form action="${pageContext.request.contextPath }/demo05/param3.action" method="post">
文本<input type="text" name="username" /><br/>
多选
<input type="checkbox" name="programmes" value="C" />C
<input type="checkbox" name="programmes" value="Java" />Java
<input type="checkbox" name="programmes" value="C++" />C++
<br />
<input type="submit" value="提交" />
</form>
action,时间ModelDriven接口,该接口的泛型就是model对象,覆写getModel(),model对象需要在Action中手动为其初始化
public class ParamAction3 extends ActionSupport implements ModelDriven<ParamBean> {
private ParamBean param = new ParamBean();;
@Override
public String execute() throws Exception {
System.out.println(param);
return NONE;
}
@Override
public ParamBean getModel() {
return param;
}
}
这种方式也使用了拦截器
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
struts配置
<action name="param3" class="demo05.ParamAction3"> </action>
Action充当model这种方式不会使用,第二种方式更为灵活,可以在Action中创建多个model对象,ModelDriven这种形式接受页面参数时只能使用一种model对象,但可以使用针对ModeDriven的拦截器特性
4、封装数据到Collection类型
jsp
<form action="${pageContext.request.contextPath }/demo05/param4.action" method="post">
名称<input type="text" name="list[0].name" /><br/>
价格<input type="text" name="list[0].price" /><br/>
<br />
名称<input type="text" name="list[1].name" /><br/>
价格<input type="text" name="list[1].price" /><br/>
<input type="submit" value="提交" />
</form>
Action,ProductBean必须有无参构造方法,页面使用list[index].field这种方式
public class ParamAction4 extends ActionSupport {
List<ProductBean> list;
@Override
public String execute() throws Exception {
System.out.println(list);
return NONE;
}
public List<ProductBean> getList() {
return this.list;
}
public void setList(List<ProductBean> list) {
this.list = list;
}
}
srtus配置
<action name="param4" class="demo05.ParamAction4"> </action>
5、封装数据到Map
jsp,页面封装数据是需要设置key值,使用['key']的方式设置
<form action="${pageContext.request.contextPath }/demo05/param5.action" method="post">
名称<input type="text" name="map['one'].name" /><br/>
价格<input type="text" name="map['one'].price" /><br/>
<br />
名称<input type="text" name="map['two'].name" /><br/>
价格<input type="text" name="map['two'].price" /><br/>
<input type="submit" value="提交" />
</form>
Action
public class ParamAction5 extends ActionSupport {
Map<String, ProductBean> map;
@Override
public String execute() throws Exception {
System.out.println(map);
return NONE;
}
public Map<String, ProductBean> getMap() {
return this.map;
}
public void setMap(Map<String, ProductBean> map) {
this.map = map;
}
}
配置
<action name="param5" class="demo05.ParamAction5"> </action>