読者です 読者をやめる 読者になる 読者になる

PHPの良さである$_GETや$_FILESをJavaで実装する

PHPで開発する際はvar_dumpを連発させてる米村です、こんにちは。


PHPはなんといっても、$_GET, $_POST, $_SESSION, $_FILESあたりが強烈に分かり易さと手軽さを表現してるのではないかと思います。

<?php
$arg1 = $_GET['arg1'];
$_SESSION['arg1'] = $arg1;
$file = $_FILES['file'];

もちろん「?>」の閉じタグはつけないですよね。


Javaで同様の処理を行うと以下のようになり、ファイルアップロードの実装も含めるともっと記述が増えます。

package jp.co.abby.examples;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        String arg1 = request.getParameter("arg1");

        HttpSession session = request.getSession(true);
        session.setAttribute("arg1", arg1);
    }
}

PHPからJavaの開発へ移行する際に

  • PHPだとこんな記述だけどJavaだとどう記述するの?
  • $_SESSIONに値を格納するにはどうするの?
  • $_FILESみたいに簡単にファイルアップロードを処理出来ないの?

と質問された事が何度かあり、簡単に理解してもらう方法は無いかと考えていた時に、PHPの手軽さを見習って$_XXXを取り入れたら分かりやすいんじゃないかという考えに辿り着きました。

$_POSTや$_SESSIONをJavaで実装してみる

そこでT2に$_GETや$_SESSION、$_FILESというPHPの考え方を取り入れてみました。
先日の富山勉強会で紹介してきたのですが、Javaで$_GETや$_FILESというクラスを作成するのです。

$_GET.java
public class $_GET {
    @SuppressWarnings("unchecked")
    public static <T> T get(String key) {
        T ret = null;
        String[] params = WebContextUtil.getRequest().getParameters(key);
        if (params != null && params.length == 1) {
            ret = (T) params[0];
        } else {
            ret = (T) params;
        }
        return ret;
    }
}

このようなクラスをうまく利用する事によりT2では、$_GETや$_SESSIONおよび$_FILESを利用可能です。

php.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>PHPのようなサンプル</title>
</head>
<body>
<form action="/t2-samples/php" method="post" enctype="multipart/form-data">
  <input type="file" name="aaa" /><br />
  <input type="submit" name="upload" value="アップロード"/>
</form>
<form action="/t2-samples/php/execute" method="get">
  <input type="text" name="arg1" /><br />
  <input type="submit" name="go" value="GO"/>
</form>
</body>
</html>

T2はマルチビューを処理出来るので今回は手軽に試せるようにHTMLを用意しました。htmlファイルとJavaクラスを用意するだけで手軽に$_GET等が試せます。
htmlには1つの入力項目と1つのファイルアップロードがあり、対応するPageクラスは以下のとおりです。

PhpPage.java
@Page("/php")
public class PhpPage {

    protected static Logger logger = Logger.getLogger(PhpPage.class);

    // 初期表示
    @Default
    public Navigation index() {
        return Forward.to("/html/php.html");
    }

    // GOサブミットボタンが押された場合
    @GET
    @ActionPath
    public Navigation execute() {
        String arg1 = $_GET.get("arg1"); // $_GET使用
        logger.debug("arg1 : {}", arg1);
        $_SESSION.put("arg1", arg1); // $_SESSION使用
        
        return Forward.to("/html/php.html");
    }

    // アップロードボタンが押された場合
    @POST
    @ActionParam
    public Navigation upload() {
        UploadFile file = $_FILES.get("aaa"); // $_FILESでファイルアップロード
        logger.debug("file name: {}, size:{}", file.getName(), file.getSize());

        return Forward.to("/html/php.html");
    }
}

PHPのように手軽にファイルアップロードやリクエストパラメータを処理出来ていると思います。
この$_GET, $_FILES等のサンプルはT2のt2-samplesにあるので動かしてみてください。
Filterで処理すれば、このアイデアと実装はServletの勉強の際や他のJavaフレームワークに組み込めると思います。



記述量を減らすのが目的では無く、Java製の$_POST等を利用してみてJavaでどう実現してるのかに興味を持ってもらうのが狙いです。
便利さの奥にある実装を追いかける事に意味があります。


今後は、私の大好きなvar_dumpや$_ENVを取り入れたいなと思います。
PHP開発者の方でJavaを勉強しようと思ってる方は是非、var_dumpと$_ENVクラスを作って下さい。

enjoy! $_