iアプリとサーブレットの連動方法|初心者向け

このQ&Aのポイント
  • iアプリとサーブレットを連動させる方法が分からず困っています。試したい動作や問題点について説明しています。
  • eclipseでDoJaプロジェクトを作成した場合、サーブレットを使うにはどのような設定が必要なのか理解できていません。
  • ネット上で見つけたサンプルコードについて、連動がうまくいかない理由などについて質問しています。
回答を見る
  • ベストアンサー

iアプリとサーブレットの連動(eclipse)

はじめまして、java初心者の者です。 現在私は、eclipseを使って、iアプリ開発に挑戦しています。 その中で、iアプリとサーブレットを連動させる方法が分からず、困っています。 iアプリ上の画面で、aと入力してサーブレットに送ると、サーブレットでテキストデータを書き換え、Aに変更して送り返すという、本当に初歩的な動作を試したいのですが、上手く連動してくれません。 ネット上のサンプルソースを丸写しで使っても動かないため、おそらく設定やファイルの置き場所、接続先の記述などに問題があるのだと思います。 インターネット等でいろいろと情報を集めてみたのですが、そもそもeclipseの中でDoJaプロジェクトを作成した場合、サーブレットを使うにはどのような設定が必要なのか、またデータはどのフォルダへ保存するべきなのかといった基礎的な情報が収集できず、困っています。 tomcatプロジェクトを作成し、その中でjspとサーブレットを連動させるテストは成功したのですが、DoJaプロジェクトではweb.xmlファイルを作らなくていいのか?など、本当に基礎的な部分が全く理解できていません・・・。 また、以下がネット上で拾ったサンプルコードです。 同じフォルダにあるサーブレット(Test)と連動させたいと思っているのですが、下記に何か間違いはないのでしょうか? ---------------------------------------------------------------- import com.nttdocomo.ui.*; import java.io.*; import com.nttdocomo.io.*; import javax.microedition.io.*; public class A extends IApplication { public void start() { String res = http("servlet/Test?test=a"); showDialog(res); } void showDialog(String s) { Dialog d = new Dialog(0, "dialog"); d.setText("" + s); d.show(); } String http(String name) { String url = IApplication.getCurrentApp().getSourceURL(); url += name; String res = null; HttpConnection conn = null; try { conn = (HttpConnection)Connector.open(url, Connector.READ); conn.setRequestMethod(HttpConnection.GET); conn.connect(); InputStream in = conn.openInputStream(); int len = (int)conn.getLength(); byte[] buf = new byte[len]; int off = 0; for (;;) { int n = in.read(buf, off, len); if (n < 0) throw new Exception(); off += n; len -= n; if (len == 0) break; } in.close(); conn.close(); return new String(buf); } catch (Exception e) { try { conn.close(); } catch (Exception e2) { } } return null; } } --------------------------------------------------------------- 本当に基礎的な質問で申し訳ありません。 どなたかご存知の方がいらっしゃいましたら、何卒よろしくお願いいたします。 ※以下、私の環境をお伝えいたします。 ・eclipse3.1 ・DoJa-5.1 ・apache-tomcat-6.0.20

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

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

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

ディレクトリについては、きちんとサーバーで公開されていて、ディレクトリのURLを正しく指定してあれば、問題はないはずだ。binとか開発段階のディレクトリのままというのはあまり勧められないと思うが、問題はないはず。 ざっとソースコードを見たところ、ふと思ったのは、テキストデータならInputStreamでそのまま取得せず、InputStreamReaderでラップして使ったほうがいいだろう、ということ。ただ、そうしないと動かないというわけじゃない。これが問題の原因ではないだろう。 後は、ADFの設定で「UseNetwork」がOFFになってる、とかいうことはないだろうか。これをONにしないとサーバーと通信はできないから確認しておいたほうがいい。今、思いつくのはそれぐらいだな。後は、細かなパスとかが間違ってないかよく確認するとか、ぐらいか。

nanako2009
質問者

お礼

お礼が遅れまして、申し訳ありませんでした。 おかげさまで解決いたしました。 どうやらeclipseのDoJaプロジェクトに、サーブレットを置いていたのが間違いでした。 tomcatプロジェクトにサーブレットを置いたところ、スグに解決いたしました。 初心者の基礎的な質問に付き合っていただき、本当にありがとうございました。

