SAStrutsでActionからJSPに値を渡す

このQ&Aのポイント
  • 勉強して一ヶ月ほどでJSPサーブレットを使った簡単なスケジュールを表示するプログラムを作りました。
  • スケジュール表示で日付で参照し、データベースから取得したスケジュールの日付と合致する場合にリンクを表示するプログラムです。
  • しかし、スクリプトレットで変数として値を受け取る必要があり、現在はその処理がうまくいっていません。
回答を見る
  • ベストアンサー

SAStrutsでActionからJSPに値を渡す

はじめまして、当方駆け出しのプログラマです。 JAVA歴2ヶ月で勉強(研修)させてもらっています。 初歩的な質問かもしれませんが、ご返答いただけると幸いです。 勉強して一ヶ月ほどでJSPサーブレットを使った簡単なスケジュールを表示するプログラムを作りました。環境はEclipse(pleiades3.5)+tomcat6.0+jre1.6+mysql5.5.10です。 これをフレームワークに準拠したつくりに移行してくれと上司の方に言われました。 しかし、私が作ったものは、スケジュール表示で日付で参照し、そこからデータベースからとったスケジュールの日付と合致するものがある場合リンクを表示するというものでした。 このためタグライブラリのC:each等の繰り返しは使えないため、スクリプトレットで変数として値を持ってこないと動作しない状態です。 Stringやint型はrequest.getAttributeでもってこれるのはわかったのですがentityに入っている値を持ってくることが出来ずNullになってしまいます。 ソースはこちらになります。 書き出しで説明すると。 DB接続→値を持ってきてentityにセットする→これらをarrayListに格納→arrayListの中身を日付順にソート→entityの配列に収納する→jspに受け渡し→表示できない。 という状況です。 ScheduleMainはentityでSchedule_mainはDBのテーブルです。arrayの部分で日付順になるようにソートをかけてあります。これは理由があってsql内でソートしていません。 scheduleitemsはScheduleItemsというentityで複数個スケジュールを保管できるように配列をゲッターセッター設置してあります。  Action.java for(int i=0 ; i<schedulemain.size();i++){ ScheduleMain schemain = schedulemain.get(i); int ID = schemain.getId(); String place = schemain.getPlace(); String schedule = schemain.getSchedule(); int empId = schemain.getEmpId(); int category = schemain.getCategory(); int scheCategory = schemain.getScheCategory(); Date scheduleDay = schemain.getScheduleDay(); Time endtime = schemain.getEndtime(); Time starttime = schemain.getStarttime(); schedule_main.setCategory(category); schedule_main.setEmpId(empId); schedule_main.setEndtime(endtime); schedule_main.setId(ID); schedule_main.setPlace(place); schedule_main.setScheCategory(scheCategory); schedule_main.setSchedule(schedule); schedule_main.setScheduleDay(scheduleDay); schedule_main.setStarttime(starttime); array.add(schedule_main); } ScheduleMain[] itembean = (ScheduleMain[])array.toArray(new ScheduleMain[array.size()]); Comparator asc = new Comparator() { public int compare(Object obj0, Object obj1) { String nameKana0 = ((ScheduleMain) obj0).getScheduleDay().toString(); String nameKana1 = ((ScheduleMain) obj1).getScheduleDay().toString(); int ret = 0; // カナの昇順 if ((ret = nameKana0.compareTo(nameKana1)) == 0) { // カナが同じ場合はIDの昇順 String id0 = ((ScheduleMain) obj0).getStarttime().toString().substring(0,5); String id1 = ((ScheduleMain) obj1).getStarttime().toString().substring(0,5); ret = id0.compareTo(id1); } return ret; } }; scheduleitems.setItembean(itembean); jsp側ですが。 ScheduleItems scheduleitems = (ScheduleItems)request.getAttribute("Scheduleitems"); で宣言をし、out.printやlengthをとってもnullExeprionになってしまいます。 enteity部分 ScheduleItems.java package schedule.entity; import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table(name="schedule_main") public class ScheduleItems { public ScheduleMain[] itembean = null; public ScheduleItems(){ } public ScheduleMain[] getItembean() { return itembean; } public void setItembean(ScheduleMain[] itembean) { this.itembean = itembean; } } ScheduleMainは自動生成されるDoltengでDBから生成しました。 entityではだめなのかと思いDtoでも試しましたがやはり同じ症状になってしまいます。 この部分が解決されるだけでかなりの進捗が期待されるのでどうかよろしくお願い致します。 長文失礼しました。よろしくお願い致します。

  • Java
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

scheduleitemsはrequestスコープにセットされていますか? (Actionクラスのpublicなフィールドとして定義してあるか、そうでなければ明示的なセットを行っていますか?) ところで >しかし、私が作ったものは、スケジュール表示で日付で参照し、そこからデータベースからとったスケジュールの日付と合致するものがある場合リンクを表示するというものでした。 >このためタグライブラリのC:each等の繰り返しは使えないため、スクリプトレットで変数として値を持ってこないと動作しない状態です。 とありますが、jstl:if等の条件式で判断は出来ませんか? (とは言え、どれほど軽微であるにせよ、SAStrutsのMVCで開発する以上はJSP中にロジックを埋め込む事はお勧めしませんが) #ScheduleMain自体に@Transientなワーク変数で「リンクか否か」のフラグを持たせる等すれば分離しやすくなりますね。

omegasword
質問者

お礼

返答が遅れ大変申し訳ありません。 アドバイスありがとうございます。 scheduleitems自体はrequest持ってますしpublicに設定してあります。 タグによる呼び出し<c:~等で呼び出しが出来るのですがattribute自体にセットできないので苦労していました。 >>とは言え、どれほど軽微であるにせよ、SAStrutsのMVCで開発する以上はJSP中にロジックを埋め込む事はお勧めしませんが 結局items[32]の配列にsqlで持ってきた情報をつめることによって解決させました。 やはりAction変数を詰め込めるだけ詰め込んで渡すのがスマートなのでしょうかね・・・

その他の回答 (1)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

どこでも request.setAttribute("Scheduleitems", Scheduleitemsクラスのインスタンス); をしていませんが、それは記載していないだけでしょうか? ただ、SAStrutsならsetAttribute、getAttributeで受け渡すこと自体が正しくない気がしますね。 http://sastruts.seasar.org/featureReference.html#JSP こちらは参考になりませんか?

omegasword
質問者

お礼

返答が遅れ大変申し訳ありません。 アドバイスありがとうございます。 やはりELやタグを使うのが一般的のようですね。結局Actionに配列としてその月の情報を詰め込むことで解決しました。 出来ればJSPで作ったとおりに再現したかったので(この時点で横着なのかもしれませんが)残念です。 勉強になりました、ありがとうございました。

関連するQ&A

  • この警告はどうすれば?

    以下のメソッドを含むプログラムをEclipseで作成している際に次のような警告が発生しました。 型の安全性:型Comparator の式は、未検査の型変換を使用してComparator<? super T>に準拠するようにする必要があります。 型の安全性:型 Arrays の総称メソッド sort(T[], Comparator<? super T>)の未検査の呼び出し sort(Object[],Comparator)がありました。 コンパイルして実行する分には、なんら問題ないのですが、この警告の意味と解決策が分からないままにしておくのは気持ち悪いので、分かる方がいらしたら教えてください。 static void sortName(){  String array[] = new String[4];  array[0] = "abba";  array[1] = "abab";  array[2] = "aaaa";  array[3] = "aabb";  Comparator asc = new Comparator() {   public int compare(Object obj0, Object obj1) {    String nameKana0 = (String)obj0;    String nameKana1 = (String)obj1;    int ret = 0;    ret = nameKana0.compareTo(nameKana1);    return ret;  }  };  Comparator comparator = asc;  Arrays.sort(array, comparator); // 配列をソート  for (int i = 0; i < array.length; i++)   System.out.println(array[i]); }

    • ベストアンサー
    • Java
  • StringクラスのcompareToメソッド

    ArrayListに登録した文字列を五十音順にソートしようと思いComparator を使用して 以下のようなサンプルプログラムを作ってみました。 ところが想定していたような {赤ちゃん、富士山、山口県}とはならず {富士山、山口県、赤ちゃん} というような結果になりました。 compare() の戻り値の部分を return ((String)arg1).compareTo((String)arg0); に変更しても{赤ちゃん、山口県、富士山} となり辞書の並びとは異なる結果になりました。 辞書順に並べるにはなにかよい方法はありますでしょうか。 public class compareTest { public static void main(String[] args) { ArrayList<String> array = new ArrayList<String>(); String a = "赤ちゃん"; String b = "山口県"; String c = "富士山"; array.add(a); array.add(b); array.add(c); for(int i=0;i<array.size();i++) { System.out.println("ソート前=" + array.get(i)); } Collections.sort(array, new testComp()); for(int i=0;i<array.size();i++) { System.out.println("ソート後=" + array.get(i)); } } } public class testComp implements Comparator { public int compare(Object arg0, Object arg1) { return ((String)arg0).compareTo((String)arg1); } }

    • ベストアンサー
    • Java
  • jspでの二次元配列

    こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{  public static void main(String args[]) throws IOException{      String csv = "dognum.csv";      BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }

  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • データベースからの値の取得

    create table test (id char(30) not null, pass int not null, primary key (id)); で、作ったデータベースに値を入れ、そこから値を取得して、JSPの方でString型やint型の変数に入れて使いたいのですが、どのようにすればいいのでしょう? JSP側の指定の仕方がわかりません。 String id = ? ; int pass = ? ; ?の所に何を入れれば取得できるのでしょう? または、他に何か書かないとだめなのでしょうか? 省略していますがJSPはデータベースを使用して動いていますので、基本的な動きは問題ないと思います。 MySQLServer4.1を使用しています。 ご存知の方、よろしくお願いします。

    • ベストアンサー
    • Java
  • ArrayクラスとtoStringについて

    問題集で次のプログラムを見掛ました。 public class Main{  public static void main(String args[]){   int[] array = new int[0];   System.out.println(array);  } } これを実行するとprintlnメソッドで toStringメソッドが呼び出されますが、 ArrayクラスはObjectクラスを継承しているため、 toStringメソッドもObjectクラスから継承されているので、 結果として、配列の要素数が0であっても、 エラー等が発生せずハッシュコードが表示される、ということです。 ObjectクラスのtoStringメソッドが ハッシュコードを返すものであるのは理解できます。 でも、なぜ要素数が1以上で何かしらの要素が存在する場合は、 ハッシュコードが返らないのでしょうか? 詳しい方、解説をお願いします。

  • action script 3.0 sort

    ActionScript初心者ですが、宜しければご回答お願いします。 下記スクリプトではtsizeの配列の値のインデックスを比較し、 戻り値として -1 1 0 を得る事ができるのですが、 -1 1 0 の戻り値を処理する工程がわかりません。 trace(alist.sort(tSort)); 上記tSort部分に直接 0 や -1 を記入するとエラーになります。 -1 1 0 の戻り値がどのように処理されているのか教えて頂けませんでしょうか? よろしくお願いします。 var tsize:Array = new Array("SS","S","M","L","LL","XL"); function tSort(a:String, b:String):int { //配列での位置を調べる var indexa:int = tsize.indexOf(a); var indexb:int = tsize.indexOf(b); if (indexa<indexb) { return -1; } else if (indexa>indexb) { return 1; } else { return 0; } } var alist:Array = new Array("LL","M","XL","S","L","SS","M","S"); trace(alist.sort(tSort));

  • php foreach 配列のソート方法

    配列のソート方法の仕方がわからず調べているのですが、なかなかできず困っております。 どなたかご教授お願いいたします。 array(5) { [0]=> array(3) { ["id"]=> string(1) "1" ["size"]=> string(5) "100" ["message"]=> string(7) "テスト1" } [1]=> array(3) { ["id"]=> string(1) "2" ["size"]=> string(5) "200" ["message"]=> string(7) "テスト2" } [2]=> array(3) { ["id"]=> string(1) "3" ["size"]=> string(5) "300" ["message"]=> string(7) "テスト3" } [3]=> array(3) { ["id"]=> string(1) "4" ["size"]=> string(5) "400" ["message"]=> string(7) "テスト4" } [4]=> array(3) { ["id"]=> string(1) "5" ["size"]=> string(4) "500" ["message"]=> string(7) "テスト5" } [5]=> array(3) { ["id"]=> string(1) "6" ["size"]=> string(5) "600" ["message"]=> string(7) "テスト6" } } foreach ($data as $key => $val) { ・ ・ ・ } となっております。foreachでループさせたときにidの降順?(1→6に表示)になるのですが、sortで昇順?(6→1に表示)にしたいです。 お分かりの方がいらっしゃいましたらお願いいたします。

    • 締切済み
    • PHP
  • 連想配列のソートについて

    調べても分からなかったので質問させてください。 現在アクセスログ集計ツールを作成中です。 決められたurlのページにアクセスがあった時にDB登録し、カウントする単純な仕組みで、ツールの方では日にちを任意で選択してもらいエクセル出力する仕組みです。 質問させていただきたいのが、カウントをするページが例えば4ページあり、そのページ名の接頭を取って「date」「index」「login」「stock」「option」というキーの連想配列を作っています。 array(5) { ["date"]=> array(3) { [0]=> string(10) "2015/02/01" [1]=> string(10) "2015/02/02" [2]=> string(5) "total" } ["Index"]=> array(3) { [0]=> int(2) [1]=> int(4) [2]=> int(6) } ["Login"]=> array(3) { [0]=> int(6) [1]=> int(6) [2]=> int(12) } ["Stock"]=> array(3) { [0]=> int(3) [1]=> int(4) [2]=> int(7) } ["option"]=> array(3) { [0]=> int(2) [1]=> int(1) [2]=> int(3) } } このキーである「index」「login」「stock」「option」の順番が取得するデータによって入れ替わってしまいます。 理想的な順番としては「login」「index」「option」「stock」の順番にソートしたいのですが、調べても分かりませんでした。sort関数はアルファベット順とか、数値順とか決まったルールのソートができるようですが、こちらで意図的に順番を操作する事はできるのでしょうか? もしあれば教えていただきたいです、何卒よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • vb.netでオブジェクトの種類を知りたい

    こんばんわ vb.netでオブジェクトの種類を知る方法はないでしょうか? 例 form上にtextbox1を配置した上で 'メインルーチン public sub main() dim ret = test(textbox1) msgbox("textbox1は" & ret & "です") endsub 'サブルーチン public function test(obj) dim ret as string 'ここでobjがtextboxかcheckboxか判別したい return ret end function このようなことが可能でしょうか? 可能なようでしたらどうすればよいかご教授お願いします。

専門家に質問してみよう