- PR -

JSPのメソッドについて

1
投稿者投稿内容
kei
会議室デビュー日: 2003/04/23
投稿数: 11
投稿日時: 2003-04-24 13:40
お世話になります。
ASPで書かれてあったコードをJSPに移植しているのですが、
どうしていいのか分からなくなってしまいました。
かなーり簡略化していますが、モトはこんな感じです。
コード:
<%
Dim A,B,C
A = "aaa"
B = "bbb"
C = 0
Call show(A,B,C)
Sub show(A,B,C)
	Response.Write "[" + A + "]<br>"
	Response.Write "[" + B + "]<br>"
	A = A & "a"
	B = B & "b"
	C = C + 1
	If C <= 5 Then
		Call show(A,B,C)
	End If
End Sub
%>


つまり、条件により再帰しているのです。
そのままJSPの形式に書き直してみても当然のようにエラーになります。
<%! 〜 %>で囲めばいいと書いてあるのを見つけたので変えてみたら、
<%! 〜 %>内では暗黙オブジェクトが使えないらしくてまたエラー・・・。

こういう場合、どのように考えてどのようにコードを書けばよいのでしょうか?
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-04-24 14:25
まずは、変換されたJSPを掲載されることをお勧めします。
HALcat
会議室デビュー日: 2003/04/22
投稿数: 3
投稿日時: 2003-04-24 14:30
<%! ... %> で定義するメソッドに、
引数として暗黙オブジェクトを渡してやるっていうのはどうでしょう?

使いたい暗黙オブジェクトがどのクラスなのかは調べてくださいな。
kei
会議室デビュー日: 2003/04/23
投稿数: 11
投稿日時: 2003-04-24 15:44
済みませんでした。
全然形になってなくて分かりづらいと思いますが、要は指定したフォルダ配下をDOS画面でtree /fしたように表示するものです。
ASPみたいに
count = fa.getfolder(Path).subfolders.count
Set files = fa.getfolder(Path).files
Set folders = fa.getfolder(Path).subfolders
こういうのがないかと探したのですが見つけきれず、あれこれやっているうちに自分でも何をやっているのか分からなくなってきました・・・。
とりあえず、以下のようにコメントアウトして//Aのところで直接指定してあげれば、一階層だけは表示できました。
コード:
<%
//show(dPath,"");

//void show(String fPath, String fIndent)
//{
  int sCount = 0;
  int fCount = 1;
  int fileCount = 0;
  int wLoop = 0;

  String fIndent = "";        //A
  File fo = new File(fPath);  //A

  File[] fls = fo.listFiles();
  for(int i=0;i<fls.length;i++)
  {
    if(fls[i].isFile())
    {
      fileCount += 1;
    }
  }
  for(int i=0;i<fls.length;i++)
  {
    if(fls[i].isDirectory())
    {
      sCount += 1;
    } else {
      if(sCount != 0)
      {
        out.println(fIndent + " |   " + fls[i].getName() + "<br>");
        if(fCount == fileCount)
        {
          out.println(fIndent + " | " + "<br>");
        }
      } else {
        out.println(fIndent + "       " + fls[i].getName() + "<br>");
        if(fCount == fileCount)
        {
          out.println(fIndent + "   " + "<br>");
        }
      }
      fCount += 1;
    }
  }
  wLoop = 1;
  for(int i=0;i<fls.length;i++)
  {
    if(fls[i].isDirectory())
    {
      if(wLoop == sCount)
      {
        out.println(fIndent + " └─" + fls[i].getName() + "<br>");
//        show(fls[i],fIndent + "     ");
      } else {
        out.println(fIndent + " ├─" + fls[i].getName() + "<br>");
//        show(fls[i],fIndent + " │ ");
      }
    wLoop = wLoop + 1;
    }
  }
//}
%>


zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-04-24 17:51
再起呼び出しはそのまま展開すると混乱しますよね。
元の実装のまま、
<%!
void show(String fPath, String fIndent, OutputStream out) {
...
}
%>

<% show(fPath, fIndent, out); %>
という定義ではためされましたか?
zaxx_MD
大ベテラン
会議室デビュー日: 2003/04/21
投稿数: 204
お住まい・勤務地: 千葉県柏市
投稿日時: 2003-04-24 18:05
miss

void show(String fPath, String fIndent, OutputStream out)

じゃなくて

public void show(String fPath, String fIndent, JspWriter out)

のほうがいいですね・・・
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-04-24 22:32
引用:

keiさんの書き込み (2003-04-24 13:40) より:
<%! 〜 %>で囲めばいいと書いてあるのを見つけたので変えてみたら、
<%! 〜 %>内では暗黙オブジェクトが使えないらしくてまたエラー・・・。


<%! 〜 %>は宣言です。
ここではフィールド変数やメゾットを記述します。
メゾットを呼ぶときは
<% 〜 %>(スクリプトレット)に記述しないと駄目です。

でもできればメゾットはBeanにした方が良いです。
(カスタムタグにしても良いですが)
JSPに複雑なロジックを記述するのはお勧めできません。
kei
会議室デビュー日: 2003/04/23
投稿数: 11
投稿日時: 2003-04-25 10:41
zaxx_MDさん:
ありがとうございます!動きました!嬉しくて涙が出そうです。
値の受け渡しは一方通行ではなかったんですね。
私が持っている本には、メソッド呼び出し側で値をメソッドに渡し、メソッドでは値を受け取ってコードを実行した後returnで返す、というものしか載っていませんでした。
凄い勉強になりました。

takuさん:
| でもできればメゾットはBeanにした方が良いです。
| (カスタムタグにしても良いですが)
| JSPに複雑なロジックを記述するのはお勧めできません。
実はまだそこまで勉強が進んでいません。
JSPとサーブレットの違いというか、どう使い分けるのかはなんとなく分かったような気がしているのですが、じゃあBeanって何?と自問するとサッパリです。
まだまだ勉強が必要ですね。
とりあえず、思うような動作をしたというところで一段落です。
開発はWindowsマシンですが、動作をさせるのはUnixマシンらしいので、環境依存に関してこれから調べて改良を加えるつもりです。
それが済んだらBeanのことを勉強します。
また質問すると思いますが、よろしくお願いします。
1

スキルアップ/キャリアアップ(JOB@IT)