質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

  • Java

    14437questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • HTML

    9592questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • jQuery

    7115questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • Spring

    737questions

    Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

  • データベース

    735questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ajax非同期でラジオボタンやチェックボックスでの条件検索を組み合わせたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 643
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

Spring bootで、データベースのデータを表示させ、非同期で絞り込んで検索が出来るサイト製作をしております。
現状だとラジオボタン、チェックボックス、ソートボタン、選択をリセットするボタンをそれぞれ非同期で実装できたのですが、それぞれが独立しており、ラジオボタン+チェックボタンで細かい検索が出来ない状態です。
ソートボタンも同じく、ラジオボタンやチェックボックスで絞り込んだ後にソートボタンを押しても、検索結果をソートするのではなく、データベースの全てのデータをソートして表示してしまいます。
ラジオボタンとチェックボックスを組み合わせて検索したり、検索結果からソートできるようにするにはどうしたらいいでしょうか?

 該当のソースコード

<body>
   <h1>
       <a href="index.html">ラーメン店検索</a>
   </h1>
   <hr />
   <p class="pagetop"><a href="#wrap">トップへ戻る</a></p>
   <div id="form">
       <div class="filter-taste">
           <label></label> <br /> <input type="radio" name="rd" value="醤油"
               id="chk01" /><label for="chk01">醤油</label> <input type="radio"
               name="rd" value="塩" id="chk02" /><label for="chk02"></label> <input
               type="radio" name="rd" value="味噌" id="chk03" /><label for="chk03">味噌</label>
           <input type="radio" name="rd" value="とんこつ" id="chk04" /><label
               for="chk04">とんこつ</label> <input type="radio" name="rd" value="エビ"
               id="chk05" /><label for="chk05">エビ</label>
       </div>
       <br /><br/>
       <div class="filter-place">
           <label>場所</label> <br />
           <input type="checkbox" name="place" value="東京都" id="1" /><label for="1">東京都</label>
           <input type="checkbox" name="place" value="埼玉県" id="2"/><label for="2">埼玉県</label>
           <input type="checkbox" name="place" value="千葉県" id="3"/><label for="3">千葉県</label><br/>
           <input type="checkbox" name="place" value="神奈川県" id="4"/><label for="4">神奈川県</label>
           <input type="checkbox" name="place" value="栃木県" id="5"/><label for="5">栃木県</label>
           <input type="checkbox" name="place" value="茨城県" id="6"/><label for="6">茨城県</label>
           <input type="checkbox" name="place" value="群馬県" id="7"/><label for="7">群馬県</label>
       </div>
       <br/><br/>
       <input type="button" name="priceSort" value="最低価格安順" />
       <input type="button" name="priceSort2" value="最低価格高順" />
       <br/><br/>
       <input type="button" name="reset" value="リセット" />
       <form method="get" th:action="index" th:object="${searchForm}">
           <div class="keyword"><br/>
               <label>キーワード</label> <input name="keyword" type="text" maxlength="32"
                   th:field="*{keyword}" /> <input class="button" type="submit"
                   value="検索" />
           </div>
       </form>
   </div>
   <div id="recordList">
       <th:block th:each="record : ${recordList}" th:object="${record}">
           <div class="item">
               <div class="name">
                   <label>店名:</label> <a th:href="*{url}" target="_blank"
                       th:text="*{name}">店名</a>
               </div>
               <br />
               <div class="taste">
                   <label>味:</label> <span th:text="*{taste}"></span>
               </div>
               <br />
               <div class="place">
                   <label>場所:</label> <span th:text="*{place}">場所</span>
               </div>
               <br />
               <div class="price">
                   <label>最低価格:</label> <span th:text="*{price}">値段</span>
               </div>
               <br />
               <div class="imgpass">
                   <img th:src="*{imgpass}"></img>
               </div>
           </div>
       </th:block>
   </div>
