NOT FOUNDになる理由についてご教授ください。

3,039 views
Skip to first unread message

coboz

unread,
Nov 24, 2011, 5:48:54 AM11/24/11
to Google-App-Engine-Japan
お世話になります。cobozともうします。
javaは始めて3ヶ月、eclipse初めて、GAE/j初めての者です。

翔泳社刊 中垣健志氏著の「作ればわかる!GoogleAppEngineプログラミング」という書籍を参考に、下記を書きましたが、デバッグは通るに
も関わらず、http://localhost:8888/index で確認しようとすると
HTTP ERROR 404
Problem accessing /index. Reason:
NOT_FOUND
Powered by Jetty://

と表示されてしまいます。


何処か基本的な部分の抜けがあるように思われるのですが、一向に判らなく、困惑しております。
なお、javaのみでローカルに作成したHello!Worldは、コンソール内に普通に表示されました。


何処がおかしいのか、あるいは確認の要があるのか、お力添えをお願いいたします。


環境は下記の通りです。
PC:WindowsXPSP3
JAVA環境:
かつてインストールしていた分を一旦全てアンインストール
> 再起動後、Eclipse 3.6.2 Helios SR2 Windows 32bit ベース / Pleiades All in
One 3.6.2.20110326 を c:\pleiades\ にインストール
> Google Plugin for Eclipse、Google App Emgine Java SDK、Google Web
Toolkit SDKインストール
> Eclipse内でJavaのコンパイラ、ランタイムのバージョンを1.6に変更
> デフォルト文字コードを[HTMLファイル][CSSファイル][JSPファイル][XMLファイル]を、ISO 10646/ユニコード
(UTF-8)に指定


プログラムは下記の通りです。


プロジェクト名: wwwwgame
パッケージ名: com.appspot.wwwwgame
メインとなるクラス名: HelloWorld


wwwwgame\src\com.appspot.wwwwgame\IndexServlet.java

package com.appspot.wwwwgame;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class IndexServlet extends HttpServlet {
/* ブラウザからのGETリクエストを処理する */
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse
resp)
throws ServletException, IOException {
/* /WEB-INF/index.jspを呼び出す */
RequestDispatcher rd = getServletContext().getRequestDispatcher(
"/WEB-INF/index.jsp");
rd.forward(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse
resp)
throws ServletException, IOException {
/* 入力項目を取得する */
String when = req.getParameter("when");
String where = req.getParameter("where");
String who = req.getParameter("who");
String what = req.getParameter("what");
/* 新しい文章を作成してリクエスト属性に保存する */
String sentence = SentenceHelper.makeSentence(when, where, who,
what);
req.setAttribute("sentence", sentence);
/* 文章を保存して、JSPを呼び出す */
RequestDispatcher rd = getServletContext().getRequestDispatcher(
"/WEB-INF/index_post.jsp");
rd.forward(req, resp);
}
}

wwwwgame\src\com.appspot.wwwwgame\SentenceHelper.java

package com.appspot.wwwwgame;
/* ヘルパークラスは継承が不要なので、final句をつけて継承を抑制する */
public final class SentenceHelper {
/* ヘルパークラスはすべて静的メソッドなので、なにもしないprivateのコンストラクタを
* 用意して、外部からのインスタンス化を抑制する */
private SentenceHelper() { /* なにもしない */ }

/* ランダムな文章を作るための素材を用意する */
private static final String[] whenList = { "さっき", "昨日", "あれはもう3年も
昔", "紀元前",
"ジュラ紀" };
private static final String[] whereList = { "自宅で", "近くの居酒屋で", "世界のま
んなかで",
"追い込み中のプロジェクトで", "木星で" };
private static final String[] whoList = { "わたしが", "あなたが", "オヤジが",
"あこがれのアイドルが", "神が" };
private static final String[] whatList = { "新しいソートアルゴリズムを発見した",
"イグノーベル賞を受賞した", "悟りを開いた", "こけた", "十円ひろった" };

/* 新しい文章を作成する */
public static String makeSentence(String when, String where,
String who,
String what) {
StringBuilder builder = new StringBuilder();
builder.append("".equals(when) ? choice(whenList) :
when).append(" ");
builder.append("".equals(where) ? choice(whereList) :
where).append(" ");
builder.append("".equals(who) ? choice(whoList) :
who).append(" ");
builder.append("".equals(what) ? choice(whatList) : what);
return builder.toString();
}

/* 与えられた文字列配列から、ランダムに1つ選択する */
private static String choice(String[] list) {
return list[(int) (Math.random() * list.length)];
}
}

wwwwgame\src\com.appspot.wwwwgame\WwwwgameServlet.java

package com.appspot.wwwwgame;

