楽してJava8でクエリ文字列を生成し組み立てる方法!リダイレクト先にGET関数でリファラーを引き継ぐ裏技!
URLのクエリを動的に制御するなら、連想配列などを活用して綺麗にプログラムをコーディングしたいものです。
というのもリファラー情報を画面遷移先のページにも引き継ぎたい場合、
クエリ要するにGET関数をidとvalueを取得してURLにセットする必要があります。
URLのクエリとは?
https://jisakupc-technical.info/?search=自作PC&sortType=asc
上記の黄色いマーカーを引いた部分の事です。
遷移先ページにリクエストパラメータとして送信する際に利用しますね。
HTMLの概念ではdataTypeはGET形式になります。
GoogleやYahooなどの検索結果のページのやたら長いURLもクエリが使われています。
クエリは基本、利用者に対してサーバで送信しているパラメータを明示的に公開したいときに最適です。
逆に言えば見せたくない値まで表示したらセキュリティー的には脆弱になるので注意が必要。
で、私がやりたいのはリファラー情報の引き継ぎ。
サイトのアクセス解析を行ないたいときにこのクエリが重要なんですが、
プログラム上で「リダイレクト処理」などを実装した場合、指定先のURLを記述するだけでは引き継ぎができません。
なのでリダイレクト前に現在のリファラーいわゆるクエリ情報を取得して、
「?」から始まる形式に変換して追記してやらなくてはいけません。
Javaならどうせ、便利なメソッドやクラスがあるだろう、と思い調べましたが残念ながら見つかりませんでした・・・。
クエリ文字列を連想配列で組み立てる方法
いろいろ検討した結果以下の方法にたどり着きました。
- 1.StringBufferを使う
- 2.StringJoinerを使う
- 3.StringJoinerを使う(応用編)
※注意点としてはStringJoinerはJava8以降に対応しています。
StringJoinerがかなり便利だったんですが、
私が使っている開発環境はまだJava7なので、利用できず・・・。
早いところJava8に移行した方がいいんでしょうが、ちょっと悩んでます。
1.StringBufferを使う
一番初歩的に使うであろうクラスがStringBufferです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // クエリ文字列を付加させるURL String url = "https://jisakupc-technical.info/"; // クエリ文字列を連想配列に格納 Map<String, String> map = new HashMap<String, String>(); map.put("search", "Java"); map.put("sortType", "asc"); // クエリ文字列の組み立てとURLと連結 StringBuffer sb = new StringBuffer(url); sb.append("?"); for (Map.Entry<String, String> parameter : map.entrySet()) { sb.append(parameter.getKey()); sb.append("="); sb.append(parameter.getValue()); sb.append("&"); } // 末尾に不要な文字("?" or "&")が残る為消去 url = sb.substring(0, sb.length() - 1); // HttpServletRequestクラスを利用しリダイレクト response.sendRedirect(url); |
StringBuilderというクラスでも実現できるが・・・
ちなみにStringBuilderというクラスでも同じことができますが、
確かStringBuilderはStringBufferの継承クラスなだけで、わざわざ使う必要がないです。
というのもStringBuilderと比べて処理速度が遅いです。
継承しているわけですし当たり前と言えば当たり前。
とはいっても大差はほぼないといっても良いでしょう。
ですが、数万、数十万ループ処理に使うとなるとわずかに差が出るのでStringBufferを推奨します。
間違っていたらすみません。
2.StringJoinerを使う
StringJoinerはaddした文字列に対してその間に、コンストラクタ引数に区切り文字として定義するクラス。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // クエリ文字列を付加させるURL String path = "https://jisakupc-technical.info/"; // クエリ文字列を連想配列に格納 Map<String, String> map = new HashMap<String, String>(); map.put("search", "Java"); map.put("sortType", "asc"); // クエリ部の組み立て処理 StringJoiner query = new StringJoiner("&"); for (Map.Entry<String, String> parameter : map.entrySet()) { query.add(parameter.getKey() + "=" + parameter.getValue()); } // URL部とクエリ部の連結処理 StringJoiner url = new StringJoiner("?"); url.add(path); url.add(query.toString()); // HttpServletRequestクラスを利用しリダイレクト response.sendRedirect(url); System.out.println(url.toString()); |
PHPでいうとimplode関数のようなもので、
文字列の配列を区切り文字を付加して1つの文字列に連結していくイメージになります。
但し、動的にadd関数に追加した文字列を連結していく仕組みなのでその点では異なりますね。
クエリ部だけで「”&”」を区切り文字として文字列を生成し、
http://から始まるパスに対して最終的に「”?”」を区切り文字としてURLを生成します。
String path = “https://jisakupc-technical.info/”
Map<String, String> map = {“seach” : “Java”, “sortType” : “asc”};
StringJoiner query = “search=Java” + “&” + “sortType=asc”
StringJoiner url = “https://jisakupc-technical.info/” + “?” + “search=Java&sortType=asc”
3.StringJoinerを使う(応用編)
もっと楽しようぜ!ということで簡易型をご用意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // クエリ文字列を付加させるURL String path = "https://jisakupc-technical.info/"; // クエリ文字列を連想配列に格納 Map<String, String> map = new HashMap<String, String>(); map.put("search", "Java"); map.put("sortType", "asc"); // クエリ文字列組み立て且つ、URLの連結処理 StringJoiner url = new StringJoiner("&", path + "?", ""); for (Map.Entry<String, String> parameter : map.entrySet()) { url.add(parameter.getKey() + "=" + parameter.getValue()); } // HttpServletRequestクラスを利用しリダイレクト response.sendRedirect(url); System.out.println(url.toString()); |
StringJoinerクラスの特性を有効利用し、
2番目のソースコードよりも行数を削減してコーディングしました。
でもやっていることは基本同じです。
インスタンスの引数を1つだけでなく、3つ定義しています。
- 第一引数は区切り文字の「”&”」。
- 第二引数は接頭辞。要するに連結した文字列の先頭に入る文字列。
- 第三引数は接尾辞。要するに連結した文字列の末尾に入る文字列。今回は必要ないので空文字を定義。
Javaでリクエストパラメータを連想配列にする方法
今回のサンプルコードでは既に固定でクエリ文字列として
追加したい文字列情報をMapで宣言していました。
アクセスしたURLに対してリクエストパラメータを取得してこのMapに組み込む方法を簡単にご紹介します。
サーブレットではお馴染みのHttpServeretRequestクラスを使います。
リファラー情報が含まれるクエリ文字列も
このクラスに内包されるため、単純に欲しいパラメータを取得するだけでOKです。
SAStrutsの記述になってしまいますが、イメージ的には以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class BaseAction() { @Resource HttpServletRequest request; @Execute(validator = false) public String index() { Map<String, String> map = new Map<String, String>(); map.put("search", request.getParameter("search")); map.put("sortType", request.getParameter("sortType")); ResponseUtil.write(JSON.encode(map), "text/plain"); return null; } } |
あとはご紹介した3つの方法のうち、ひとつを使えばうまくいくと思います。
最新記事 by よっき (全て見る)
- 「圧着」と「圧接」の違い!コネクタを使った効率的な配線作業! - 2019年10月26日
- 夏の暑さ対策は大丈夫?冷却性能抜群のおすすめCPUクーラー!メモリに干渉しない最強の商品を紹介! - 2018年5月1日
- 自作PC弐号機のケースを換装!SilverStone製のミニタワーで冷却性とかっこよさを追求! - 2018年3月11日
スポンサードリンク