- PR -

strusアプリケーションが動かない

1
投稿者投稿内容
初心者
会議室デビュー日: 2007/12/24
投稿数: 3
投稿日時: 2007-12-24 22:46
はじめまして いつも拝見させていただいています。
strutsを勉強している初心者です。

環境は、以下の環境です。
struts:1.02
tomcat:4.0.4
JDK:1.4.0_01

上記環境でpostMessage.jspで入力し、showMessage.jspに入力値を表示させようとしていますが、postMessage.jspで「投稿」ボタンをクリックすると真っ白な画面が表示されてしまい、showMessage.jspが表示できません。
postMessage.jspとshowMessage.jspは、同じディレクトリ内にあります。

ソース、設定ファイル、tomcatのlogを添付しますので、何かアドバイスをいただけると
大変嬉しく思います。

1.postMessage.jsp
<%@page contentType="text/html; charset=Shift_JIS" %>
<%@ 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>
<div align="center">
<h1>グルメ掲示板〜メッセージ投稿〜</h1>

<html:form action="/postMessage">
<table border="0" cellpedding="5" width="500">
<tr>
<td bgcolor="skyblue">お店の名前</td>
<td bgcolor="Khaki"><html:text property="shopName" maxlength="20" size="20"/></td>
</tr>
<tr>
<td bgcolor="skyblue">投稿者氏名</td>
<td bgcolor="Khaki"><html:text property="criticName" maxlength="20" size="20"/></td>
</tr>
<tr>
<td bgcolor="skyblue">メッセージ</td>
<td bgcolor="Khaki"><html:textarea property="messageBody" cols="35" rows="3"/></td>
</tr>
</table>
<html:submit property="submit" value="投稿"/>
<html:reset value="リセット"/>
</html:form>
</div>
</body>
</html:html>

2.showMessage.jsp
<%@page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

<html:html>
<head>
<title>グルメ掲示板〜メッセージ一覧〜</title>
</head>
<body>
<div align="center">
<h1>グルメ掲示板〜メッセージ一覧〜</h1>

<html:link page="/postMessage.jsp">戻る</html:link>
<table border="0" cellpedding="5" width="500">
<logic:iterate id="oneMessage" name="gourmet.messages" scope="application">
<tr>
<td colspan="2" bgcolor="skyblue">
<font size="6"><bean:write name="oneMessage" property="shopName"/></font>
</td>
</tr>
<tr>
<td bgcolor="Khaki">投稿者</td>
<td bgcolor="Khaki"><bean:write name="oneMessage" property="criticName"/></td>
</tr>
<tr>
<td bgcolor="Khaki">メッセージ</td>
<td bgcolor="Khaki"><pre><bean:write name="oneMessage" property="messageBody"/></pre></td>
</tr>
<tr></tr><tr></tr>
</logic:iterate>
</table>

</div>
</body>
</html:html>

3.PoatMessageForm.java
/*
* タイトルoatMessageForm.java
* 説明  :アクションフォームBean
* 変更履歴:初版
*/
package gourmet;

import org.apache.struts.action.*;

/**
* 基本掲示板アクションフォームBean
*
* @author
* @version 1.0
*/
public final class PostMessageForm extends ActionForm {
private String shopName;
private String criticName;
private String messageBody;

/**
* shopNameアクセッサメソッド
*
* @author
* @version 1.0
*/
public void setShopName(String shopName) {
this.shopName = shopName;
}

public String getShopName() {
return shopName;
}

/**
* criticNameアクセッサメソッド
*
* @author
* @version 1.0
*/
public void setCriticName(String criticName) {
this.criticName = criticName;
}

public String getCriticName() {
return criticName;
}

/**
* messageBodyアクセッサメソッド
*
* @author
* @version 1.0
*/
public void setMessageBody(String messageBody) {
this.messageBody = messageBody;
}

public String getMessageBody() {
return messageBody;
}
}

4.PoatMessageAction.java
/*
* タイトルoatMessageAction.java
* 説明  :アクションクラス
* 変更履歴:初版
*/
package gourmet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import org.apache.struts.action.*;
import java.util.LinkedList;

/**
* 基本掲示板アクションクラス
*
* @author
* @version 1.0
*/
public final class PostMessageAction extends Action {
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest req,HttpServletResponse res) {
ServletContext context = getServlet().getServletContext();

PostMessageForm postMessageForm = (PostMessageForm)form;

// 例えばこのようにして、リクエストデータからお店の名前を取り出すことができます。
// String shopName = postMessageForm.getShopName();

LinkedList messages = (LinkedList)context.getAttribute("gourmet.messages");

// messageが空からセット
if(messages == null) {
messages = new LinkedList();
context.setAttribute("gourmet.messages",messages);
}
messages.addFirst(form);

return (mapping.findForward("success"));
}
}

