スポンサードリンク


楽してJava8でクエリ文字列を生成し組み立てる方法!リダイレクト先にGET関数でリファラーを引き継ぐ裏技!

Java リファラー情報 引き継ぎ

URLのクエリを動的に制御するなら、連想配列などを活用して綺麗にプログラムをコーディングしたいものです。

というのもリファラー情報を画面遷移先のページにも引き継ぎたい場合、
クエリ要するにGET関数をidとvalueを取得してURLにセットする必要があります。

URLのクエリとは?

http://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です。

 

スポンサードリンク

 

StringBuilderというクラスでも実現できるが・・・

ちなみにStringBuilderというクラスでも同じことができますが、
確かStringBuilderはStringBufferの継承クラスなだけで、わざわざ使う必要がないです。

というのもStringBuilderと比べて処理速度が遅いです。
継承しているわけですし当たり前と言えば当たり前。

とはいっても大差はほぼないといっても良いでしょう。

ですが、数万、数十万ループ処理に使うとなるとわずかに差が出るのでStringBufferを推奨します。

間違っていたらすみません。

 

2.StringJoinerを使う

StringJoinerはaddした文字列に対してその間に、コンストラクタ引数に区切り文字として定義するクラス。

 

PHPでいうとimplode関数のようなもので、
文字列の配列を区切り文字を付加して1つの文字列に連結していくイメージになります。

但し、動的にadd関数に追加した文字列を連結していく仕組みなのでその点では異なりますね。

 

クエリ部だけで「”&”」を区切り文字として文字列を生成し、
http://から始まるパスに対して最終的に「”?”」を区切り文字としてURLを生成します。

 簡素的なイメージ

String path = “http://jisakupc-technical.info/”

Map<String, String> map = {“seach” : “Java”, “sortType” : “asc”};

 

StringJoiner query = “search=Java” + “&”“sortType=asc”

StringJoiner url = “http://jisakupc-technical.info/” + “?”“search=Java&sortType=asc”

 

3.StringJoinerを使う(応用編)

もっと楽しようぜ!ということで簡易型をご用意。

 

StringJoinerクラスの特性を有効利用し、
2番目のソースコードよりも行数を削減してコーディングしました。

でもやっていることは基本同じです。
インスタンスの引数を1つだけでなく、3つ定義しています。

StringJoinerのインスタンス引数
  • 第一引数は区切り文字の「”&”」。
  • 第二引数は接頭辞。要するに連結した文字列の先頭に入る文字列。
  • 第三引数は接尾辞。要するに連結した文字列の末尾に入る文字列。今回は必要ないので空文字を定義。

 

Javaでリクエストパラメータを連想配列にする方法

今回のサンプルコードでは既に固定でクエリ文字列として
追加したい文字列情報をMapで宣言していました。

アクセスしたURLに対してリクエストパラメータを取得してこのMapに組み込む方法を簡単にご紹介します。

サーブレットではお馴染みのHttpServeretRequestクラスを使います。

リファラー情報が含まれるクエリ文字列も
このクラスに内包されるため、単純に欲しいパラメータを取得するだけでOKです。

 

SAStrutsの記述になってしまいますが、イメージ的には以下のようになります。

あとはご紹介した3つの方法のうち、ひとつを使えばうまくいくと思います。

The following two tabs change content below.
よっき
パソコンが大好きな青年。職業はプログラマ。 幼少期からパソコンが好きで、趣味がそのまま仕事になりました。 主にウェブ系コンテンツの開発が中心です。 自作PCの魅力に惹かれたのは学生時代の頃で、現在に至ります。 自作PC専門ブログで、お得な情報を紹介しています。 趣味はホームページ制作かな。起業を夢見て奮闘中の毎日!

スポンサードリンク


コメントを残す




*

このページの先頭へ