1. Giới thiệu
Trong các framework MVC, việc xử lý dữ liệu từ phía client thường yêu cầu chuyển đổi kiểu dữ liệu. Ví dụ, khi một form được gửi từ JSP, tất cả dữ liệu đều là chuỗi (string), nhưng chúng ta cần chuyển đổi thành kiểu dữ liệu phù hợp (như int, Date, etc.) để sử dụng trong Java, một ngôn ngữ có kiểm soát kiểu dữ liệu mạnh.
1.1 Tại sao cần chuyển đổi kiểu?
Chuyển đổi kiểu dữ liệu giúp đảm bảo rằng dữ liệu từ client được xử lý đúng cách và gán vào các thuộc tính của đối tượng trong ứng dụng. Ví dụ, nếu bạn nhận một ngày từ form, bạn cần chuyển đổi nó từ chuỗi sang kiểu Date.
1.2 Giới thiệu về Converter
Converter trong Struts2 có thể được tạo bằng cách kế thừa từ lớp DefaultTypeConverter hoặc StrutsTypeConverter. Lớp DefaultTypeConverter cung cấp phương thức convertValue để thực hiện chuyển đổi, trong khi StrutsTypeConverter cung cấp hai phương thức: convertFromString và convertToString.
2. Chuyển đổi kiểu dữ liệu
Có hai loại converter: converter cục bộ và converter toàn cục. Converter cục bộ chỉ áp dụng cho một action cụ thể, trong khi converter toàn cục áp dụng cho tất cả các action.
2.1 Converter cục bộ
Ví dụ về một converter cục bộ:
package com.TypeConverter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
public class TestType extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {
if (toType == UserBean.class) {
String[] params = (String[]) value;
UserBean user = new UserBean();
user.setUname(params[0]);
user.setUpwd(params[1]);
user.setUage(Integer.parseInt(params[2]));
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
user.setUdate(format.parse(params[3]));
} catch (ParseException e) {
e.printStackTrace();
}
return user;
} else if (toType == String.class) {
UserBean user = (UserBean) value;
return "<" + user.getUname() + ">";
}
return null;
}
}
Để sử dụng converter này, bạn cần tạo tệp properties với tên ActionName-conversion.properties và đặt nội dung sau:
userbean1=com.TypeConverter.TestType
2.2 Converter toàn cục
Ví dụ về một converter toàn cục:
package com.TypeConverter.global;
import java.util.Map;
import org.apache.struts2.util.StrutsTypeConverter;
public class GlobalTypeConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
StuBean stu = new StuBean();
stu.setUname(values[0]);
stu.setUage(Integer.parseInt(values[1]));
return stu;
}
@Override
public String convertToString(Map context, Object o) {
StuBean s = (StuBean) o;
return s.getUname() + "!!";
}
}
Để sử dụng converter này, bạn cần tạo tệp properties với tên xwork-conversion.properties và đặt nội dung sau:
com.TypeConverter.global.StuBean=com.TypeConverter.global.GlobalTypeConverter
Tệp này nên được đặt trong thư mục classes.