• ベストアンサー

ストラッツ(Struts)って本当にいいの?

こんにちは、私はJSP、サーブレット、JavaBeans の仕様は理解しているのですが、最近Strutsも見てみようと思い、挑戦してみました。使ってみて感じたこととしては。 1.こういう作り方をしているとシステムがどのような仕組みで動いているか深いレベルで理解できないのではないか?(サーブレットの作成はコンテナーが自動で行うみたいだし) 2.コンテナーが自動で様々なファイルをで作成してくれるのは業務効率アップにはなるだろうけれど、 その分プログラマーは、機械によって自動で書かれたコードは理解しずらいだろうし保守にはよい影響をあたえないのだろうか? 3.JSPのカスタムタグをたくさん覚えないといけない 4.なぜ意味もなくフォームにクライアントからリクエストがあるたびに一度データを格納してアクションで使っているのか 5.アクションはなぜ必要なのか。実際コントローラーなのだからサーブレットでもよいのではないか? など悪い点ばかりに気がつき、いい点がうまく理解できませんでした。これらの疑問について業務経験のあるかた解答をあたえていただけないでしょうか

  • Java
  • 回答数4
  • ありがとう数13

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

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 なにを疑問に思ってらっしゃるのか、俺には痛いほどよく分かります(笑) 1.こういう作り方をしていると...  そのとおりです。  でも実際のところ、『WEB開発』という仕事はITバブル期に一気に一般普及したものであるため、『理解できる人達だけの職人芸』であってはならないのです。  初心者プログラマーでも、ある程度のものが作れなければいけません。  サーブレットは少々固定観念の凝り固まりが強い傾向にはありますが、『職人以外には手も出せない』ようなシステムよりはマシなのです。 2.コンテナーが自動で様々なファイルを...  サーブレットは保守自体も仕事を横割りする前提になっています。  自動生成されたコードを読むのは、『それができる』人の仕事で、一般の管理者はそこまで厳密な保守をする必要はないというわけです。 3.JSPのカスタムタグをたくさん覚えないといけない  最近のプログラム言語は覚えなきゃいけないAPIの数なんかも膨大です。  それに比べれば少ない方だし、カスタムタグの多さは拡張性の高さに繋がるもので、ある程度やむをえないところはあります。 4.なぜ意味もなくフォームにクライアントからリクエストがあるたびに...  これも開発作業を横割りにするためです。  より深いフレームワークレベルのプログラムは上級プログラマーが組み、業務ロジックは一般プログラマーが作ることで、効率化を目指しているのです。 5.アクションはなぜ必要なのか。実際コントローラーなのだからサーブレットでもよいのではないか?  これも4.と同じですね。  1人の上級プログラマーに過負荷をかけるより、1人の上級者と複数の初心者とで仕事を分担した方が効率が良いからです。  とまぁ、ここまでツラツラ書きましたが、実際のところこの回答ではあなたの不満は解消しないと俺は確信しています。  なぜなら、サーブレットは『経営者ウケするように作られたシステム』だからです。  市販のシステムパッケージというのは2種類あって、1つは『本当に現場のことを思って作られたもの』、そしてもう1つは『経営者ウケを狙って、現場の意見を無視して作られたもの』です。  実際のところ、システムパッケージに対してお金を払うのは、コンピューターの素人であることが多い『経営者』で、現実的には後者のシステムの方がよく売れるんです。  ようするに、『IT経済というものは現場で回ってるんじゃなく、会議室で回ってる』わけですね(^_^;  それが現実です。

alovelybird
質問者

補足

みなさんすばらしい回答ありがとうございました。どの回答も非常に充実しており、みなさんにポイントをあげたいのですが、それはできないみたいなのでthe moonさん DQさん大変申し訳ありません。また機会がありましたら優先的にポイントを割り振らせていただこうと思います

その他の回答 (3)

  • dekopa-
  • ベストアンサー率42% (161/378)
回答No.4

あなたが言っているのは、結局は「車輪の再発明」と同じことです。 深く理解できるから、JSPのカスタムタグのような複雑な機構は不要だから、リクエストパラメータをいちいちJavaBeanに押し込めなくてもよいから、サーブレットで何でもできるから、だから全部コーディングするのですか? それではプロジェクトは成り立ちません。 Strutsのようなフレームワークは、毎回書かずにすむような部分を提供しているに過ぎません。中にはJSPのように、処理上は迂遠で重いだけのようなコードも含まれますが、それでもStrutsを選ぶのは、無駄な開発コストをかけないためです。 あなたはもしかしたら、Strutsよりシンプルな構造をベースにしたWebシステムを組めるかもしれません。 では次は?また0から組みますか?再利用するでしょう? その再利用する部分は、結局Strutsと同じか、似たような機能の集合体になりませんか? ならなぜ、既にあるStrutsを使わないのでしょうか? Struts登場以前は、各社から似たようなフレームワークが乱立していたのです。オープンソースでシンプル、かつ容易にカスタマイズ可能なStrutsが登場したことで、それらは結局駆逐されました。 駆逐されなくても、結局どこのプロジェクトでも、何かしらのフレームワークは使っていたでしょう。誰も、車輪(フレームワーク)を再発明(0から作り直し)したいとは思っていないからです。

noname#18558
noname#18558
回答No.3

参考書にあるような単純な画面をつくるだけならStrutsのメリットは生かせないでしょう。 ですが、実際の業務では何百という画面を作ります。 そのためにいちいちサーブレットを作っては手間がかかりますし、質問者様のように開発者がみんなサーブレットを理解してるとも限りません。 また、サニタイジングの問題もあります。 Strutsのタグは、多少なりともそこを吸収して、開発者の作業を軽減してくれています。 また、カスタムタグはJSPでスクリプティングを書くことを少なくしてくれます。 できればStrutsのコードを読んで見てください。 実際に使っていても気づかないようなことをしてくれています。 それを毎回開発する手間を考えると、かなりの効率アップになるんじゃないでしょうか。

  • the_moon
  • ベストアンサー率40% (9/22)
回答No.2

その疑問点はもっともですので、その気づいた点を考慮に入れたフレームワークを作成してみてください。 例えばどのような形のがよいのでしょうか? PHPは自由度がありすぎるので、JAVAの方がいいとか、その逆でJAVAでは敷居が高すぎるとか、いろいろ言われてそれぞれもっともなのです。 例えば、 1は、深いレベルで理解しなくても済むとも言えるのです。昔の人はアセンブラを知らずしてプログラムは語れないといいました。確かにそうでしょう。その後はCを知らずして、その後はJAVA、その後は…。 でも今のシステムをCで構築していたら膨大な時間がかかってしまいます。 逆に小さいものを作るならフレームワークは不要です。(当たり前ですが) 1つ経験者として言えるのが、struts(他のフレームワークでもいいです)というみんなと共通の約束事があると開発はスムーズに進みます。 でもその代わりルールも増えてしまうのです。 要は個々ではなく、全体としてとらえてみてください。

関連するQ&A

  • フレームワークの必要性

    JSP/サーブレット/JavaBeansを利用すればMVCの役割は果たしているような気がします。 Strutsのようなフレームワークが存在するのはなぜでしょうか?

    • ベストアンサー
    • Java
  • StrutsからString型のPOST値を送る

    初めて投稿させていただきます。 質問事項ですが、 Strutsを使用したフレームワークから、外部サイトへ向けString型の POST値を送ろうと思っているのですが、上手く出来ません。 自分なりに考え、 Actionクラス側 request.setAttribute("aaa","aaa") JSP側 request.getParameter("aaa") 等とやってもとれません。 JSP側で<bean:write name="aaa" />とすれば取れますが、送り先が他言語の為、String型のPOST値で送るしかない状況です。 HttpSessionを使えば上手くいくのですが、出来れば使用せず作成したいと思っています。 どなたか、ご存知の方がおりましたらお教え下さい。 尚、開発環境は下記の通りです Java 1.4 Struts 1.2 Tomcat 5.0 よろしくお願いします。

    • ベストアンサー
    • Java
  • Strutsの情報保持の仕方について

    今下記の様な画面(処理)を作成しているのですが、 どうしても分からない点が何点かあります。。 【入力画面へのリンク】⇒ 【初期値で使用する値の取得Actionクラス】⇒【入力画面】⇒【確認画面】⇒【完了画面】 (1)入力画面で入力した値を保持したいため入力画面でのstruts-configの設定はscope="session"と指定しました。 【入力画面】⇒【確認画面】 確認画面での表示ではrequestからの表示としたいため、struts-configの設定はscope="request"と指定した。 この場合、【入力画面へのリンク】を押した際にjavax.servlet.jsp.JspExceptionとなってしまう。 しかし、【入力画面】⇒【確認画面】でのscopeをscope="session"としてやるとうまくいく。 なぜ前者がうまくいかないのかの理由がまず分かりません、、 (2)【確認画面】から【入力画面】のURL(~.do)とURLを直打ちした場合の挙動がどのような 仕組みなのか分からない、、 実際に試したがキャッシュを読み込んでる??用にしか見えなかった。 【入力画面】のexecute()は走らないのか?! 主に上記二点がよく分からずに悩んでおります。 (1)に関しては【入力画面】⇒【確認画面】でscope="session"でもいいのですが(特にrequestする理由はないので)、 ただなぜstruts-configでsession⇒requestとするとエラーになるのか?ということが知りたく。。 イメージ) これだと上手くいかない、、Confirmのscopeをsessionに変えると上手くいく、、、なぜ? <action path="/~Regist" type="~RegistAction" validate="false" scope="session" name="~"> <forward name="success" path="~.jsp" /> </action> <action path="/~Confirm" type="~ConfirmAction" validate="true" scope="request" input="~" name="~"> <forward name="success_confirm" path="~.jsp" /> </action> <action path="/~Complete" type="~CompleteAction" validate="false" scope="request" name="~"> <forward name="success_complete" path="~.jsp" /> </action> まだまだ勉強中で変な質問をしているかもしれませんが、 詳しい方ご教授頂けたらと思います、宜しくお願い致します。

  • struts使用時のソースの位置

    お世話になります。 他で似た質問をしているのですが strutsのソースの格納場所について質問します。 WTP+strutsを使用し画面を作成しているのですが以下のような質問がでました。 致命的: サーブレット jsp のServlet.service()が例外を投げました javax.servlet.jsp.JspException: ActionMappingsまたはActionFormBeansコレクションが見つかりません おそらくstruts.config.xmlフォルダでactionタグに関連した箇所を探しているけれど見つからない・ソースのある箇所がわからない、といってるようには思うのですが。 情報: サーブレット action を利用不可能にマークします 2007/10/11 17:06:04 org.apache.catalina.core.StandardContext loadOnStartup 致命的: サーブレット /struts-blank がload()例外を投げました javax.servlet.UnavailableException: パス /WEB-INF/struts-config.xml に対するリソース読み込みエラー ソースの構成は struts-blank プロジェクト名 配下に Deployment Descriptor Java Resources build -class 実際javaソースをビルド時ここにclassが作成される WebContent 配下に METE-INF pages ここにすでにWelcome.jspソースが作成されている WEB-INF 配下に lib ここにjarファイルがある src 配下にjava ここにMessageResources.properties build.xml README.txt struts-config.xml tldファイル tiles.def.xml validation.xml validator-rules.xml Web.xml index.jsp すでに作成されている という構成なのですがどこが問題なのでしょうか? 実際には WEB-INF/src/配下にフォルダを作りそこにjavaソースを入れている感じなのですが よろしくお願いします

    • ベストアンサー
    • Java
  • コンパイラ struts

    フレームでコンパイラができません 助けてください top.html→menu.html、syouhin_kensaku.html,index.html menu.html(あ、い)(あ)を押したらhtmlはでますがjspが404がでます なぜでしょう struts-confing.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org.struts/dtds/struts-config_1_2.dtd"> <struts-config> <!-- データソースの設定 --> <date-sources> <!-- BasicDateSourseクラスを利用する --> <date-sourse typr="org.apache.commons.dbcp.BasicDateSourse"> <!-- JDBCドライバクラス名の設定 --> <set-property="driverClassName" value="com.mysql.jdbc.Driver"/> <!-- JDBCの接続文字列の設定 --> <set-propety propety="url" value="jdbc:mysql://localhost/struts?useUnicode=true&amp;characterEncoding=Windows-31J"/> <!-- MySQLのユーザーIDの設定 --> <set-propety propety="username" value="root"/> <!-- MySQLのパスワードの設定 --> <set-propety propety="passward" value="root"/> </date-sources> <!-- Form情報の定義 --> <form-beans> <form-bean name="AccountForm" type="action.form.AccountForm"/> </form-beans> <!-- アクションの定義 --> <action-mappings> <!-- Form情報をAccountFormとして、action.AccountFormクラスをアクションとして指定する --> <!-- Form情報はリクエストスコープに格納される --> <action name="Account" type="action.UpdateAction" path="/UpdateAction" scope="request" > <!-- アクションの遷移先として論理名をUpdate ファイルパスを/webJSP/index.jspとする --> <forward name="Update" path="/webJSP/index.jsp" /> </action> </action-mappings> <message-resources parameter="jp.co.jetsystem.message.MessageResources.properties"/> </struts-config>

  • struts1.3.10でエラー

    宜しくお願いします。 環境 Win7 eclipse 3.6.1 struts 1.3.10 tomcat 6.0 とあるサイトにあるサンプル(自分とは違うバージョンの環境)を、自分の環境において、そこからstrutsを勉強していこうとしてます。 最初の呼び出し画面index.jspは表示されますが、そこから次の呼び出し先(strutsのAction継承サーブレット)で HTTPステータス 404 - サーブレット Action が利用できません と出ます。 原因を探ろうとeclipseのコンソールを見たところ、 以下のようにエラーが出ていました。 -----------------------------------------------------------------  ・  ・  ・ 情報: 設定記述子 HLgame.xml を配備します 2011/10/31 15:02:35 org.apache.struts.action.ActionServlet initChain 情報: Loading chain catalog from jar:file:/D:/eclipse/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/HLgame/WEB-INF/lib/struts-core-1.3.10.jar!/org/apache/struts/chain/chain-config.xml 2011/10/31 15:02:35 org.apache.struts.util.PropertyMessageResources loadLocale 警告: Resource org/apache/struts/action/ActionResources_ja_JP.properties Not Found. 2011/10/31 15:02:35 org.apache.catalina.core.ApplicationContext log 致命的: Action: null java.lang.NullPointerException at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(XMLEntityScanner.java:1414) at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.skipSeparator(XMLDTDScannerImpl.java:2057)  ・  ・  ・ 2011/10/31 15:02:35 org.apache.catalina.core.ApplicationContext log 情報: サーブレット Action を利用不可能にマークします 2011/10/31 15:02:35 org.apache.catalina.core.StandardContext loadOnStartup 致命的: サーブレット /HLgame がload()例外を投げました javax.servlet.UnavailableException at org.apache.struts.action.ActionServlet.initModulePlugIns(ActionServlet.java:880) at org.apache.struts.action.ActionServlet.init(ActionServlet.java:359)  ・  ・  ・ ------------------------------------------------------------- 上記のうち、一番最初の致命的の箇所、 警告: Resource org/apache/struts/action/ActionResources_ja_JP.properties Not Found. について調べてみたのですが、 /HLgame/WebContent/WEB-INF/lib/以下に置いた、struts-core-1.3.10.jarを、 解凍してみたところ、 struts-core-1.3.10\org\apache\struts\actionフォルダがあり、そこに、 ActionResources_ja.propertiesはあったのですが、 ActionResources_ja_JP.propertiesはありませんでした。 struts-config.xmlの <message-resources parameter="・・・"/> は・・・の部分をいろいろ書き換えて試したものの、いずれも、エラー内容は上記のままでした。 他にどこを調べてよいかわからず困っています。 ActionResources_ja_JP.properties についてググってみましたが、参考になるものはありませんでした。 対処方法を考えていただけるとありがたく、 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • JavaBeans,JSP, Servlet(MVC)のみを使った開発って本当に業務で行われているの?

    こんにちは、私がWeb技術を勉強するときによく使う本として、Sun教科書Web Component Developer(試験310-080の対策本なのですが、おそらく現在売っているものより1バージョン古いです)という本があります。 この本には,webのMVCアーキテクチャは以下のように 設計されると記載されています。 サーブレット:Controller(システム処理の制御) JSP :View (画面) JavaBeans :Model (ビジネスロジック) しかし、実際の業務でビジネスロジックがJavaBeansのみで行われているシステムはあるのでしょうか?JavaBeansの定義としては、getXXXやsetXXXアクセス、またコンストラクタが引数をもたずpublicなどと ありますが、これを無視した普通のJavaクラスもビジネスロジックに使われているのではないでしょうか? EJB, Strutsを使わない開発環境でという条件付で、どなたか業務経験のある方、この疑問に答えていただけないでしょうか?

  • strutsでコンパイラ

    strutsでコンパイラができません struts-confing <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="Update" type="action.form.Update"/> <form-bean name="kensaku2" type="action.form.kensaku2"/> </form-beans> <!-- アクションの定義 --> <action-mappings> <!-- Form情報をUpdateとして、action.AccountFormクラスをアクションとして指定する --> <!-- Form情報はリクエストスコープに格納される --> <action name="HelloWorldForm" type="action.AccountForm" path="/Update" scope="request" > <!-- アクションの遷移先として論理名をhello ファイルパスを/webJSP/index.jspとする --> <forward name="Update" path="/webJSP/index.jsp" /> </action> </action-mappings> <message-resources parameter="ApplicationResource" /> </struts-config> index.jsp <%@page contentType = "text/html; charset=Shift_JIS"%> <%@page import= "java.util.List,websample.Account"%> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <html:html> <head> <title>一覧画面</title> </head> <body> <!-- HTMLのFROMタグに変換される --> <html:form method="POST" action="tuika1" target="_blank "> <div><font size="6" ><strong>顧客一覧画面</strong></font></div> <input type="submit" value="追加" name="insert"> </html:form> <form method="POST" action="kousin11" target="_blank "> <input type="submit" value="更新" name="update"> </html:form> <script type="text/javascript"> <!-- function disp(){ // 「OK」時の処理開始 + 確認ダイアログの表示 if(window.confirm('削除しますか')){ location.href = "index.jsp"; // index.jsp へジャンプ } // 「OK」時の処理終了 // 「キャンセル」時の処理開始 else{ window.alert('キャンセルされました'); // 警告ダイアログを表示 } // 「キャンセル」時の処理終了 } // --> </script> <html:form method="POST" action="Update"> <input type="submit" value="削除" name="delete" onClick="disp()"></p> <table border="1"> <tr> <TH>コード <TH>名称 <TH>住所 <TH>電話 <TH>メール <% List list = (List)request.getAttribute("list"); for(int i=0; i<list.size(); i++){ Account account = (Account)list.get(i); %> <tr> <td><%=account.getid()%> <td><%=account.getname()%> <td><%=account.getaddress()%> <td><%=account.getdenwa()%> <td><%=account.getmail()%> <td><input type="radio" name="radio" value="<%=account.getid()%>" > <% } %> </table> </html:form> </body> </html:html>

  • strutsで、任意の画面からの任意のURLを受け付けた時の処理がしたい。

    strutsを勉強中の者です。 strutsで、  (1)a.jsp→(2)b.do→(3)b.class→(4)c.jsp という画面遷移はできるようになったのですが、(現在b.doとb.classは同じ名前にしています。) 任意の画面からの呼び出しで、  (1)*.jsp→(2)*.do→(3)b.class→(4)c.jsp とし、(2)で入力された任意のURLを(3)で解析し、そのURLによって(3)内部での処理を分岐したいのです。 ちなみに、struts-config.xmlの定義で、 <action-mappings> <action className="test.ShowMain" path="/ShowMain" input="/jsp/html/*.jsp"> <forward name="success" path="/jsp/html/main.jsp"/> </action> </action-mappings> と、*を使って編集しようとしても、 画面に、HTTPステータス 500 が表示され、 コンソールには、 ---- 致命的: End event threw exception java.lang.NoSuchMethodException: No such accessible method: addForwardConfig() on object: test.ShowMain 2008/08/17 10:43:13 org.apache.struts.action.ActionServlet handleConfigException 致命的: パス /WEB-INF/struts-config.xml に対するリソース読み込みエラー java.lang.NoSuchMethodException: No such accessible method: addForwardConfig() on object: test.ShowMain 情報: サーブレット action を利用不可能にマークします 2008/08/17 10:43:13 org.apache.catalina.core.StandardContext loadOnStartup 致命的: サーブレット /test がload()例外を投げました javax.servlet.UnavailableException: パス /WEB-INF/struts-config.xml に対するリソース読み込みエラー ---- と表示されてしまいます。 環境は、  WindowsXP  Eclipse3.3  Tomcat5.5  GEF3.3  struts-1.3.8  JDK1.5  「Eclipseパーフェクトマニュアル ベストセレクション」  という本をもとに勉強しています。 a.こうした任意のページを受信する、という方法はStrutsで可能なのでしょうか? b.可能である場合、どのような方法を取れば良いでしょうか? どなたかご存知の方がいらっしゃいましたら教えて下さい。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • 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

専門家に質問してみよう