• 締切済み

strutsでのgetInputStream

お世話になります。 早速なのですがちょっと困っていて知ってる方いたら教えていただきたいと思います。 現在 strutsのactionからhttpの内容を全て取り出すプログラムを 作成しています。 httpヘッダーに関しては問題なく取得できたのですが httpのボディ部をHttpServletRequest.getInputStream()で取得 しようとしてもバイト長が-1で返ってきてしまい読み込めません でした。 読み込もうとしている値はテキストです。 (キ-=値の形式ではないので、getInputStreamでやっています。) プログラムを抜粋して載せさせていただきます。 ------------------------------------------------------- public class TestAction extends Action{ public ActionForward execute(ActionMapping mapping,ActionFormform,HttpServletRequest request, HttpServletResponse response) { try{ ServletInputStream sis = request.getInputStream(); byte[] bytes = new byte[1024]; String is=""; while(true){ int len = (sis.readLine(bytes,0,1024)); System.out.println("read length: " + len);←ここで-1が返ってくる。 if(len == -1){ break; } } }catch(Exception e){ e.printStackTrace(); } return null; } } ----------------------------------------------- どうぞよろしくお願いしますm(__)m

みんなの回答

回答No.1

HTTPクライアントの方は自作しているんでしょうか。 やりがちなミスをいくつか参考までに挙げます。 ・HTTPリクエストのメソッドをGETにしてしまう。   → POSTにする。 ・Content-Lengthヘッダをつけ忘れる。   → Content-Lengthは必ずつける。 ・Content-Typeヘッダを「application/x-www-form-urlencoded」にしてしまう。   → Content-Typeは付けないか、text/plainなどにする。 ブラウザからフォーム経由でPOSTリクエストを送ると、Content-Typeヘッダが「application/x-www-form-urlencoded」になるので、「-1」になると思われます。

mako_seven
質問者

お礼

