一、Action生命周期
1.每次请求Action时,都会创建新的 Action实例对象。这与Servlet不同,Servlet只会创建一个,Servlet是单例模式;
2.Action是线程安全的,可以使用成员变量接收参数,而Servlet是线程不安全的。
二、参数获取方式
2.1、属性驱动获取参数
此方式是官方推荐的,现实开发中不用此种方式。
Action准备与参数键同名属性。
例:jsp中表单:
<form action="${pageContext.request.contextPath}/DemoAction1">
用户名:<input type="text" name="name" /><br>
年龄:<input type="text" name="sex"/><br>
生日:<input type="text" name="birthday"/><br>
<input type="submit" value="提交">
</form>
复习下:${pageContext.request.contextPath}是JSP取得绝对路径的方法,等价于<%=request.getContextPath()%>。 也就是取出部署的应用程序名或者是当前的项目名。
DemoAction1.java
package com.zl.struts.action;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class DemoAction1 extends ActionSupport {
//准备与参数键名称相同的属性
//自动类型转换,只能转换为8大基本数据类型以及对应包装类
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 execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("name值:"+name+"age值:"+age+"birthday值"+birthday);
return SUCCESS;
}
}
打印出来的结果不需要类型转化。
2.2、对象驱动获取参数
Action准备与参数键同名属性。xxx.yyy
例子:
创建一个User.java类,添加name、age、birthday三个属性及对应的set、get方法的代码略掉,为了测试,添加一个如下的toString()方法:
public String toString() {
return "User[name="+name+",age"+age+",birthday" +birthday;
}
jsp中添加表单:
<form action="${pageContext.request.contextPath}/DemoAction2">
用户名:<input type="text" name="user.name" /><br>
年龄:<input type="text" name="user.sex"/><br>
生日:<input type="text" name="user.birthday"/><br>
<input type="submit" value="提交">
</form>
DemoAction2.java:
package com.zl.struts.action;
import com.opensymphony.xwork2.ActionSupport;
public class DemoAction2 extends ActionSupport {
//准备user对象
private User user;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(user);
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
2.3、模型驱动获取参数
1.实现ModelDriven接口;
2.实现getModel方法,该方法要返回需要封装参数的对象。
例:
User类同上面的2.2中的User类
jsp同2.1中的jsp表单
DemoAction3.java
package com.zl.struts.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class DemoAction3 extends ActionSupport implements ModelDriven<User>{
//准备与参数键名称相同的属性
//自动类型转换,只能转换为8大基本数据类型以及对应包装类
private User user;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(user);
return SUCCESS;
}
public User getModel() {
return user;
}
}
三、复杂参数封装
3.1、List集合
提交键:list 或 list[index]
例:
前台提交:<input type="text" name="list"/> 表示list中的第一个元素
或: <input type="text" name="list[3]"/> 表示list中的第四个元素,第二、三个没有就是空
后台声明:private List<String> list;
3.2、Map集合:
提交键:map['key']
例:
前台提交:<input type="text" name="map['name']"> 需要指定键名,这里指定的键名为name
后台声明:private Map<String,String> map;