何回も質問してすみません。
「Java+MySQL+Tomcatで作る掲示板とブログ」の掲示板の方の動作を一通り試してみて、次に練習として(?)自分の掲示板を作ろうと思って、ログイン画面から作ろうとしているのですが、p167の<%@ page import="jamyto2.*"%>は一体何をしているのでしょうか?
多分自分の作っている環境によって書き換えなければいけない場所だと思うのですが・・・・(単にimport ... という記述は色々解説があるのですが・・)
もし、よろしければ、よろしくお願いします。
「Java+MySQL+Tomcatで作る掲示板とブログ」の掲示板の方の動作を一通り試してみて、次に練習として(?)自分の掲示板を作ろうと思って、ログイン画面から作ろうとしているのですが、p167の<%@ page import="jamyto2.*"%>は一体何をしているのでしょうか?
多分自分の作っている環境によって書き換えなければいけない場所だと思うのですが・・・・(単にimport ... という記述は色々解説があるのですが・・)
もし、よろしければ、よろしくお願いします。
投稿:rapuntuleru[rapuntuleru]/2007年 04月 02日 20時 54分
/更新:2007年 04月 02日 20時 54分
Re:「<%@ page import ...」って?
by KILROY[KILROY]
> 何回も質問してすみません。
いや、この業界(情報処理ね)、“教えて君”のほうが成長が速い、というセオリーがあるので、質問するのは基本おkである。つーか、できる開発者は教えたがりであり、同時に自分は教え上手だと思っているので、お手上げの場合はさっさと訊くのが正解である。
なお、プロの場合、無駄に悩んでると皺寄せが他の奴のところに行くので、「あのさぁ、ちょっと教えてくんない?」と言いやすい雰囲気を普段から作っておくのも職場の心がけの一つである。
> P.167の<%@ page import="jamyto2.*"%>は一体何をしているのでしょうか?
> 多分自分の作っている環境によって書き換えなければいけない場所だと
> 思うのですが……(単にimport ... という記述は色々解説があるのですが…)
いや、ぶっちゃけただの import なのだよ。(^_^;)
JSP というのは、
以下、蛇足。
Tomcat は .jsp ファイルにアクセスされたときに .class を探すわけだが、そのとき .jsp ファイルがいつ作られたかと、 .class ファイルがいつ作られたかをチェックする。 .class ファイルより .jsp ファイルが新しければ、因果関係によって .jsp ファイルは後から作られたものだというのが分るから、Tomcat は .jsp ファイルから .class ファイルを生成しなおす。
ところが、 .jsp ファイルを変更したら失敗したので古い .jsp ファイルで上書きした場合、上書きされた .jsp ファイルは .class ファイルより古いわけなので、 .class ファイルが更新されないのだ。
結果、「おかしい、プログラム変えたのに動作は元のまんまだ!」みたいなことになる。そこで修正用のルーチンを突っ込んだりすると、今度はファイルが現在時刻で更新されているので修正が効いて泥沼に陥ったりする。
もう一つ、
まあ、偉そうなことを言ってはいるものの私もトレンドに追いついてないんだけどさ。(^_^!)
以上二点、用心なされよ。
いや、この業界(情報処理ね)、“教えて君”のほうが成長が速い、というセオリーがあるので、質問するのは基本おkである。つーか、できる開発者は教えたがりであり、同時に自分は教え上手だと思っているので、お手上げの場合はさっさと訊くのが正解である。
なお、プロの場合、無駄に悩んでると皺寄せが他の奴のところに行くので、「あのさぁ、ちょっと教えてくんない?」と言いやすい雰囲気を普段から作っておくのも職場の心がけの一つである。
> P.167の<%@ page import="jamyto2.*"%>は一体何をしているのでしょうか?
> 多分自分の作っている環境によって書き換えなければいけない場所だと
> 思うのですが……(単にimport ... という記述は色々解説があるのですが…)
いや、ぶっちゃけただの import なのだよ。(^_^;)
JSP というのは、
Tomcat が .jsp ファイルにアクセスされるのを見張っている。
.jsp ファイルにアクセスがかかったら、対応する .class ファイルを探してそれを実行し、結果を返す( CGI みたいなもんだ)。.class ファイルが無かったら、.jsp ファイルを解析し、それを展開して .java ファイルを作り、さらにそれをコンパイルして .class ファイルを作ってから、それを実行してその結果を返す。
ということをしている。で、「page import」というのは、その .java ファイルに突っ込む import 文が書いてあるだけなのだ。ついでに言うと、このあたり、C 言語の #include 文とかと同じようなもの(いわゆるマクロ処理だな)である。以下、蛇足。
Tomcat は .jsp ファイルにアクセスされたときに .class を探すわけだが、そのとき .jsp ファイルがいつ作られたかと、 .class ファイルがいつ作られたかをチェックする。 .class ファイルより .jsp ファイルが新しければ、因果関係によって .jsp ファイルは後から作られたものだというのが分るから、Tomcat は .jsp ファイルから .class ファイルを生成しなおす。
ところが、 .jsp ファイルを変更したら失敗したので古い .jsp ファイルで上書きした場合、上書きされた .jsp ファイルは .class ファイルより古いわけなので、 .class ファイルが更新されないのだ。
結果、「おかしい、プログラム変えたのに動作は元のまんまだ!」みたいなことになる。そこで修正用のルーチンを突っ込んだりすると、今度はファイルが現在時刻で更新されているので修正が効いて泥沼に陥ったりする。
もう一つ、
.jsp ファイルを解析して .java ファイルを作る部分(Tomcat の JSP 処理部分)
.java ファイルを解析して、 .class ファイルを作る部分(Java のコンパイラ)
では、対応する Java のバージョンが違う。 .jsp ファイルに埋め込まれている Java のコード(これを「スクリプトレット」と云う)を解析する部分は、今でも 1.4 以前のコードにしか対応してくれないので、 5.0 固有のコードを書くとエラーになる。これを不親切だと思ってはいけない。「今はスクリプトレットなんか使う時代じゃないんだよ。ちゃんと MVC モデルに則って、カスタムタグなり式言語なり JSTL なりを使って .jsp ファイルからスクリプトレットを追い出しなさい」という、 Tomcat 開発チームの意思表示と思わなければならない。「せっかく JSP 2.0 サポートしてあげたんだからさ」と。まあ、偉そうなことを言ってはいるものの私もトレンドに追いついてないんだけどさ。(^_^!)
以上二点、用心なされよ。
投稿:KILROY[KILROY]/2007年 04月 02日 22時 23分
/更新:2007年 04月 02日 22時 39分
回答ありがとうございます。
なるほど。プラスαまで教えてくださりありがとうございます。
ちゃんとブックマークしておこうと思いますw
なるほど。プラスαまで教えてくださりありがとうございます。
ちゃんとブックマークしておこうと思いますw
投稿:rapuntuleru[rapuntuleru]/2007年 04月 03日 03時 44分
/更新:2007年 04月 03日 03時 44分
> 次に練習として(?)自分の掲示板を作ろうと思って、ログイン画面から
> 作ろうとしているのですが、
じつはあの index.jsp 、ツリーの表示に再帰呼び出しとかを使っていてなかなかの難物だったりする。あの index.jsp からスクリプトレットを追い出そうとすると、「引数つきカスタムタグの再帰呼び出し」みたいなことをしないといけない。
いくらか分りやすく書き直してみたので、参考になれば。
なお、下記のプログラムでパッケージが「bbs」になっている部分は、「jamyto2」と読み替えていただきたい。
> 作ろうとしているのですが、
じつはあの index.jsp 、ツリーの表示に再帰呼び出しとかを使っていてなかなかの難物だったりする。あの index.jsp からスクリプトレットを追い出そうとすると、「引数つきカスタムタグの再帰呼び出し」みたいなことをしないといけない。
いくらか分りやすく書き直してみたので、参考になれば。
なお、下記のプログラムでパッケージが「bbs」になっている部分は、「jamyto2」と読み替えていただきたい。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<%@ page language="java" %>
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*, javax.sql.*, javax.naming.*, java.text.*"%>
<%@ page import="bbs.*"%>
<jsp:useBean class="bbs.BbsArticleList" id="articleList" scope="session"/>
<jsp:useBean class="bbs.BbsUser" id="user" scope="session"/>
<html>
<head>
<title>掲示板</title>
</head>
<%!
/*
* ツリー構造を表示するために、再帰呼び出しを使っている。
*/
void getChildren( StringBuffer sbHtml, int intParentId, int intDepth) throws Exception{
DateFormat df = new SimpleDateFormat("yyyy'年'MM'月'dd'日' E'曜日' HH'時'mm'分'");
BbsArticleList articleList = new BbsArticleList();
articleList.setParentId(intParentId);
articleList.makeList();
while(articleList.next()){
BbsArticle article = articleList.getArticle();
sbHtml.append(" <a name=\"" + article.getId() + "\" />\n");
sbHtml.append(" <table style=\"margin-left:" + (intDepth * 30) + ";\">\n");
sbHtml.append(" <tr>\n");
sbHtml.append(" <td>No." + article.getId() + "</td>\n");
sbHtml.append(" <td>" + TextConv.beforeHtml(article.getAuthor()));
sbHtml.append("/" + df.format(article.getDateTime()));
sbHtml.append("<a href=\"delete_1.jsp?id=" + article.getId() + "\">[削除]</a>");
sbHtml.append("<a href=\"edit_1.jsp?id=" + article.getId() + "\">[編集]</a>");
sbHtml.append(" </td>\n");
sbHtml.append(" </tr>\n");
sbHtml.append(" <tr>\n");
sbHtml.append(" <td>【件名】</td>\n");
sbHtml.append(" <td>" + TextConv.beforeHtml(article.getSubject()) + "</td>\n");
sbHtml.append(" </tr>\n");
sbHtml.append(" <tr valign=\"top\">\n");
sbHtml.append(" <td>【本文】</td>\n");
sbHtml.append(" <td>" + TextConv.embedLink(TextConv.beforeHtml(article.getBody())) + "</td>\n");
sbHtml.append(" </tr>\n");
sbHtml.append(" <tr>\n");
sbHtml.append(" <td colspan=\"2\">\n");
sbHtml.append(" <a href=\"write_1.jsp?parent_id=" + article.getId() + "\">コメントを書く</a>\n");
sbHtml.append(" </td>\n");
sbHtml.append(" </tr>\n");
sbHtml.append(" </table>\n");
sbHtml.append("<hr />\n");
getChildren(sbHtml, article.getId(), intDepth + 1);
}
}
%>
<body>
<div>【<%=BbsSettings.strBbsName%>】</div>
<%
if (user.getId() > 0) {
%>
ニックネーム[<%=user.getNickName()%>]さん
<a href="change_password_1.jsp">[パスワードを変更する]</a>
<a href="change_profile_1.jsp">[ユーザ設定を変更する]</a>
<a href="logout.jsp">[ログアウトする]</a>
<%
} else {
%>
<a href="register_1.jsp">[ユーザー登録する]</a>
<a href="login_1.jsp">[ログインする]</a>
<%
}
%>
<hr />
<%
if(user.isAdmin()){
%>
<a href="recover_1.jsp">[削除済み一覧]</a>
<a href="user_1.jsp">[ユーザ一覧]</a>
<hr />
<%
}
%>
<a href="write_1.jsp">[投稿する]</a><a href="search_1.jsp">[検索する]</a><hr />
<%
String strDispTree = request.getParameter("disp_tree");
if (strDispTree != null){
if (strDispTree.equals("true")) {
articleList.setDispTree(true);
} else {
articleList.setDispTree(false);
}
}
if (articleList.isDispTree()) {
%><a href="index.jsp?disp_tree=false">[時系列表示]</a><%
} else {
%><a href="index.jsp?disp_tree=true">[ツリー表示]</a><%
}
articleList.setLimit(5);
int intPage;
String strJumpTo = request.getParameter("jump_to");
String strPage = request.getParameter("page");
if (strJumpTo != null){
intPage = articleList.getPageFromId(Integer.parseInt(strJumpTo));
articleList.setPage(intPage);
} else if (strPage != null) {
intPage = Integer.parseInt(strPage);
articleList.setPage(intPage);
} else {
intPage = articleList.getLastPage();
articleList.setPage(intPage);
}
if (intPage > 1) {
%>
<a href="index.jsp?page=<%=intPage-1%>">前のページ</a>
<%
}
for (int cnt = 1; cnt <= articleList.getLastPage(); cnt += 1){
if (cnt != intPage){
%><a href="index.jsp?page=<%=cnt%>"><%=cnt%></a><%
} else { //現在のページ
%>【<%=cnt%>】<%
}
}
if (articleList.getLastPage() > intPage){
%><a href="index.jsp?page=<%=intPage + 1%>">次のページ</a><%
}
%>
<hr />
<%
DateFormat df = new SimpleDateFormat("yyyy'年'MM'月'dd'日' E'曜日' HH'時'mm'分'");
StringBuffer sbHtml = new StringBuffer();
articleList.setParentId(0);
articleList.makeList();
// 親の表示
while(articleList.next()){
BbsArticle article = articleList.getArticle();
%>
<a name="<%=article.getId()%>" />
<table>
<tr>
<td>No.<%=article.getId()%></td>
<td>
<%=TextConv.beforeHtml(article.getAuthor())%> / <%=df.format(article.getDateTime())%>
<a href="delete_1.jsp?id=<%=article.getId()%>">[削除]</a>
<a href="edit_1.jsp?id=<%=article.getId()%>">[編集]</a>
</td>
</tr>
<tr>
<td>【件名】</td>
<td><%=TextConv.beforeHtml(article.getSubject())%></td>
</tr>
<tr valign="top">
<td>【本文】</td>
<td>
<%=TextConv.embedLink(TextConv.beforeHtml(article.getBody()))%>
</td>
</tr>
<tr>
<td colspan="2">
<a href="write_1.jsp?parent_id="<%=article.getId()%>">コメントを書く</a>
</td>
</tr>
</table>
<hr />
<%
if (articleList.isDispTree()){
// 子の表示
this.getChildren(sbHtml, article.getId(), 1);
}
%><%=sbHtml.toString()%><%
sbHtml = new StringBuffer();
}
%>
</body>
</html>
<%@ page language="java" %>
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*, javax.sql.*, javax.naming.*, java.text.*"%>
<%@ page import="bbs.*"%>
<jsp:useBean class="bbs.BbsArticleList" id="articleList" scope="session"/>
<jsp:useBean class="bbs.BbsUser" id="user" scope="session"/>
<html>
<head>
<title>掲示板</title>
</head>
<%!
/*
* ツリー構造を表示するために、再帰呼び出しを使っている。
*/
void getChildren( StringBuffer sbHtml, int intParentId, int intDepth) throws Exception{
DateFormat df = new SimpleDateFormat("yyyy'年'MM'月'dd'日' E'曜日' HH'時'mm'分'");
BbsArticleList articleList = new BbsArticleList();
articleList.setParentId(intParentId);
articleList.makeList();
while(articleList.next()){
BbsArticle article = articleList.getArticle();
sbHtml.append(" <a name=\"" + article.getId() + "\" />\n");
sbHtml.append(" <table style=\"margin-left:" + (intDepth * 30) + ";\">\n");
sbHtml.append(" <tr>\n");
sbHtml.append(" <td>No." + article.getId() + "</td>\n");
sbHtml.append(" <td>" + TextConv.beforeHtml(article.getAuthor()));
sbHtml.append("/" + df.format(article.getDateTime()));
sbHtml.append("<a href=\"delete_1.jsp?id=" + article.getId() + "\">[削除]</a>");
sbHtml.append("<a href=\"edit_1.jsp?id=" + article.getId() + "\">[編集]</a>");
sbHtml.append(" </td>\n");
sbHtml.append(" </tr>\n");
sbHtml.append(" <tr>\n");
sbHtml.append(" <td>【件名】</td>\n");
sbHtml.append(" <td>" + TextConv.beforeHtml(article.getSubject()) + "</td>\n");
sbHtml.append(" </tr>\n");
sbHtml.append(" <tr valign=\"top\">\n");
sbHtml.append(" <td>【本文】</td>\n");
sbHtml.append(" <td>" + TextConv.embedLink(TextConv.beforeHtml(article.getBody())) + "</td>\n");
sbHtml.append(" </tr>\n");
sbHtml.append(" <tr>\n");
sbHtml.append(" <td colspan=\"2\">\n");
sbHtml.append(" <a href=\"write_1.jsp?parent_id=" + article.getId() + "\">コメントを書く</a>\n");
sbHtml.append(" </td>\n");
sbHtml.append(" </tr>\n");
sbHtml.append(" </table>\n");
sbHtml.append("<hr />\n");
getChildren(sbHtml, article.getId(), intDepth + 1);
}
}
%>
<body>
<div>【<%=BbsSettings.strBbsName%>】</div>
<%
if (user.getId() > 0) {
%>
ニックネーム[<%=user.getNickName()%>]さん
<a href="change_password_1.jsp">[パスワードを変更する]</a>
<a href="change_profile_1.jsp">[ユーザ設定を変更する]</a>
<a href="logout.jsp">[ログアウトする]</a>
<%
} else {
%>
<a href="register_1.jsp">[ユーザー登録する]</a>
<a href="login_1.jsp">[ログインする]</a>
<%
}
%>
<hr />
<%
if(user.isAdmin()){
%>
<a href="recover_1.jsp">[削除済み一覧]</a>
<a href="user_1.jsp">[ユーザ一覧]</a>
<hr />
<%
}
%>
<a href="write_1.jsp">[投稿する]</a><a href="search_1.jsp">[検索する]</a><hr />
<%
String strDispTree = request.getParameter("disp_tree");
if (strDispTree != null){
if (strDispTree.equals("true")) {
articleList.setDispTree(true);
} else {
articleList.setDispTree(false);
}
}
if (articleList.isDispTree()) {
%><a href="index.jsp?disp_tree=false">[時系列表示]</a><%
} else {
%><a href="index.jsp?disp_tree=true">[ツリー表示]</a><%
}
articleList.setLimit(5);
int intPage;
String strJumpTo = request.getParameter("jump_to");
String strPage = request.getParameter("page");
if (strJumpTo != null){
intPage = articleList.getPageFromId(Integer.parseInt(strJumpTo));
articleList.setPage(intPage);
} else if (strPage != null) {
intPage = Integer.parseInt(strPage);
articleList.setPage(intPage);
} else {
intPage = articleList.getLastPage();
articleList.setPage(intPage);
}
if (intPage > 1) {
%>
<a href="index.jsp?page=<%=intPage-1%>">前のページ</a>
<%
}
for (int cnt = 1; cnt <= articleList.getLastPage(); cnt += 1){
if (cnt != intPage){
%><a href="index.jsp?page=<%=cnt%>"><%=cnt%></a><%
} else { //現在のページ
%>【<%=cnt%>】<%
}
}
if (articleList.getLastPage() > intPage){
%><a href="index.jsp?page=<%=intPage + 1%>">次のページ</a><%
}
%>
<hr />
<%
DateFormat df = new SimpleDateFormat("yyyy'年'MM'月'dd'日' E'曜日' HH'時'mm'分'");
StringBuffer sbHtml = new StringBuffer();
articleList.setParentId(0);
articleList.makeList();
// 親の表示
while(articleList.next()){
BbsArticle article = articleList.getArticle();
%>
<a name="<%=article.getId()%>" />
<table>
<tr>
<td>No.<%=article.getId()%></td>
<td>
<%=TextConv.beforeHtml(article.getAuthor())%> / <%=df.format(article.getDateTime())%>
<a href="delete_1.jsp?id=<%=article.getId()%>">[削除]</a>
<a href="edit_1.jsp?id=<%=article.getId()%>">[編集]</a>
</td>
</tr>
<tr>
<td>【件名】</td>
<td><%=TextConv.beforeHtml(article.getSubject())%></td>
</tr>
<tr valign="top">
<td>【本文】</td>
<td>
<%=TextConv.embedLink(TextConv.beforeHtml(article.getBody()))%>
</td>
</tr>
<tr>
<td colspan="2">
<a href="write_1.jsp?parent_id="<%=article.getId()%>">コメントを書く</a>
</td>
</tr>
</table>
<hr />
<%
if (articleList.isDispTree()){
// 子の表示
this.getChildren(sbHtml, article.getId(), 1);
}
%><%=sbHtml.toString()%><%
sbHtml = new StringBuffer();
}
%>
</body>
</html>
投稿:KILROY[KILROY]/2007年 04月 03日 11時 13分
/更新:2007年 04月 03日 11時 22分
おまけまでありがとうございます!
ブックマークしなおしますw
ブックマークしなおしますw
投稿:rapuntuleru[rapuntuleru]/2007年 04月 04日 03時 18分
/更新:2007年 04月 04日 03時 18分