5.struts-config.xml(form,action部分を抜粋)
<!-- ========== Form Bean Definitions =================================== -->

<form-beans>



<!-- Example logon form bean

<form-bean name="logonForm"

type="org.apache.struts.example.LogonForm"/>

-->

<!-- 掲示板form -->
<form-bean name="postMessageForm" type="gourmet.PostMessageForm"/>


</form-beans>

<!-- 掲示板アクション -->
<action path="/postMessage" type="gourmet.PostMessageAction" name="postMessageForm" scope="request">
<forward name="success" path="/showMessage.jsp"/>
</action>

6.tomcatのログ(localhost_log)
2007-12-24 22:43:21 StandardManager[/manager]: 乱数発生器のクラス java.security.SecureRandom のシードを生成しています
2007-12-24 22:43:21 StandardManager[/manager]: 乱数発生器のシードの生成が完了しました
2007-12-24 22:43:21 ContextConfig[/manager]: 証明書をリクエストの属性値に追加します
2007-12-24 22:43:21 ContextConfig[/manager]: メソッド BASIC のオーセンティケータを設定します
2007-12-24 22:43:21 StandardWrapper[/manager:default]: コンテナサーブレット default をロードします
2007-12-24 22:43:21 default: init
2007-12-24 22:43:21 StandardWrapper[/manager:invoker]: コンテナサーブレット invoker をロードします
2007-12-24 22:43:21 invoker: init
2007-12-24 22:43:21 jsp: init
2007-12-24 22:43:22 StandardHost[localhost]: URL file:D:\Program Files\Apache Tomcat 4.0\webapps\gourmet からコンテキストパス /gourmet にWebアプリケーションをインストールします
2007-12-24 22:43:22 WebappLoader[/gourmet]: クラスリポジトリを作業ディレクトリ D:\Program Files\Apache Tomcat 4.0\work\Standalone\localhost\gourmet に配備します
2007-12-24 22:43:22 WebappLoader[/gourmet]: JAR /WEB-INF/lib/struts.jar を D:\Program Files\Apache Tomcat 4.0\webapps\gourmet\WEB-INF\lib\struts.jar に配備します
2007-12-24 22:43:22 StandardManager[/gourmet]: 乱数発生器のクラス java.security.SecureRandom のシードを生成しています
2007-12-24 22:43:22 StandardManager[/gourmet]: 乱数発生器のシードの生成が完了しました
2007-12-24 22:43:23 ContextConfig[/gourmet]: 証明書をリクエストの属性値に追加します
2007-12-24 22:43:23 StandardWrapper[/gourmet:default]: コンテナサーブレット default をロードします
2007-12-24 22:43:23 default: init
2007-12-24 22:43:23 StandardWrapper[/gourmet:invoker]: コンテナサーブレット invoker をロードします
2007-12-24 22:43:23 invoker: init
2007-12-24 22:43:23 action: init
2007-12-24 22:43:23 action: Loading application resources from resource ApplicationResources
2007-12-24 22:43:23 action: Initializing configuration from resource path /WEB-INF/struts-config.xml
2007-12-24 22:43:23 action: Process servletName=action, urlPattern=*.do
2007-12-24 22:43:23 action: Mapping for servlet 'action' = '*.do'
2007-12-24 22:43:23 jsp: init
2007-12-24 22:43:23 StandardHost[localhost]: URL file:D:\Program Files\Apache Tomcat 4.0\webapps\ROOT からコンテキストパス にWebアプリケーションをインストールします
2007-12-24 22:43:23 WebappLoader[]: クラスリポジトリを作業ディレクトリ D:\Program Files\Apache Tomcat 4.0\work\Standalone\localhost\_ に配備します
2007-12-24 22:43:23 StandardManager[]: 乱数発生器のクラス java.security.SecureRandom のシードを生成しています
2007-12-24 22:43:23 StandardManager[]: 乱数発生器のシードの生成が完了しました
2007-12-24 22:43:23 ContextConfig[]: 証明書をリクエストの属性値に追加します
2007-12-24 22:43:23 StandardWrapper[efault]: コンテナサーブレット default をロードします
2007-12-24 22:43:23 default: init
2007-12-24 22:43:23 StandardWrapper[:invoker]: コンテナサーブレット invoker をロードします
2007-12-24 22:43:23 invoker: init
2007-12-24 22:43:23 jsp: init
2007-12-24 22:43:23 StandardHost[localhost]: URL file:D:\Program Files\Apache Tomcat 4.0\webapps\tomcat-docs からコンテキストパス /tomcat-docs にWebアプリケーションをインストールします
2007-12-24 22:43:23 WebappLoader[/tomcat-docs]: クラスリポジトリを作業ディレクトリ D:\Program Files\Apache Tomcat 4.0\work\Standalone\localhost\tomcat-docs に配備します
2007-12-24 22:43:23 StandardManager[/tomcat-docs]: 乱数発生器のクラス java.security.SecureRandom のシードを生成しています
2007-12-24 22:43:23 StandardManager[/tomcat-docs]: 乱数発生器のシードの生成が完了しました
2007-12-24 22:43:24 ContextConfig[/tomcat-docs]: 証明書をリクエストの属性値に追加します
2007-12-24 22:43:24 StandardWrapper[/tomcat-docs:default]: コンテナサーブレット default をロードします
2007-12-24 22:43:24 default: init
2007-12-24 22:43:24 StandardWrapper[/tomcat-docs:invoker]: コンテナサーブレット invoker をロードします
2007-12-24 22:43:24 invoker: init
2007-12-24 22:43:24 jsp: init
2007-12-24 22:43:24 StandardHost[localhost]: URL file:D:\Program Files\Apache Tomcat 4.0\webapps\webdav からコンテキストパス /webdav にWebアプリケーションをインストールします
2007-12-24 22:43:24 WebappLoader[/webdav]: クラスリポジトリを作業ディレクトリ D:\Program Files\Apache Tomcat 4.0\work\Standalone\localhost\webdav に配備します
2007-12-24 22:43:24 StandardManager[/webdav]: 乱数発生器のクラス java.security.SecureRandom のシードを生成しています
2007-12-24 22:43:24 StandardManager[/webdav]: 乱数発生器のシードの生成が完了しました
2007-12-24 22:43:24 ContextConfig[/webdav]: 証明書をリクエストの属性値に追加します
2007-12-24 22:43:24 StandardWrapper[/webdav:default]: コンテナサーブレット default をロードします
2007-12-24 22:43:24 default: init
2007-12-24 22:43:24 StandardWrapper[/webdav:invoker]: コンテナサーブレット invoker をロードします
2007-12-24 22:43:24 invoker: init
2007-12-24 22:43:24 jsp: init
2007-12-24 22:43:52 jsp: init
2007-12-24 22:44:24 action: Processing a POST for /postMessage
2007-12-24 22:44:24 action: Setting locale 'ja'
2007-12-24 22:44:24 action: Looking for ActionForm bean under attribute 'postMessageForm'
2007-12-24 22:44:24 action: Creating new ActionForm instance of class 'gourmet.PostMessageForm'
2007-12-24 22:44:24 action: Storing instance under attribute 'postMessageForm' in scope 'request'
2007-12-24 22:44:24 action: Populating bean properties from this request
2007-12-24 22:44:24 action: Validating input form properties
2007-12-24 22:44:24 action: No errors detected, accepting input
2007-12-24 22:44:24 action: Looking for Action instance for class gourmet.PostMessageAction
2007-12-24 22:44:24 action: Double checking for Action instance already there
2007-12-24 22:44:24 action: Creating new Action instance

