Struts2 - カスタム型変換
struts2は、カスタム型変換を提供している。
リクエストパラメータ「alex,20」 をuser.name=alex,user.age=20のuserオブジェクトへ変換可能。
カスタム型変換実装手順
・型変化クラス定義 : TypeConverterのIFの実現する。 OGNLプロジェクトでは、TypeConverterの実現としてDefaultTyepConverter.javaがある。
package lee.conversion; import java.util.Map; import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter; import dto.User; public class UserConverter extends DefaultTypeConverter { @Override public Object convertValue(Map context, Object value, Class toType) { // Userクラスの場合 // 双方向変換のため、String.class ⇒ User.class , User.class ⇒ STring.class両方実装が必要 if (toType == User.class) { // 配列 String[] params = (String[]) value; User user = new User(); user.setName(params[0].split(",")[0]); user.setPass(params[0].split(",")[1]); return user; } else if (toType == String.class) { User user = (User) value; return "<" + user.getName() + "," + user.getPass() + ">"; } return null; } }
・変換クラス配置
配置範囲
- ローカル : 指定Actionで有効 (
= ⇒ 例: user=org.package.UserConverter) - グローバル : 全てのActionで有効(xwork-conversion.properties ⇒ org.package.User=org.package.UserConverter)
- Annotation : annotation指定Actionで有効
xwork-conversion.properties
dto.User=conversion.UserConverter
package action; import com.opensymphony.xwork2.ActionSupport; import dto.User; public class LoginAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String execute() throws Exception { System.out.println(user.getName() + " - " + user.getPass()); return "success"; } }
package dto; public class User { private String name; private String pass; public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setPass(String pass) { this.pass = pass; } public String getPass() { return this.pass; } }
login-input.jsp
<%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>カスタム型変換</title> </head> <body> <s:form action="login"> <s:textfield name="user"/> <s:submit key="login"/> </s:form> </body> </html>
login-success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <s:property value="user"/> </body> </html>
StrutsTypeConverter抽象クラス
- DefaultTypeConverterのサブクラス
- converFromString(Map context, String[] values, Class toClass)
- convertToString(Mapcontext, Object obj)
package converter; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; public class UserConverter extends StrutsTypeConverter { // String ⇒ Object public Object convertFromString(Map context, String[] values, Class toClass) { User user = new User(); String[] userValues = values[0].split(","); user.setName(userValues[0]); user.setPass(userValues[1]); return user; } // Object ⇒ String public String convertToString(Map context, Object o) { User user = (User) o; return "<" + user.getName() + "," + user.getPass() + ">"; } }