- PR -

MVCサンプルが動作してくれません(ToT)

投稿者投稿内容
kokko
会議室デビュー日: 2004/07/11
投稿数: 7
投稿日時: 2004-07-11 04:45
OS : WinXP
Java : SE (build 1.4.2_05-b04) = C:\java
Tomcat : 5.0.24 = C:\Program Files\Apache Software Foundation\Tomcat5
参考 : http://www.atmarkit.co.jp/fjava/rensai2/jspservlet13/jspsevlet13_1.html

MVCのサンプルを動かしたいのですが、うまく動作してくれません。
Servlet/JSP/Beanでの連携でHelloWorldレベルのサンプルを動作させたいの
ですが、下記の出力結果がでてしまい、どうしてもうまく動いてくれません。
# 他のスレッドを見て、環境変数などを何度も見直しているんですが…
ちなみにコンパイルやServlet単体、Servlet+Beanのサンプルは問題ありません。
有識者の方々、どうかアドバイスをください。m(_ _)m

■概要
==========================
htmlからPOSTで適当な文字列をクエリ送信。
Servletが受け取り、Beanを呼出。
クエリ送信の内容をJSPで出力。

以下ソースと出力結果です。
※ソースはコメントを抜いてます。

■MVCHtml.html
==========================
<html>
<head>
<title>MVCHtml</title>
</head>
<body>
<h1>MVCHtml.html</h1>
<form method="POST" action="Hello">
<table border="1">
<tr>
<th align="right" valign="top">文字列:</th>
<td><input name="message" size="40" maxlength="255" /></td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="submit" value="送信" />
<input type="reset" value="中止" />
</td>
</tr>
</table>
</form>
</body>
</html>

■MVCJsp.jsp
==========================
<%@ page contentType="text/html;charset=Windows-31J" %>
<jsp:useBean id="MVCBean" class="MVCBean" scope="request"/>
<HTML>
<BODY>
<jsp:getProperty name="MVCBean" property="msg" />
</BODY>
</HTML>

■MVCServlet.java
==========================
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class MVCServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
req.setCharacterEncoding("Windows-31J");
MVCBean bn = new MVCBean();
bn.setMsg(req.getParameter("message"));
req.setAttribute("MVCBean", bn);
getServletContext().getRequestDispatcher("/MVCJsp.jsp").forward(req, res);
}
}

■MVCBean.java
==========================
public class MVCBean {
private String msg;

MVCBean () {
msg = "Hello MVCBean!!!";
}
public String getMsg () {
return msg;
}
public void setMsg (String msg) {
this.msg = msg;
}
}

■web.xml
==========================
<web-app>
<servlet>
<servlet-name>Hello</servlet-name>
<servlet-class>MVCServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
</web-app>

■環境変数
==========================
JAVA_HOME=C:\java
Path=.;C:\java\bin;
CLASSPATH=.;C:\Program Files\Apache Software Foundation\Tomcat5\common\lib\servlet-api.jar;C:\Program Files\Apache Software Foundation\Tomcat5\common\lib\jsp-api.jar;

■出力結果
=============================
type ??????

?????

?? The server encountered an internal error () that prevented it from fulfilling this request.

??

org.apache.jasper.JasperException: /MVCJsp.jsp(2,0)
org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:39)
org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:357)
org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:141)
org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1217)
org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1116)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)
org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2213)
org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2219)
org.apache.jasper.compiler.Node$Root.accept(Node.java:456)
org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2163)
org.apache.jasper.compiler.Generator.generate(Generator.java:3261)
org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:244)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:422)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:507)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:274)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
MVCServlet.doPost(MVCServlet.java:26)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
javax.servlet.http.HttpServlet.service(HttpServlet.java:810)

kokko
会議室デビュー日: 2004/07/11
投稿数: 7
投稿日時: 2004-07-11 18:20
追加情報です。???で表示されていたエラーメッセージを英語で
表示できるようになりました。

org.apache.jasper.JasperException: /MVCJsp.jsp(2,0) The value for the useBean class attribute MVCBean is invalid.

logsでは、

2004-07-11 18:09:26 StandardWrapperValve[Hello]: Servlet.service() for servlet Hello threw exception

こんなメッセージも出ていました。
# Helloは<servlet-name>です。

今日も一日この問題と向き合って過ごすのかぁ。はぁ…(;_;)
心当たりのある方、どうかご教示お願い致します。
kokko
会議室デビュー日: 2004/07/11
投稿数: 7
投稿日時: 2004-07-11 19:15
JSPの下記一文を削除したら、望み通りの結果が表示されました!

<jsp:useBean id="MVCBean" class="MVCBean" scope="request" />

一応解決したのですが、しっくりきていません。
サンプルに則って作成していましたし、この一文がないと
scopeの設定ができないのではないでしょうか?
syo
常連さん
会議室デビュー日: 2003/08/17
投稿数: 43
投稿日時: 2004-07-11 22:21
お世話になっております。

JavaBeanとして処理を行う場合、Serializableインタフェースをimplementsする必要があります。MVCBeanクラスにおいてimplements Serializableを付加してみてください。
kokko
会議室デビュー日: 2004/07/11
投稿数: 7
投稿日時: 2004-07-12 00:26
引用:

JavaBeanとして処理を行う場合、Serializableインタフェースをimplementsする必要があります。MVCBeanクラスにおいてimplements Serializableを付加してみてください。


syoさん、ご回答ありがとうございます!
ご助言を受けてSerializableを追加してみましたが、
結果は変わりませんでした。(下記の参照)

import java.io.Serializable;
public class MVCBean implements Serializable {..略..}

しかし、Serializableについては勉強になりました。m(_ _)m
わたびん
常連さん
会議室デビュー日: 2003/02/26
投稿数: 24
投稿日時: 2004-07-12 00:34
JSPの上でのエラーにみえるのですが、
もしかしたらJSPソースを拝見させていただければ
回答しやすいかもしれません。
kokko
会議室デビュー日: 2004/07/11
投稿数: 7
投稿日時: 2004-07-12 00:39
目を留めてくださりありがとうございます。
ソースは上に書いてましたが、もう一度載せますね。
2行目のuseBeanでエラーとなっているようなんです…。

■MVCJsp.jsp
<%@ page contentType="text/html;charset=Windows-31J" %>
<jsp:useBean id="MVCBean" class="MVCBean" scope="request"/>
<HTML>
<BODY>
<jsp:getProperty name="MVCBean" property="msg" />
</BODY>
</HTML>

kokko
会議室デビュー日: 2004/07/11
投稿数: 7
投稿日時: 2004-07-12 05:36
解決しました!
MVCBeanクラスにpackageを設定していなかったのが原因でした。
つまりJSPからMVCBeanへの参照ができなったということです。
色々なページを探しまくってよーやく解決できました。
取り急ぎ、皆様に感謝です。

ただ、同様なエラーのケースで明示的に
<%@ page import="MVCBean" %>
とするとできるよ、という回答例も見つかりましたが、これは駄目でした。
やはり同様にMVCBeanクラスが参照できないようです。
# Tomcat3ではできたという噂も。。。

参考:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1716&forum=12

そこで新たに疑問が沸いたのですが、
無名パッケージでBeanを作成すると、JSPから事前にServletのソースコードを
生成する際にJSPからWEB-INF/classes配下のBeansすらも参照できないのは
なぜなのでしょうか?
パッケージ化して参照させる必要はないように思えるのですが…。
的外れな質問かも知れませんが、どうかご教示ください!
# これだけのことに数日間、頭を悩ませたせいかどうしても
# 気になってしまいまして…。

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