</body>
$(function() {
 // ラジオボタンにチェックしたら発動
 $('input[name="rd"]').click(function() {
   var JSONdata ={keyword:$('input[name="rd"]:checked').val()};
   $.ajax({
       headers: {
           'Accept': 'application/json',
           'Content-Type': 'application/json'
       },
       url:'taste',
       type:'POST',
       dataType:'json',
       contentType:"application/json",
       data:JSON.stringify(JSONdata),
       success:function(result){
           function viewMessages(result){
           $('#recordList').empty();
           for (var index in result){
               $('#recordList').append('<div class="item">'+
                       '<div class="name">店名: <a href=' + result[index].url + ' target="_blank">'+ result[index].name + '</a></div><br/>' +
                       '<div class="taste"><span>味: ' + result[index].taste + '</span></div><br/>' +
                       '<div class="place"><span>場所: ' + result[index].place + '</span></div><br/>' +
                       '<div class="price"><span>値段: ' + result[index].price + '</span></div><br/>' +
                       '<div class="imgpass"><img src='+ result[index].imgpass + '></img></div></div><br/>');
               }
           }
           viewMessages(result);
       }
   });
 });
//チェックボックスを選択したら発動
 $('input[name="place"]').click(function() {
     var sendList = {};
     var sendObj = [];
     $('input[name="place"]:checked').each(function(i){
         sendObj.push($(this).val());
     });
     sendList["places"] = sendObj;
   $.ajax({
       headers: {
           'Accept': 'application/json',
           'Content-Type': 'application/json'
       },
       url:'place',
       type:'POST',
       dataType:'json',
       contentType:"application/json",
       data:JSON.stringify(sendList),
       success:function(result){
           function viewMessages(result){
           $('#recordList').empty();
           for (var index in result){
               $('#recordList').append('<div class="item">'+
                       '<div class="name">店名: <a href=' + result[index].url + ' target="_blank">'+ result[index].name + '</a></div><br/>' +
                       '<div class="taste"><span>味: ' + result[index].taste + '</span></div><br/>' +
                       '<div class="place"><span>場所: ' + result[index].place + '</span></div><br/>' +
                       '<div class="price"><span>値段: ' + result[index].price + '</span></div><br/>' +
                       '<div class="imgpass"><img src='+ result[index].imgpass + '></img></div></div><br/>');
               }
           }
           viewMessages(result);
       }
   });
 });
 //ソートボタンを押したら発動
 $('input[name="priceSort"]').click(function() {
       $.ajax({
           headers: {
               'Accept': 'application/json',
               'Content-Type': 'application/json'
           },
           url:'priceSort',
           type:'POST',
           dataType:'json',
           contentType:"application/json",
           success:function(result){
               function viewMessages(result){
               $('#recordList').empty();
               for (var index in result){
                   $('#recordList').append('<div class="item">'+
                           '<div class="name">店名: <a href=' + result[index].url + ' target="_blank">'+ result[index].name + '</a></div><br/>' +
                           '<div class="taste"><span>味: ' + result[index].taste + '</span></div><br/>' +
                           '<div class="place"><span>場所: ' + result[index].place + '</span></div><br/>' +
                           '<div class="price"><span>値段: ' + result[index].price + '</span></div><br/>' +
                           '<div class="imgpass"><img src='+ result[index].imgpass + '></img></div></div><br/>');
                   }
               }
               viewMessages(result);
           }
       });
     });
 $('input[name="priceSort2"]').click(function() {
       $.ajax({
           headers: {
               'Accept': 'application/json',
               'Content-Type': 'application/json'
           },
           url:'priceSort2',
           type:'POST',
           dataType:'json',
           contentType:"application/json",
           success:function(result){
               function viewMessages(result){
               $('#recordList').empty();
               for (var index in result){
                   $('#recordList').append('<div class="item">'+
                           '<div class="name">店名: <a href=' + result[index].url + ' target="_blank">'+ result[index].name + '</a></div><br/>' +
                           '<div class="taste"><span>味: ' + result[index].taste + '</span></div><br/>' +
                           '<div class="place"><span>場所: ' + result[index].place + '</span></div><br/>' +
                           '<div class="price"><span>値段: ' + result[index].price + '</span></div><br/>' +
                           '<div class="imgpass"><img src='+ result[index].imgpass + '></img></div></div><br/>');
                   }
               }
               viewMessages(result);
           }
       });
     });
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2018/05/31 12:05

    いや、システムメッセージっぽく書いてるけど、こんなの出てこないから。編集履歴から丸わかりだから。

    キャンセル

  • 退会済みユーザー

    2018/05/31 14:28

    複数のユーザーから「意図的に内容が抹消された質問」という意見がありました
    解決後に編集機能を用いて質問内容を改変し関係のない内容にしたり、内容を削除する行為は禁止しています。
    投稿していただいた質問は、後に他の誰かが困ったときに助けになる情報資産になると考えるからです。
    「質問を編集する」ボタンから編集を行い、他のユーザにも質問内容が見えるように修正してください。

回答 1

+1

まずは、inputやselectなどのタグを全て <form></form>の中に入れてしまうのが必要かと思います。
そのようにすることで、FormDataとしてすべての条件およびソート条件をまとめたものをサーバーに送ることができます。

以下のformDataをサーバー側のPOSTメソッド index に送るという意味です。

name=rd,name=place,name=priceSort,name=priceSort2,name=keyword

サーバー側のindexに対応するコントローラー側では、送られた全部の条件により検索条件を組み立ててSQL文の発行を行います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 10:45

    サーバー側の検索条件の組み立て方は、サーバー側の実装をどうやっているかによって回答の内容が変わります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14437questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • HTML

    9592questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • jQuery

    7115questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

  • Spring

    737questions

    Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

  • データベース

    735questions

    データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます