第一种,无实体类,直接用action类来充当实体类:
<form action="${pageContext.request.contextPath}/testform/getform" method="post">
姓名:<input type="text" name="username"/><br>
年龄:<input type="text" name="age"/><br>
生日:<input type="text" name="birthday"/><br>
<input type="submit" value="提交"/>
</form>
package com.dimples.action;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class TestFormAction extends ActionSupport {
private String username;
private Integer age;
private Date birthday;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String justTest() {
System.out.println(username + "===" + age + "===" + birthday);
return SUCCESS;
}
}
注意事项:form表单中的参数名,要和我们的action类中get\set方法对得上,而跟属性名没什么直接联系!
struts2会自动为我们解决post方式的乱码问题,而get方式不解决。
对于日期类型,只认本地格式:yyyy-mm-dd,其他格式不认
对于数组类型,会将各元素以逗号加空格的方式连起来成一个字符串
在我们的action类实例化之后,动作方法调用之前,一个名为params的拦截器帮我们调用了set方法。
第二种:使用OGNL表达式
这是页面的表单
<form action="${pageContext.request.contextPath}/testform/getform2" method="post">
姓名:<input type="text" name="cat.name"/><br>
年龄:<input type="text" name="cat.age"/><br>
生日:<input type="text" name="cat.birthday"/><br>
<input type="submit" value="提交"/>
</form>
这是对应的实体类Cat
package com.dimples.domain;
import java.io.Serializable;
import java.util.Date;
public class Cat implements Serializable {
private String name;
private Integer age;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Cat [name=" + name + ", age=" + age + ", birthday=" + birthday + "]";
}
}
这是动作类:
package com.dimples.action;
import com.dimples.domain.Cat;
import com.opensymphony.xwork2.ActionSupport;
public class TestFormAction2 extends ActionSupport {
private Cat cat;
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public String justTest() {
System.out.println(cat);
return SUCCESS;
}
}
第三种:模型驱动(用的最多)
1、动作类实现ModelDriven接口
2、动作类需要定义一个模型,并且需要实例化
3、提供接口抽象方法的实现,返回值是模型对象
前台页面:
<textarea rows="1" cols="1">第三种参数包装</textarea>
<form action="${pageContext.request.contextPath}/testform/getform3" method="post">
姓名:<input type="text" name="name"/><br>
年龄:<input type="text" name="age"/><br>
生日:<input type="text" name="birthday"/><br>
<input type="submit" value="提交"/>
</form>
实体类同上面第二种
动作类:
package com.dimples.action;
import com.dimples.domain.Cat;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class TestFormAction3 extends ActionSupport implements ModelDriven<Cat>{//实现接口
private Cat cat = new Cat();//实例化一个模型对象
@Override
public Cat getModel() {//实现方法
return cat;
}
public String justTest() {
System.out.println(cat);
return SUCCESS;
}
}
如果是要封装list集合或者map,则只能使用第二种方式,因为集合和map中有多个对象元素,这时候在jsp上写name的时候必须得带上具体对象名称,否则struts2不知道该给你封装到哪个对象里去啊,而三种方式里只有第二种可以带对象名:
<!-- 第四种:集合封装 -->
<form action="${pageContext.request.contextPath}/testform/getform4" method="post">
姓名:<input type="text" name="cats[0].name"/><br>
年龄:<input type="text" name="cats[0].age"/><br>
生日:<input type="text" name="cats[0].birthday"/><br>
姓名:<input type="text" name="cats[1].name"/><br>
年龄:<input type="text" name="cats[1].age"/><br>
生日:<input type="text" name="cats[1].birthday"/><br>
姓名:<input type="text" name="cats[2].name"/><br>
年龄:<input type="text" name="cats[2].age"/><br>
生日:<input type="text" name="cats[2].birthday"/><br>
<input type="submit" value="提交"/>
</form>
<!-- 第五种:map类型封装 -->
<textarea rows="1" cols="1">第五种,map类型封装</textarea>
<form action="${pageContext.request.contextPath}/testform/getform5" method="post">
姓名:<input type="text" name="map['cat1'].name"/><br>
年龄:<input type="text" name="map['cat1'].age"/><br>
生日:<input type="text" name="map['cat1'].birthday"/><br>
姓名:<input type="text" name="map['cat2'].name"/><br>
年龄:<input type="text" name="map['cat2'].age"/><br>
生日:<input type="text" name="map['cat2'].birthday"/><br>
姓名:<input type="text" name="map['cat3'].name"/><br>
年龄:<input type="text" name="map['cat3'].age"/><br>
生日:<input type="text" name="map['cat3'].birthday"/><br>
<input type="submit" value="提交"/>
</form>
动作类分别是:
List集合封装动作类:
public class TestFormAction4 extends ActionSupport {
private List<Cat> cats;public List<Cat> getCats() {return cats;}public void setCats(List<Cat> cats) {this.cats = cats;}public String justTest() {System.out.println(cats);return SUCCESS;}}
Map类封装动作类如下:
public class TestFormAction5 extends ActionSupport {
private Map<String,Cat> map;
public Map<String, Cat> getMap() {
return map;
}
public void setMap(Map<String, Cat> map) {
this.map = map;
}
public String justTest() {
System.out.println(map);
return SUCCESS;
}
}