请求数据自动封装:
实现原理:参数拦截器
< interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
方式1:jsp表单数据填充到action中的属性
register.jsp:
<form action="${pageContext.request.contextPath}/user_register.action" method="post">
用户名:<input type="text" name="name"><br/>
密码:<input type="text" name="pwd"><br/>
年龄:<input type="text" name="age"><br/>
生日:<input type="text" name="birth"><br/>
<input type="submit" value="注册">
</form>
UserAction类:
public class UserAction{
//封装请求数据
private String name;//必须给set方法,get方法可以先不给
private String pwd;
private int age;
private Date birth;
public void setName(String name) {
this.name = name;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public void setAge(int age) {
this.age = age;
}
public void setBirth(Date birth) {
this.birth = birth;
}
//处理注册请求
public String register(){
System.out.println(name);
System.out.println(pwd);
System.out.println(age);
System.out.println(birth);
return "success";
}
}
方式2:jsp表单数据填充到action的对象中的属性
register.jsp:
<form action="${pageContext.request.contextPath}/user_register.action" method="post">
用户名:<input type="text" name="user.name"><br/>
密码:<input type="text" name="user.pwd"><br/>
年龄:<input type="text" name="user.age"><br/>
生日:<input type="text" name="user.birth"><br/>
<input type="submit" value="注册">
</form>
User类:
public class User {
private String name;
private String pwd;
private int age ;
private Date birth;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
UserAction类:
public class UserAction{
//封装请求数据
private User user;//必须给set方法,get方法可以先不给
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//处理注册请求
public String register(){
System.out.println(user.getName());
System.out.println(user.getPwd());
System.out.println(user.getAge());
System.out.println(user.getBirth());
return "success";
}
}
类型转换:
Struts中,jsp提交的数据Struts自动转换为action中属性的类型,对于基本数据类型以及日期类型会自动转换。
日期类型只支持yyyy-MM-dd格式。如果需要其他类型,需要自定义类型转换器:
- 局部类型转换器
- 全局类型转换器
Struts转换器API:
|--TypeConverter 转换器接口。
|-- DefaultTypeConverter 默认类型转换器类
|--StrutsTypeConvetter 用户编写的转换器,继承此类即可
局部类型转换器:
转换器开发步骤:
- 写转换器类
- 配置转换器类(告诉struts应用自己的转换器类)
–>在同包的action目录下,新建一个properties文件
–>命名规则:ActionClassName-conversion.properties
举例:cn.jjs.d_type.UserAction-conversion.properties - 内容
user.birth=转换器类全路径(cn.jjs.d_type.MyConverter) - 总结:
转换器能否给其他action用?不能。
全局类型转换器
- 需要写一个转换器给所有的action使用!
- 配置全局类型转换器:
—>src/xwork-conversion.properties
—>内容
:java.util.Date=cn.jjs.d_type.MyConverter
全局转换器:
//自定义类型转换器
public class MyConverter extends StrutsTypeConverter {
//新需求:要求我的项目中支持的格式有很多,如:yyyy-MM-dd/yyyyMMdd/yyyy年MM月dd日
//先定义项目中支持的转换格式
DateFormat[] df = {
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyyMM-d"),
new SimpleDateFormat("yyyy年MM月dd日")
};
/**
* 把String转换为指定的类型
* @param context 当前上下文环境
* @param values jsp表单提交的字符串值
* @param toClass 要转化为的目标类型
* @return
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
//判断
if(values ==null || values.length == 0){//判断内容不能为空
return null;
}
//判断类型必须为Date
if(Date.class!=toClass){
return null;
}
//迭代,转化失败就继续下一个格式的转换,转化成功就直接返回
for(int i=0;i<df.length;i++) {
try {
return df[i].parse(values[0]);
} catch (ParseException e) {
continue;
}
}
return null;
}
@Override
public String convertToString(Map map, Object o) {
return null;
}
}