liguofeng29’s blog

個人勉強用ブログだっす。

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

action,jsp,dto

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>

f:id:liguofeng29:20160307141155g:plain

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() + ">";
    }
}