その他の回答 (1)

noname#94983
noname#94983
回答No.1

まず、基本的なことだが、iアプリは、それがダウンロードされたサーバーとしか通信できない。したがって、iアプリは、Tomcatサーバーからダウンロードして動かさなければいけないが、これはどうなっているだろうか。そのままエミュレータで起動しても、サーバーにはアクセスできないはず。 iアプリは、docomoのiappliToolを使っていると思うが、これのアプリケーション動作環境設定で、ネットワーク設定の「ADFのURL」にアクセス先のアドレスを入力すると、そこからADFをダウンロードしiアプリをエミュレータにロードするようになる。ここで、例えばhttp://localhost:8080/hoge.jamというように、Tomcatで公開しているADFのアドレスを入力してiアプリを起動して試してみる。

nanako2009
質問者

お礼

早速ご回答いただきまして、ありがとうございました。 スミマセン、何も知らずに普通にエミュレータで起動して試していました・・・。 ご回答いただいた内容のとおり、アプリケーション動作環境設定→ネットワーク設定→「ADFのURL」に、http//localhost:8888/DoJa-5.0.jamと設定しましたが、やはり動きませんでした。 その後、DoJa-5.0.jamというファイルが、bin以下に入っていたので、http//localhost:8888/DoJa-5.0/bin/Doja-5.0.jamと変更してやってみましたが、やはり結果は同じでした。 私の場合、DoJa-5.0というDoJaプロジェクトの下に、srcフォルダがあり、その直下にiアプリの表示用データと、サーブレットを入れています。 そして、srcとは別にbinフォルダがあり、その中にDoJa-5.0.jam、DoJa-5.0.jar、DownLoad.htmlの3つのファイルが入っていますが、フォルダ構成が問題になるようなコトもあるのでしょうか? 本当に何度も基本的な質問で申し訳ありませんが、教えてはいただけませんでしょうか。 何卒よろしくお願いいたします。