import java.io.IOException;
import javax.servlet.http.*;

@SuppressWarnings("serial")
public class WwwwgameServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
}
}

wwwwgame\src\META-INF\jdoconfig.xml

<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/
jdoconfig">

<persistence-manager-factory name="transactions-optional">
<property name="javax.jdo.PersistenceManagerFactoryClass"

value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/
>
<property name="javax.jdo.option.ConnectionURL"
value="appengine"/>
<property name="javax.jdo.option.NontransactionalRead"
value="true"/>
<property name="javax.jdo.option.NontransactionalWrite"
value="true"/>
<property name="javax.jdo.option.RetainValues" value="true"/>
<property name="datanucleus.appengine.autoCreateDatastoreTxns"
value="true"/>
</persistence-manager-factory>
</jdoconfig>

wwwwgame\log4j.properties

# A default log4j configuration for log4j users.
#
# To use this configuration, deploy it into your application's WEB-INF/
classes
# directory. You are also encouraged to edit it as you like.

# Configure the console as our one appender
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c]
- %m%n

# tighten logging on the DataNucleus Categories
log4j.category.DataNucleus.JDO=WARN, A1
log4j.category.DataNucleus.Persistence=WARN, A1
log4j.category.DataNucleus.Cache=WARN, A1
log4j.category.DataNucleus.MetaData=WARN, A1
log4j.category.DataNucleus.General=WARN, A1
log4j.category.DataNucleus.Utility=WARN, A1
log4j.category.DataNucleus.Transaction=WARN, A1
log4j.category.DataNucleus.Datastore=WARN, A1
log4j.category.DataNucleus.ClassLoading=WARN, A1
log4j.category.DataNucleus.Plugin=WARN, A1
log4j.category.DataNucleus.ValueGeneration=WARN, A1
log4j.category.DataNucleus.Enhancer=WARN, A1
log4j.category.DataNucleus.SchemaTool=WARN, A1

wwwwgame\App Engine SDK[App Engine - 1.6.0]
【略】


wwwwgame\JREシステムライブラリー[jre1.6]
【略】


wwwwgame\war\css\style.css
【スタイルシート、略】


wwwwgame\war\WEB-INF\lib
【略】


wwwwgame\war\WEB-INF\appengine-web.xml

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application></application>
<version>1</version>

<!--
By default, App Engine sends requests serially to a given web
server.
To allow App Engine to send multiple requests in parallel specify:

<threadsafe>true</threadsafe>
-->

<!-- Configure java.util.logging -->
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/
logging.properties"/>
</system-properties>

</appengine-web-app>


wwwwgame\war\WEB-INF\index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://
www.w3.
org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>イツドコデダレガナニシタ</title>

<!--スタイルシートの追加 -->
<link href="/css/style.css" rel="stylesheet" type="text/css" />
</head>
<body>

<!-- <form>タグの準備 -->
<form action="/index" method="post">
<h1>イツドコデダレガナニシタ</h1>
<!-- 入力項目の準備 -->
<div class="box">
<dl>
<dt>いつ</dt>
<dd><input type="text" name="when" /></dd>
<dt>どこで</dt>
<dd><input type="text" name="where" /></dd>
<dt>だれが</dt>
<dd><input type="text" name="who" /></dd>
<dt>なにした</dt>
<dd><input type="text" name="what" /></dd>
</dl>
<p><input type="submit" value="新しい文章を作成する" /></p>
</div>
</form>
</body>
</html>


wwwwgame\war\WEB-INF\logging.properties

# A default java.util.logging configuration.
# (All App Engine logging is through java.util.logging by default).
#
# To use this configuration, copy it into your application's WEB-INF
# folder and add the following to your appengine-web.xml:
#
# <system-properties>
# <property name="java.util.logging.config.file" value="WEB-INF/
logging.properties"/>
# </system-properties>
#

# Set the default logging level for all loggers to WARNING
.level = WARNING


wwwwgame\war\WEB-INF\web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>Wwwwgame</servlet-name>
<servlet-class>com.appspot.wwwwgame.WwwwgameServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>Index</servlet-name>
<servlet-class>com.appspot.wwwwgame.IndexServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Wwwwgame</servlet-name>
<url-pattern>/wwwwgame</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Index</servlet-name>
<url-pattern>/Index</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

Daisuke Yamashita

unread,
Nov 24, 2011, 6:02:51 AM11/24/11
to google-app-...@googlegroups.com
山下です。

まさかとは思いますが、http://localhost:8888/Indexならアクセスできるとか無いですか?


2011/11/24 coboz <cobo...@gmail.com>:

> --
> このメールは Google グループのグループ「Google-App-Engine-Japan」の登録者に送られています。
> このグループに投稿するには、google-app-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、google-app-engine...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/google-app-engine-japan?hl=ja からこのグループにアクセスしてください。
>

