Struts 2データタイプ変換のカスタムデータタイプ変換

6873 ワード

前述のように、Java内蔵のint StringやDateなどに対しては、strutsがデータの変換を完了するのに役立ちますが、カスタムタイプに対しては、手動で変換方法を実現しなければなりません。
次は自分でUserオブジェクトの変換を実現します。
 
1.まずJava beanをカスタマイズします。package comp.test.beanを建てて、新しいクラスはUserです。
package com.test.bean;

public class User
{
    private String username;
    private String password;
    
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }

}
2.input.jspとoutput.jspを設立する。
inputの内容はフォームです。
<h1>      username password</h1>
    
    <form action="userAction.action">
    
        <input type="text" name="user"> <br>
        <input type="submit" name="submit">
    </form>
out putの内容は:
<s:property value="user"/>
ここではstrutsのカスタムラベルを使用していますので、上から2番目の行には下記のように追加します。
<%@ taglib prefix="s" uri="/struts-tags" %>
3.struts.xmlにルート表を配置する:
<action name="userAction" class="com.test.action.UserAction">
            <result name="success">/output.jsp</result>
        </action>
4.UserActionを作成する:
package com.test.action;

import com.opensymphony.xwork2.ActionSupport;
import com.test.bean.User;

public class UserAction extends ActionSupport
{
    private static final long serialVersionUID = 1L;
    
    private User user;
    
    public User getUser()
    {
        return user;
    }

    public void setUser(User user)
    {
        this.user = user;
    }


    @Override
    public String execute() throws Exception
    {
        System.out.println("username : " + user.getUsername());
        System.out.println("password : " + user.getPassword());

        return SUCCESS;
    }
}
5.以下から本格的な変換を開始します。
新しいpackage comp.test.com nverterの新しいタイプUserCoverterを作成します。
package com.test.converter;

import java.util.Map;
import java.util.StringTokenizer;

import ognl.DefaultTypeConverter;

import com.test.bean.User;

public class UserConverter extends DefaultTypeConverter
{
    @Override
    public Object convertValue(Map context, Object value, Class toType)
    {
        if (User.class == toType) //            User  
        {
            String[] str = (String[]) value;
            String firstValue = str[0];

            StringTokenizer st = new StringTokenizer(firstValue, ";");

            String username = st.nextToken();
            String password = st.nextToken();

            User user = new User();
            user.setUsername(username);
            user.setPassword(password);

            return user;
        }
        else if (String.class == toType)//  User        
        {
            User user = (User) value;

            String username = user.getUsername();
            String password = user.getPassword();

            String userInfo = "username: " + username + ", password: "
                    + password;

            return userInfo;
        }

        return null;
    }
}
私たちのトランスケタ類は、ognlから提供されたDefault Type Coverter類を継承しているように見えます。
6.package converterの下に、新しいファイルを作成します。名前はUserAction-converter.propertiesです。
内容は一行だけです。
user=com.test.converter.UserConverter
UserActionのメンバー変数userを変換するには、comp.test.co nverter.UserCoverterというクラスを使うべきだという意味です。
このファイルの命名規則と大文字と小文字に注意してください。
 
ブラウザを開いて、入力します。
http://localhost:8080/struts2/input.jsp
入力:
ハローワールド
見られます
username:hello,password:world
以下の手順を分析します。
私たちはjspページでハローを入力します。worldの時、バックグランドserverは私達の配置ファイルによってUserActionに渡しますが、このUserは内蔵タイプではないので、UserAction-converter.propertiesという設定ファイルを通じてUser Coverterというクラスを見つけて、文字列をUserオブジェクトに変換します。
 
以下はstruts 2が提供するトランスポンダを採用し、流れを簡略化する。