関連するQ&A

  • 固定長データのbyteスキップについて

    バイナリ入出力でご質問がございます。 下記の例のように各レコードにある 先頭5byte付与されたデータを スキップ(破棄)して 各レコード10byteずつ読み込みたいのですが なにかサンプルデータもしくは アドバイス頂けないでしょうか? どうぞよろしくお願い致します。 例 1レコード 10byte (先頭5byte付与) LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 LLLLL1234567890 ↓ 1234567890 1234567890 1234567890 1234567890 1234567890 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.io.ByteArrayOutputStream; public class dat{ public static void main(String[] args) { String inputFileName = ""; String outputFileName = ""; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); File outputFile = new File(outputFileName); try { FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(outputFile); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] buf = new byte[17]; int len = 0; while ((len = bis.read(buf, 0, 17)) == 17) { bos.write(buf, 0, 17); } bos.flush(); bos.close(); bis.close(); } catch(Exception e) { e.printStackTrace(); } }

    • ベストアンサー
    • Java
  • レコード長からのbyteスキップ設定について

    QNo.8229324から あらたに新規でご質問させて頂きます。 1レコードごとに10byteあったとします。 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 レコード長からスキップ設定を35byteと設定したとします。 40byteごとに頭の付与された5byteをスキップさせたいのですが なにかサンプル及びアドバイス頂けますでしょうか? 仕様案 (1)まずはレコード先端の5byteをスキップ (2)次は35byteを超えた時点で5byteスキップを繰り返し。 どうぞ宜しくお願い致します。 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.io.ByteArrayOutputStream; public class dat{ public static void main(String[] args) { String inputFileName = ""; String outputFileName = ""; // ファイルオブジェクトの生成 File inputFile = new File(inputFileName); File outputFile = new File(outputFileName); try { FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream(outputFile); BufferedOutputStream bos = new BufferedOutputStream(fos); byte[] buf = new byte[17]; int len = 0; while ((len = bis.read(buf, 0, 17)) == 17) { bos.write(buf, 0, 17); } bos.flush(); bos.close(); bis.close(); } catch(Exception e) { e.printStackTrace(); } }

    • ベストアンサー
    • Java
  • javaプログラミング

    javaとYahooのWebサービスを利用して、検索結果のxmlを取り出し、 ○○.xmlという引数を与えて、結果を書き出そうとしていますが、 以下のプログラムだと文字(日本語)が化けてしまいます。 どうにかして文字化けせず取り出すことはできないでしょうか。 よろしくおねがいします。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.InputStream; import java.net.URL; public class YahooWebServiceExample { public static void main(String[] args) { String request = "http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch? appid=web_research&query=%e6%b2%96%e7%b8%84&results=2"; try { // ファイル出力ストリームを取得(第二引数) BufferedWriter bw = new BufferedWriter(new FileWriter(args[0])); URL url = new URL(request); InputStream in = url.openStream(); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { for (int i = 0; i < len; i++) { System.out.print((char) buf[i]); bw.write(buf[i]); } } in.close(); bw.close(); } catch (Exception e) { System.out.println("Web services request failed"); } } }

    • ベストアンサー
    • Java
  • サーブレットでデータベース操作。

    サーブレットを使ってMySQL内のテーブルにレコードを追加、変更、削除できるようなプログラムを作っています。流れとしましては『HTML画面→サーブレット起動→レコード追加、変更、削除』といった具合です。追加、変更ができてなぜか削除だけできません。SQL文を書き換えるだけのはずなのですが・・。どなたか教えて下さい。windows2000Professional, j2sdk1.4.0_01, Tomcat3.3.1,MySQL3.23.47 略 . . Connection con = null; Statement stmt = null; try { con = DriverManager.getConnection( "jdbc:mysql://localhost/db_ichat", "root", "pen3"); stmt = con.createStatement(); String seqno = request.getParameter("seqno"); String name = request.getParameter("name"); String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect"); String psw = request.getParameter("psw"); String pswjp = new String(psw.getBytes("8859_1"), "JISAutoDetect"); String email = request.getParameter("email"); StringBuffer buf = new StringBuffer(); buf.append("delete from t_id "); buf.append("where seqno = "); buf.append(seqno); stmt.executeUpdate(buf.toString()); try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} . . 略。

    • ベストアンサー
    • Java
  • zipフォルダの解凍

    いつもお世話になっています。 zipフォルダ実行時のことで質問します。 指定のファイルをzipフォルダに格納して、フォルダ名を指定して格納することはできました。 それで、逆に、zipフォルダにどんなファイルがあるかを確かめたいと思ったのですが、可能なのでしょうか? zipフォルダに格納できたので、それを逆に変えてしようとしたのですが、いまいちわかりません。 zipフォルダに格納したソースは以下です。 import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipOutStream_Test { public static void main(String[] args) throws Exception { File zipf = new File("D:/zip_Java.zip"); //zipファイルに埋め込むfile名 File[] files = { new File("directory.txt") }; ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipf)); try { encode(zos,files); } catch (IOException e) { }catch(Exception e) { }finally { zos.close(); } } static byte[] buf = new byte[1024]; public static void encode(ZipOutputStream zos, File[] files) throws Exception { for(File f: files) { if(f.isDirectory() ) { encode(zos, f.listFiles() ); }else { ZipEntry ze = new ZipEntry(f.getPath().replace('\\', '/')); zos.putNextEntry(ze); InputStream is = new BufferedInputStream(new FileInputStream(f)); for (;;) { int len = is.read(buf); if (len < 0) break; zos.write(buf, 0, len); } is.close(); } } } } 宜しくお願いします。

    • ベストアンサー
    • Java
  • iアプリ Tomcatと連携

    前回の質問は、分かりづらいようなので新たに質問させていただきます。 現在、TomcatとiアプリDoja_Ver5.1、MySQLを使いDojaの方からTomcatへアクセスしTomcatからMySQLのデータを取りDojaの方へ表示させたいのですが、下記の文で何度やっても「java.lang.SecurityException: Illegal host」と出てしまいできません。 ADFファイルである、Jamファイルは、Jarファイルと同じ場所にあるので、PackageURLには「dosei_jisaku.jar」としか記述していません。 何故か、java.lang.SecurityException: Illegal hostが出て解決策も見出せずでいます;; public class dosei_jisaku extends IApplication { public void start() { mypanel wp_mypanel = new mypanel(); Display.setCurrent(wp_mypanel); } class mypanel extends Panel{ public mypanel() { add(new Label("項目名:")); TextBox w_name = new TextBox("",8,1,TextBox.DISPLAY_ANY); add(w_name); try { HttpConnection c = (HttpConnection)Connector.open("http://localhost:8080/mfs/mfs/test/dosei_jisakuSV"); ←同PCにあるTomcatのServlet(classファイル)へアクセスしています。 c.setRequestMethod(HttpConnection.GET); c.connect(); if(c.getResponseCode() != HttpConnection.HTTP_OK){ throw new IOException(); } InputStream is = c.openInputStream(); ByteArrayOutputStream os = new ByteArrayOutputStream(); for(;;){ int n = is.read(); if (n == -1) { break; } os.write(n); } String str = new String(); str = os.toString(); w_name.setText(str); os.close(); is.close(); c.close(); } catch(Throwable e) { w_name.setText("読込エラー" + e); } } } } どなたかアドバイスを頂けるようお願い致します…。

  • コネクションを使いまし??? au携帯でオープンアプリで通信のテスト

    au携帯でオープンアプリで通信のテストをしています。 HTTP GETメソッドを実行する には以下のようにすれば良いのですが、 下のreadHttpConnection関数を呼び出すごとに、 通信確認 このオープンアプリは通信を行おうとしています。 通信を許可しますか? ●許可する ○許可しない となります、以前の質問でコネクションを使いましをすれば、最初の1回で済むと回答を得ましたが、どのように使いまわしをすればそうなるのかわかりません。 conn = (HttpConnection)Connector.open(url, Connector.READ, true); ここに入力するURLは、毎回異なるため(例えば http://test?s=1 や http://test?s=2 など) どうしたらよいのでしょうか? //=== ソース === int readHttpConnection(String url, byte[] data) throws Exception { HttpConnection conn = null; InputStream in = null; int i, length = 0; try { conn = (HttpConnection)Connector.open(url, Connector.READ, true); conn.setRequestMethod(HttpConnection.GET); in = conn.openInputStream() ; while((i = in.read(data, length, data.length - length)) > 0) length += i; } catch(Exception ex) { } finally { if(in != null) in.close(); if(conn != null) conn.close(); } return length; }

    • ベストアンサー
    • Java
  • ファイルロック後の書き込みについて

    ファイルAをロックしファイルBを読み込み ファイルAに書き込むプログラムを作成しています。 単体起動では問題無く動くのですが 複数起動するとファイルの書き込みが行われなくなってしまいます。 ロックしたプログラム以外はロックエラーになり ロックについては正常に動いているように見えます。 なぜ書き込みが行われなくなってしまうかご教授いただけますか? import java.io.* ; import java.nio.*; import java.nio.channels.*; public class CopyFile { public static void main(String[] args) throws Exception { try{ FileInputStream fis = null; FileOutputStream output = null; FileChannel outChannel = null; FileLock outFileLock = null; byte buf[] = new byte[2048]; int len; int count = 0; if (args.length != 2) { System.out.println("使用法: java CopyFile ファイル名1 ファイル名2"); System.exit(0); } //if String source= args[0]; String target= args[1]; File sourceFile = new File(source); File targetFile = new File(target); fis = new FileInputStream(sourceFile); output = new FileOutputStream(targetFile); outChannel = output.getChannel(); outFileLock = outChannel.tryLock(); if (outFileLock == null) { System.out.println("rock error!!"); System.exit(0); } else { while ((len = fis.read(buf)) != -1) { output.write(buf, 0, len); count += len; } Thread.sleep(5000); output.flush(); output.close(); fis.close(); } }catch(Exception e){ System.out.println(e); } } } // Class CopyFile

    • ベストアンサー
    • Java
  • サーブレットとMysqlについて

    JSP サーブレット Mysqlについて質問です。 私が今実現させたいことを簡単に説明します。 画面側にはtextboxがあり、このtextboxは追加ボタンによって、 どんどん追加されていきます。 サーブレット側はこのtextboxの全ての値をDBに書き込みたいです。 例えば、textboxが二つなら、一つ目のINSERTでDBのname列にtextbox一個目の値を書き込み、二つ目のINSERTでDBのname列にtextboxニ個目の値を書き込む。 ソースを書いてみたのですが、いろいろと違いがあると思いますので、ご教示をお願いします。 現在は下記ソースを実行してもDBは更新されません・・ もしかしたら、DBの設定がおかしいのでしょうか・・ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String[] name10 = request.getParameterValues("sonota"); for (int i = 0; i < name10.length; i++) { System.out.println(i + " " + name10[i]); name10[i] = new String(name10[i].getBytes("8859_1"), "UTF-8"); } Connection conn = null; CallableStatement cs = null; PreparedStatement stmt = null; ResultSet rs = null; String url = "jdbc:mysql://localhost/Sample_db"; String dbUser = "root"; String dbPass = "taratara"; try{ Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, dbUser, dbPass); String sql= "insert into Sample_db.Sample_table (name) values (name10[i]);"; stmt = conn.prepareStatement(sql); for (String n : name10) { stmt.setString(1, n); stmt.executeUpdate(); } int cnt = stmt.executeUpdate(); stmt.close(); }catch(Exception e){ //exception RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request, response); } } }

    • ベストアンサー
    • Java
  • javaによるファイル送信のプログラム

    ユニキャスト通信のおけるプログラミングで、1のプログラムを2のプログラムを使ってファイル送信ができるようにしたいのですがうまくいきません。私のjavaの知識が授業についていかなくて図書館でいろいろと本を探したのですが見つかりませんでした。誰か教えていただけませんか? /*1*/ import java.net.*; import java.io.*; public class udpechoServer{ static final int echo_PORT = 7; //エコーポート番号 static final int BUFSIZE = 1024; //バッファサイズ public static void main(String[] args) throws IOException{ int port = echo_PORT; //ポート番号 int cliport; //クライアントポート番号 int len; //データ長 int i; //キーインバッファクリアインデックス DatagramSocket sock = null; //データグラムソケット宣言,初期化 byte[] buf = new byte[BUFSIZE]; byte[] wbuf = new byte[BUFSIZE]; String recvdata; //受信データ try{ sock = new DatagramSocket(port); DatagramPacket recvpacket = new DatagramPacket(buf,BUFSIZE); DatagramPacket sendpacket = new DatagramPacket(buf,BUFSIZE); System.out.println("Connected to echo server"); while(true){ sock.receive(recvpacket); //データ受信 recvdata = new String(recvpacket.getData(),0,recvpacket.getLength()); recvdata = recvdata.trim(); //トリミング(CRLF) wbuf = recvdata.getBytes(); //文字列→バイト配列変換 i = 0; len = wbuf.length; buf = new byte[BUFSIZE]; while(wbuf[i] != 0x0d){ //途中のCR検出 buf[i] = wbuf[i]; //データコピー i++; if(i >=len){ break; } } recvdata = new String(buf,0,i); //バイト配列→文字列変換 System.out.println(recvdata); //画面出力 InetAddress ipadr = recvpacket.getAddress(); cliport = recvpacket.getPort(); buf = recvdata.getBytes(); len = buf.length; sendpacket = new DatagramPacket(buf,len,ipadr,cliport); sock.send(sendpacket); //データ送信 recvpacket.setLength(BUFSIZE); //データグラムパケット長リセット } }catch(SocketException e){ e.printStackTrace(); } } } /*2 */ import java.io.*; class FileCopy { public static void main(String argv[]){ try{ InputStream in = new FileInputStream(argv[0]); //入力ファイルを開く //BufferedInputStreamオブジェクトの生成 BufferedInputStream bin = new BufferedInputStream(in); OutputStream out = new FileOutputStream(argv[1]); //出力ファイルを開く //BufferedOutputStreamオブジェクトの生成 BufferedOutputStream bout = new BufferedOutputStream(out); byte buf[] = new byte[1024]; int c; //読み込みデータがなくなるまで読み込み while((c = bin.read(buf, 0, buf.length)) != -1){ bout.write(buf, 0, c); //データの書き込み処理 } System.out.println("\""+argv[0]+"\" was converted into \""+argv[1]+"\""); bin.close(); //入力ファイルを閉じる bout.close(); //出力ファイルを閉じる }catch(Exception e){} } }

    • ベストアンサー
    • Java

専門家に質問してみよう