概要

JEditorPaneに表示されたフォームの送信データを取得し、パーセントエンコーディングされた文字列をデコードします。

サンプルコード

JEditorPane editor = new JEditorPane();
HTMLEditorKit kit = new HTMLEditorKit();
kit.setAutoFormSubmission(false);
editor.setEditorKit(kit);
editor.setEditable(false);

String form = "<form action='#'><input type='text' name='word' value='' /></form>";
editor.setText("<html><h1>Form test</h1>" + form);
editor.addHyperlinkListener(e -> {
  if (e instanceof FormSubmitEvent) {
    String data = ((FormSubmitEvent) e).getData();
    logger.append(data + "\n");

    String charset = Charset.defaultCharset().toString();
    logger.append("default charset: " + charset + "\n");

    try {
      String txt = URLDecoder.decode(data, charset);
      logger.append(txt + "\n");
    } catch (UnsupportedEncodingException ex) {
      ex.printStackTrace();
      logger.append(ex.getMessage() + "\n");
    }
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JEditorPaneに表示されたフォームの送信データをHyperlinkListenerで取得し、application/x-www-form-urlencoded形式でパーセントエンコーディングで符号化された文字列をデコードするテストを行っています。

  • HTMLEditorKit#setAutoFormSubmission(false)htmlフォームの送信を自動的に処理ではなく、FormSubmitEventがトリガーされるように設定してHyperlinkListenerでデータを取得
  • <form>要素にaction='#'のような属性の指定がない場合、NullPointerExceptionが発生する?
  • フォームの送信データはjava -Dfile.encoding=UTF-8 ...などで指定したファイルエンコーディングに基づいてパーセントエンコーディングされている
    • このサンプルではファイルエンコーディングをUTF-8に設定しているが、日本語Windows環境のデフォルトではShift_JIS(windows-31j)のためその範囲外の文字は文字化けする
  • application/x-www-form-urlencoded形式でパーセントエンコーディングされているので半角スペースは%20ではなく+になっている

参考リンク

コメント