--
Daisuke Yamashita
[BLOG] http://blog.daisukeyamashita.com/
[Twitter] http://twitter.com/dddaisuke

satoshi hyodo

unread,
Nov 24, 2011, 7:22:46 AM11/24/11
to google-app-...@googlegroups.com
兵頭です。

index.jspがWEB-INFの下にあるのはなぜでしょう・・・?

war/index.jsp
でどうですか?

--
satoshi hyodo

Kenji Nakagaki

unread,
Nov 24, 2011, 7:57:01 AM11/24/11
to Google-App-Engine-Japan
cobozさん
はじめまして、作者の中垣です。

質問の件ですが、書籍内のp39に記載したweb.xmlの編集は行なわれていますか?
web.xmlでは、"/index"というURLと"IndexServlet"を関連付ける設定を行なっています。
この設定を行なわないと、メールに書かれたような"NOT_FOUND"というエラーメッセージが
表示されます。一度、ご確認ください。

> value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFa ctory"/

> ...
>
> read more ≫

Kenji Nakagaki

unread,
Nov 24, 2011, 8:01:22 AM11/24/11
to Google-App-Engine-Japan
兵頭さん

書籍作者の中垣です。補足で説明します。

このJSPファイルは、サーブレットからのリクエストのフォワードにより表示されるJSPです。
そのためブラウザから直接URLを指定しても表示されないように、WEB-INFフォルダの中に
保存するよう書籍内で説明しています。ですので、このファイルの保存場所は書籍の通りに
正しい場所に保存されています。

On Nov 24, 9:22 pm, satoshi hyodo <tyato...@gmail.com> wrote:
> 兵頭です。
>
> index.jspがWEB-INFの下にあるのはなぜでしょう・・・?
>
> war/index.jsp
> でどうですか?
>
> --
> satoshi hyodo
>

> On 2011/11/24, at 19:58, coboz <coboc...@gmail.com> wrote:

coboz

unread,
Nov 24, 2011, 9:12:57 AM11/24/11
to Google-App-Engine-Japan
兵頭さま

お世話になります。
位置につきましては、自分自信がありませんでしたもので、
書籍に書いてあったとおりに設置しておりました。

理由につきましては、中垣さまがご回答くださったとおりです。

今回はご回答、誠にありがとうございました。
今後ともよろしくお願い申し上げます。


On 11月24日, 午後9:22, satoshi hyodo <tyato...@gmail.com> wrote:
> 兵頭です。
>
> index.jspがWEB-INFの下にあるのはなぜでしょう・・・?
>
> war/index.jsp
> でどうですか?
>
> --
> satoshi hyodo
>

> ...
>
> もっと読む ≫

coboz

unread,
Nov 24, 2011, 9:17:12 AM11/24/11
to Google-App-Engine-Japan
中垣さま

お世話になります。

というか、作者の方がここにいらして頂けたとは、何ともありがたく存じております。

xmlの編集は、書籍にあったとおりにしたのですが、
山下様宛の回答に書きましたとおり(見えるのでしょうか?
xml内では


<servlet>
<servlet-name>Index</servlet-name>
<servlet-class>com.appspot.wwwwgame.IndexServlet</servlet-class>
</servlet>

となっておりまして、さらに確認画面は
http://localhost:8888/index
と書いてありましたので、疑いもせずにそのままチェックしておりました。

以前自分がやっていたVBAでは大文字小文字区別しませんでしたもので、
そのまま通していた自分のチェック不備でした。

今後ともご指導の程、よろしくお願い申し上げます。

> ...
>
> もっと読む ≫

coboz

unread,
Nov 24, 2011, 9:19:46 AM11/24/11
to Google-App-Engine-Japan
山下さま

お世話になります。

確かに!
Indexに直しましたら、表示が可能となりました。

自分でweb.xmlファイルに「Index」と書いておりましたのを見落としておりました。
誠にありがとうございます。

今後ともよろしくお願い申し上げます。

On 11月24日, 午後8:02, Daisuke Yamashita <dddais...@gmail.com> wrote:
> 山下です。
>
> まさかとは思いますが、http://localhost:8888/Indexならアクセスできるとか無いですか?
>

> 2011/11/24 coboz <coboc...@gmail.com>:

> ...
>
> もっと読む ≫

Kenji Nakagaki

unread,
Nov 24, 2011, 9:58:23 AM11/24/11
to Google-App-Engine-Japan
中垣です。

Java関連の技術で、大文字小文字が区別されることによる誤動作はよくあります。
うまく動いたようでなによりです。

Reply all
Reply to author
Forward
0 new messages