長文になってしまい恐縮ですが、よろしくお願いいたします。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2007-12-25 09:54
るぱんです。

解析中。汗
コード:

/**
* 基本掲示板アクションクラス
*
* @author
* @version 1.0
*/
public final class PostMessageAction extends Action {
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest req,HttpServletResponse res) {



ここに、

コード:

//Debug
System.out.println("TEST");


と打ってみて、反応はありますか?

コード:

ServletContext context = getServlet().getServletContext();

PostMessageForm postMessageForm = (PostMessageForm)form;

// 例えばこのようにして、リクエストデータからお店の名前を取り出すことができます。
// String shopName = postMessageForm.getShopName();

LinkedList messages = (LinkedList)context.getAttribute("gourmet.messages");

// messageが空からセット
if(messages == null) {
messages = new LinkedList();
context.setAttribute("gourmet.messages",messages);
}
messages.addFirst(form);

return (mapping.findForward("success"));
}
}



[ メッセージ編集済み 編集者: るぱん 編集日時 2007-12-25 12:28 ]

[ メッセージ編集済み 編集者: るぱん 編集日時 2007-12-25 12:29 ]
初心者
会議室デビュー日: 2007/12/24
投稿数: 3
投稿日時: 2007-12-25 22:14
るぱんさん 
こんばんは 初心者です。

