スポンサードリンク


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

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

    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です。

     

    スポンサードリンク

     

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

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

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

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

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

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

     

    2.StringJoinerを使う

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

     

    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を使う(応用編)

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

     

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

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

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

     

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

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

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

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

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

     

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

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

      The following two tabs change content below.
      よっき プロフィール画像
      パソコンが大好きな青年。職業はプログラマ/SE。 フリーランスとしてウェブサイトの構築・保守の業務に従事。専門学校とパソコンスクールで講師も担当。幼少期からパソコンが大好きで、趣味がそのまま仕事に転じた。自作PCの魅力に惹かれたのは学生時代の頃。自作PC専門ブログで、お得な情報を紹介しています。

      スポンサードリンク


      コメントを残す




      CAPTCHA


      このページの先頭へ