質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.33%

struts2-archetype-starterで作成したプロジェクトのエラー解消

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,565

lupus_dingo

score 279

こんにちは。

こちらの質問は
https://teratail.com/questions/28927
の続きになります。

A-pZさんの参考URLを見ながらstruts2-archetype-starterを
mavenからプロジェクト作成しTomcat8で実行したところ
IndexActionは正常に実行されました。

しかし、index画面からSubmitボタンを押下すると404エラー(クラスが見つからない)で
Apacheの画面になりStruts.xmlの
        <action name="helloWorld" class="helloWorldAction">
            <result name="input">/jsp/index.jsp</result>
            <result>/WEB-INF/jsp/helloWorld.jsp</result>
        </action>
        をIndexActionに合わせて
        <action name="helloWorld" class="local.sample.HelloWorldAction">
            <result name="input">/jsp/index.jsp</result>
            <result>/WEB-INF/jsp/helloWorld.jsp</result>
        </action>
に修正することでクラスがみつからないというエラーは解決しました。

つぎに、同様にindex画面で
パラメータを正常に入力せずにSubmit(HelloWorldActionのexecute)すると
「HTTP????? 404 - /struts2-archetype-starter/jsp/index.jsp」とエラーになりました。

試行錯誤してみると、HelloWorldAction.javaの39行目あたりにある
@RequiredStringValidator(message = "Please enter a name", trim = true)
をコメントアウトすると404エラーにならずに次の画面が表示されることがわかりました。

これらのエラーが、私のプロジェクトの作成方法が間違っているのか、
それともstarterなのであえてエラーのままにしているのかわからないのですが
間違った対応だと思うので正しい対応をご存知でしたら教えてほしいです。

ちなみにその後、ログを見るとvalidateExecuteが見つからないとあったので
メソッドを作ってデバッグしてみるとvalidateExecuteを通過することは確認できたのですが
出力されるエラーは同じ404でした。
    public String validateExecute() throws Exception {
        this.name="a";
        return SUCCESS;
    }

正しい動作は、「入力でエラーがあればエラーメッセージをセットして入力画面をリロードする」だと思うのですが、そのような動きにする方法をまず教えていただきたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

<result name="input">/jsp/index.jsp</result> 
<result>/WEB-INF/jsp/helloWorld.jsp</result>


と書かれていますので、入力チェックに引っかかった場合は、input側、そうでない場合は下側になります。
input側に /WEB-INF/ がついていないのでおそらく見つからない(404 Not found)が出ているのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/12 00:18 編集

    回答ありがとうございます。
    上記の問題はご指摘の通りで解決しました。
    次から次へと申し訳ありません、今度はDBに接続しようと試みて詰まっています。
    struts2-archetype-starterにはDB設定がなかったため、自前でXMLを用意してみたのですがうまく動きません。
    具体的には
    @Autowired
    private JdbcTemplate jdbcTemplate;
    と定義したjdbcTemplateにDBのメタ情報(オブジェクト)が設定されるはずのなのですが、デバッグしてみるとNULLのままインスタンスメソッド(queryForList)を実行しようとしているのでヌルポで落ちてしまいます。
    1日かけてここまではわかったのですが、XMLのためステップごとのデバッグができず、原因が追えないため、XMLの修正の仕方がわからないです。

    applicationContext.xmlには以下の記載があります。
    <!-- DB用の設定ファイル -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:database.properties" />
    </bean>

    <!-- DB接続用の設定 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    </bean>

    <!-- JDBC Template Bean -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
    </bean>

    また、Web.xmlには以下の記載があります。

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:applicationContext*.xml</param-value>
    </context-param>

    database.propertiesには以下の記載があります。

    jdbc.driverClassName=org.postgresql.Driver
    jdbc.url=jdbc:postgresql://localhost:5432/sample
    jdbc.username=postgres
    jdbc.password=postgres

    お手数ですが、アドバイスをお願いしたいです。
    わかりづらいようであれば新規に質問を上げます。

    キャンセル

  • 2016/03/14 15:06

    自己解決しました。
    以下のようにして、XMLではなくソースに読み込み処理を実装したところDBに接続でき、クエリも正常に実行されました。
    この件はクローズさせていただきます。

    ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    this.dataSource = (DataSource)context.getBean("dataSource");
    jdbcTemplate = new JdbcTemplate(this.dataSource);

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る