長文の中アドバイスをいただきありがとうございます。

アドバイス通り
//Debug
System.out.println("TEST");
を入れてみましたが、全く反応がないです。
tomcatのログ(localhost_log) も変化がありませんでした。

何かが不足しているのでしょうか。
見当がつかないのでアドバイスいただけると嬉しいです。

よろしくおねがいいたします。





小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-12-25 23:40
この手のご質問の場合必ず書いているんですが、慣れないうちは
サンプルプロジェクトに少しずつ手を加えて試す方法をお勧め
しています、急がば回れということで。
だーて
常連さん
会議室デビュー日: 2007/12/18
投稿数: 20
お住まい・勤務地: ここはどーこ?私はだーて
投稿日時: 2007-12-26 20:48
こんばんは。

すっごく気になるところがありました。

引用:

3.PoatMessageForm.java
(中略)
public final class PostMessageForm extends ActionForm {


ここと、
引用:

4.PoatMessageAction.java
(中略)
public final class PostMessageAction extends Action {


ここ、です。

ファイル名とクラス名が異なりますが・・・タイプミスでしょうか・・・?

#関係ないかもしれませんが。

#もしかして、プロジェクト内に
#PoatMessageForm.javaとPostMessageForm.javaと、
#PoatMessageAction.javaとPostMessageAction.javaがあって、
#Post〜の方を見に行ってるとか・・・。
#でもExceptionでますよね・・・。
_________________
普通?常識?何ですかそりは。
日本語は難しい・・・。
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-12-27 00:51
struts-configのaction要素はaction-mappings要素で囲まれているのですよね?
うまく行かない原因はforward先jspの配置場所がおかしいからという可能性が高いと思われます。
jspがコンテキストルートの直下にあるように指定していますが、間違っていませんか?

引用:

だーてさんの書き込み (2007-12-26 20:48) より:
ファイル名とクラス名が異なりますが・・・タイプミスでしょうか・・・?


細かいとこに気づきましたね〜
すばらしい。

ログからはアクションのインスタンスが生成されていることが分かりますから、
他に写し間違いなど無ければ、これはまあ"Poat"→"Post"の書き間違いでしょう。

標準出力がログに書き出されないとのことですが、ログに書き出すかどうかはTomcatの設定次第ですので、
行いたいなら設定を変更する必要があります。
……と思ったのですが、Tomcat6では(5も?)管理画面が変わっていて設定項目が出てきませんね。
Tomcat4だと、この辺りを管理者用画面から設定できたはずですので確認してみてください。

Actionが実行されているかどうかですが、HttpServletResponseに出力してやって、画面で確認するという手もあります。
例えばexecuteに以下のコードを書いて
コード:

res.getWriter().write("This is a Test.");
return null;


画面に
This is a Test.
が出力されれば通っていると判断できるという風に。

Log4J等のロギングクラスを利用してログ出力するようにできればベストなのですが。

お好みの方法で確認してみてください。

[編集]
勉強中なのですね。
であれば、今後のことを考えてjdk等のバージョンは新しいものを使用しておいたほうが良いです。
strutsについては1系と2系で多少異なるようですので、参考書籍との兼ね合いもありましょうから、
一概に新しいものをとは勧めません。
[/編集]

[ メッセージ編集済み 編集者: 暁 編集日時 2007-12-27 00:57 ]
初心者
会議室デビュー日: 2007/12/24
投稿数: 3
投稿日時: 2007-12-27 22:33
こんばんは 初心者です。

たくさんのアドバイスをいただき
感謝しています。
返信遅くなり申し訳ありません。

ー引用ー
jspがコンテキストルートの直下にあるように指定していますが、間違っていませんか?
ー引用ー
についてですが、showMessage.jspは、webapps/gourmet配下にありますので
コンテキストルートの直下にあります。
ファイル名は、それぞれPostMessageForm.java、PostMessageAction.javaに
なっていましたのでファイル名違いでもありませんでした。

解決できなかったらアドバイスをいただきたいと思いますが、
まずは、暁さんのいただいたアドバイスをもとに自分で解析してみます。
暁さん、だーてさん、小僧さん、るぱんさん
本当にありがとうございました。
1

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