fdsjaklfjasさん、回答ありがとうございました。 教えていただいたとおりクライアントを自作したら すんなり取る事ができました。 ご指摘いただいたとおりブラウザからPostで送ってテストをしていたのでいかなかったみたいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 「Struts使用中」XMLからデータ取得

    FormBeanにセットされた値を取得して、その値を元に一致するデータをXMLからとってきてそれらをテキストに落とし込む。という動作です。 最初はFormBeanにセットされた値をそのままテキストに落とし込むだけだったので楽にできて正常に動いていましたが、「XMLからとってくる」という動きを追加しようとしたところうまくいきません。 public class Test extends Action { (1) public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) {   FormBeanからキーになる値をとってくる。 } (2) public static void main(String[] args) throws Exception { Document document = DocumentBuilderFactory.newInstance()  キーとなる値を元にXMLからデータ検索し、値を取得 } (3) public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) {   そのほかのFormBeanの値をとってきて(2)で取得した値と一緒にテキストに落とし込み、returnで処理終了のjspを表示させる }  public ActionForward executeが(1)と(3)で2回でているからコンパイルエラーがでるのだとわかるのですが、その他の記述方法がわかりません。  ネットでいろいろ探したのですが、XMLparserのサンプルやStrutsのサンプルはあるのですが、2つ一緒のサンプルが見つからないので困っています。  ご存知の方よろしくお願いいたします。

    • ベストアンサー
    • Java
  • strutsのhtml:linkの使い方

    html:linkを使用してJSPを表示した際に、前のフォームのプロパティ値(ここではstaffNumberの値)を取得したいのですが,うまくいきません。 同じ処理をhtml:submitで実行すると取得できています。 その違いを教えて頂きたいのです。 以下がそのコードです。 【struts-config】 <form-bean dynamic="true" name= "loginForm" type="org.apache.struts.validator.DynaValidatorForm"> <form-property name = "staffNumber" type= "java.lang.String" /> </form-bean> <action name="loginForm" path="/login" scope="request" type="login.action.LoginAction" validate="false"> <forward name="success" path="/login.jsp" /> </action> 【login.jsp】 <html:form action="/login">  <html:text property="staffNumber" size="10"maxlength="8"/> <html:link action="/login">testlink</html:link> <html:submit value="test"/> </html:form> 【LoginAction】 public class LoginAction extends Action{ public ActionForward execute (ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) throws Exception{ DynaValidatorForm loginForm =(DynaValidatorForm) form; String staffNumber=(String)loginForm.get("staffNumber"); System.out.println(staffNumber); return (mapping.findForward("success")); } } linkの処理で同じJSPを表示していますが,前のプロパティ値を取得しているかをログで確認する事を優先しているのでそのようにしています。 質問の意味がわからない、ソースの不足等ありましたら御指摘下さい。 宜しくお願いします。

    • ベストアンサー
    • Java
  • StrutsでPOSTのデータ(リクエストボディ)を取得する

    StrutsでPOSTで送ったデータを取得する方法がわかりません。 メッセージボディのデータ param1=aaaa&param2=bbbb の文字列を取得したいと考えています。 executeメソッドの中で ServletInputStream is = request.getInputStream(); byte[] buff = new byte[4096]; int len = is.readLine(buff,0,4096); を行っても lenが-1になってしまいます。 どなたか解決方法を教えていただければと思います。 よろしくお願いします。

  • list<クラス名> とは何でしょうか?

    JAVA初心者のものです。 新規プロジェクトに向けてJAVAの習得に励んでおり、現在は「プロになるためのWeb技術入門」という本でフレームワークについて勉強しています。 ところでその本の中で次のコードがありますが、ここで List<ProductItem> は何を意味するものでしょうか? ご存知の方は教えてください。 なお、ProductItem は別の箇所で定義されたクラス名です。 public class ItemListShowAction extends Action { /* (non-Javadoc) * @see org.apache.struts.action.Action#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ProductLogic productLogic = new IbatisProductLogic(); List<ProductItem> productList = productLogic.getProductList(); request.setAttribute("productList", productList); return mapping.findForward("show"); } }

    • ベストアンサー
    • Java
  • ActionForm form にnullが入ってくる原因

    import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public ActionForward execute( ActionMapping map , ActionForm form , HttpServletRequest request , HttpServletResponse response ) throws ServletException, IOException, ClassNotFoundException, SQLException { という記述をして このソースで落ちる原因を調べたら、ActionForm form の "form" でnullが入ってきていました。 なにか定義し忘れているのでしょうか?

    • ベストアンサー
    • Java
  • Servletでcsvファイル読込

    Servletからcsvファイルを読込む処理を作成しています。 しかし、FileNotFoundExceptionが発生してファイルを読込めません。 下記のように記述した場合、csvファイルはどこに置けばよいのでしょうか? いろいろファイルの置き場所を変えてはやってみましたがダメでした。 package action; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; public class MemberEntryAction extends Action{ public ActionForward execute(ActionMapping mapping,ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { try { // 入力ストリームを作成。 FileReader fr = new FileReader("a.csv"); BufferedReader br = new BufferedReader(fr); // 読込みループ。 String line; // 読み込まれた1行。 while( (line = br.readLine()) != null ) { System.out.println(line); } // 入力・出力ストリームを閉じる。 br.close(); fr.close(); } catch ( FileNotFoundException e ) { System.out.println("FileNotFound!"); } return mapping.findForward("memberMenu"); } }

  • executeメソッドが複数回呼ばれている?

    こんばんは。現在、Java言語を勉強しているものです。 初めて間もないので、文章がわかり辛い点があるかとは思いますが 宜しくお願い致します。 ※strutsを使用しています。 JSPのある画面から、ボタンを押下することにより、 下記のアクションを実行しています。 しかし、一回しかボタンを押下していないにも関わらず、 executeメソッドが複数回呼ばれるパターンがあります。 public final class TestAction extends Action { public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) { System.out.println("TEST"); return (new ActionForward(mapping.getInput())); } } ※ マッピングは下記のとおりです。 <action path="/test" type="package.TestAction" name="XXXXForm" validate="true" input="/pages/XXXXX.jsp" scope="request"> </action> ※コンソール上に、 TEST と表示される場合と TEST TEST と表示される場合があります。 一度しかCALLされないようにしたいのですが(一度しかCALLされないものだと思っているのですが)、 どのように対処したらいいかで困っております。 ご指南のほう、宜しくお願い致します。 宜しくお願い致しますm(_ _)m

    • ベストアンサー
    • Java
  • strutsで画面遷移

    お世話になります。struts初心者です。 test1.jspから、リンクをクリックしたら、次のページ(download.jsp)へ遷移させたいのですが、「ページが見つかりません」となってしまいます。 以下のようなソースコードにしています。 どこがおかしいのでしょうか・・・・情報少ないでしょうか。わかる方いらっしゃいましたら、おしえてください。 https://xxxxx/test/test1.jsp  ↓リンククリックで下記URLになり「ページが見つかりません」 https://xxxxx/login/menu.do ------------------------------------------------------- test1.jsp ------------------------------------------------------- <html:html> <head> <script language="JavaScript"> <!-- function gonext(){ document.menuForm.menuOperation.value ="download"; document.menuForm.submit(); } --> </script> </head> <body> <html:form action="/login/menu"> <html:hidden property="menuOperation"/> <A href="javascript:gonext()"> go next </A> </html:form> </body> </html:html> ------------------------------------------------------- struts-config.xml ------------------------------------------------------- <form-beans> <form-bean name="menuForm" type="xxx.login.CMenuActionForm"/> </form-beans> <action-mappings> <action path="/login/menu" type="xxx.login.CMenuAction" name="menuForm" scope="request"> <forward name="download" path="/common/download.jsp"/> </action> </action-mappings> ------------------------------------------------------- CMenuAction.java ------------------------------------------------------- public class CMenuAction extends CxxxDLAction{ public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { return mapping.findForward("download"); } } ------------------------------------------------------- CMenuActionForm.java ------------------------------------------------------- public class CMenuActionForm extends ActionForm{ String menuOperation; public String getmenuOperation() { return menuOperation; } public void setmenuOperation(String menuOperation) { this.menuOperation = menuOperation; } }

  • StrutsのFormについて

    現在Struts(1.2)にてプログラムしているのですが、 分からない点があります。 とりあえず入力画面と入力画面表示時に必要なデータを取得してくる Actionクラスを作りました。 必要なデータとは、セレクトボックスの値でDBから取得しております。 で、取得したデータをActionクラスのexcute()が呼ばれたタイミングで、ActionFormの生成を(new)してそれにDBから取得した値をいれて 最後にrequest.setAttribute()で設定しています。 これは間違いでしょうか? というのも、Actionクラスのexcute()のところで、 request.getAttribute("XXXform",xxForm)としてやると、 Formが取得できます。本来はこのFormに設定するべきなのでしょうか? request.setAttribute()をしていないのにFormがあることに混乱しております。 単にstruts-config.xmlでFormの定義をしたら勝手に作成される ものなのでしょうか? なんだか言ってることが分からなくなってきた、、 言いたいことをまとめると、、 今は入力画面初期表示のために自分でActionFormをexecute()の はじめでNEWしてそれにデータをいれてrquestに設定しているが、 本来は既にrquestにあるFormをgetしてそれにデータをいれて再度、 rquestに設定するのが正しいのかどうかです。 宜しくお願いします。

    • ベストアンサー
    • Java
  • 外部コマンドの実行について

    ・Actionクラス public ActionForward Batch(     ActionMapping objActMapping,     ActionForm objActFrm,     HttpServletRequest objHttpRequest,     HttpServletResponse objHttpResponse)     throws Exception {         ActionForward objActFwd = null;         TestForm objTestForm = null;         try {             Runtime runtime = Runtime.getRuntime();             Process process = runtime.exec("c:/Batch/Batch.bat");             objActFwd = objActMapping.findForward("success");           }           catch (Exception e) {             e.printStackTrace();             throw e;           }         return objActFwd; } 以上のActionクラスをJSPからStrutusを介し実行しておりますが バッチファイルが実行されません。 batch.bat単体では実行可能です。 ご教授お願いいたします。 環境:WindowsXP j2sdk1.4.1 Jboss-3.2.3

    • ベストアンサー
    • Java