ももらぼっ!にっき


2004年07月01日 [長年日記]

_ 青いバラ。

ついに開発に成功したらしい。

_ ふんころがし。

昨日の漫画喫茶でのこと。

読みたかった漫画を読み終えてしまって、でもまだ会計をするには中途半端な時間で。 暇つぶしにスカラベちんのサイトでも行ってみようかとぐぐってみたら、こんなサイトを発見した。

ふーむ。「スカラベ」ってふんころがしの仲間だったのか…。 示したサイトだとよいことがいろいろ書いてあるけど、 一般的に言ってあんまり良いイメージのない虫な気がする。 知ってる上でのこのHNなんでしょーか?>スカラベちん

_ [Java][Struts] まずは簡単なログイン画面を作ってみよう。

strutsを使ったWEBアプリケーションの最小構成が前回サンプルとして動かした struts-blank.war らしいので、 これをベースにすることとする。

そうそう。 これを作るのに、この本をかなり参考にした。 作者様と貸してくれた後輩O君に感謝m(_ _)m

フォルダ構成作成。

まずは、こんな感じでwarファイルをstudy1としてコピー・展開する。

C:\>mkdir study1
C:\>cd study1
C:\study1>copy [struts-home]\webapps\struts-blank.war
C:\study1>jar xf struts-blank.war
C:\study1>del struts-blank.war

んで、中を見るといらなそうなのがあるので、さくさく削除する。*1

C:\study1>rmdir /s pages
C:\study1>del index.jsp
C:\study1>rmdir /s WEB-INF\src\java
C:\study1>rmdir /s WEB-INF\classes

ソース。

とりあえず、最小限のソースを書いてみる。どこに何を作るかはこんな感じで。

study1\index.jsp  ログイン用フォーム画面
study1\top.jsp ログイン後の最初の画面
study1\WEB-INF\src\study1\LoginAction.java  ログイン用アクションクラス
study1\WEB-INF\src\study1\LoginForm.java  ログイン用アクションフォームクラス

まずはindex.jsp。 IDとパスワードを入力してsubmitできるだけの単純な画面。

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:html>
<head>
  <title>ログイン画面</title>
</head>
<body>
<html:form action="/login">
  ログインID:<html:text property="id" /><br />
  パスワード:<html:password property="password" /><br />
  <html:submit value="ログイン" />
</html:form>
</body>
</html:html>

続いて、top.jsp。 とりあえず、ログインした人に挨拶をしておこう。

<%@ 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>
<p>
  こんにちは、<bean:write name="LoginForm" property="id" />さん。
</p>
</body>
</html:html>

次は、LoginForm.java。 idプロパティとpasswordプロパティがあるだけの単純なJavaBeans。 ActionFormから派生させなきゃいけないことに注意しよう。

package study1;

import org.apache.struts.action.ActionForm;

public class LoginForm extends ActionForm
{
  private String id;
  private String password;

  public String getId() { return this.id; }
  public void setId(String id) { this.id = id; }

  public String getPassword() { return this.password; }
  public void setPassword(String password) { this.password = password; }
}

最後に、LoginAction.java。 Actionクラスから派生させて、executeメソッドをオーバーライドすればよいみたい。 まだ認証部分は作らずに、常に成功するとして単純にforward先を指定するだけにしてみよう。

package study1;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class LoginAction extends Action
{
  public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest request,
        HttpServletResponse response)
        throws Exception
  {
    return mapping.findForward("success");
  }
}

struts-config.xml

これで、ソースはできたので、作ったソースたちのいろんな定義をstruts-config.xmlに書いてあげよう。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <form-beans>
    <form-bean name="LoginForm" type="study1.LoginForm" />
  </form-beans>
  <action-mappings>
    <action name="LoginForm" path="/Login" type="study1.LoginAction">
      <forward name="success" path="top.jsp" />
    </action>
  </action-mappings>
</struts-config>

*1  必要ならまた展開すれば良いだけだしね

_ コンパイル。

んで、これでモノが揃ったので、コンパイル。 WEB-INF\srcにbuild.xmlがあるので、たぶんAntが使えるはず。

C:\study1>cd WEB-INF\src
C:\study1\WEB-INF\src>ant compile
Buildfile: build.xml

prepare:

resources:

BUILD FAILED
C:\study1\WEB-INF\src\build.xml:41:  C:\study1\WEB-INF\src\java not found.

Total time: 1 second

ぎゃ。 最初にいろいろ消すときに消しすぎてしまったらしい。 とりあえず、build.xmlをいじって、エラーが出ないようにしてしま・・・おうと思ったけど、 今は使用しないリソースファイルの置き場が WEB-INF\src\java みたいなので、 今後のためにjavaフォルダを空っぽで作成しておくことにしよう。

C:\study1\WEB-INF\src>mkdir java
C:\study1\WEB-INF\src>ant compile
Buildfile: build.xml

prepare:

resources:

compile:
    [javac] Compiling 2 source files to C:\study1\WEB-INF\classes
    [javac] C:\study1\WEB-INF\src\study1\LoginAction.java:3: パッケージ javax.servlet.http は存在しません。
    [javac] import javax.servlet.http.HttpServletRequest;
    [javac]                           ^
    [javac] C:\study1\WEB-INF\src\study1\LoginAction.java:4: パッケージ javax.servlet.http は存在しません。
    [javac] import javax.servlet.http.HttpServletResponse;
    [javac]                           ^
    [javac] C:\study1\WEB-INF\src\study1\LoginAction.java:15: シンボルを解決できません。
    [javac] シンボル: クラス HttpServletRequest 
    [javac] 場所    : study1.LoginAction の クラス
    [javac] 				HttpServletRequest request,
    [javac]                                 ^
    [javac] C:\study1\WEB-INF\src\study1\LoginAction.java:16: シンボルを解決できません。
    [javac] シンボル: クラス HttpServletResponse 
    [javac] 場所    : study1.LoginAction の クラス
    [javac] 				HttpServletResponse response)
    [javac]                                 ^
    [javac] エラー 4 個
BUILD FAILED
C:\study1\WEB-INF\src\build.xml:55: Compile failed; see the compiler error output for details.

Total time: 2 seconds

え〜っと…? 今度は、Servlet関連のclasspathが指定されていないようだ。 build.xmlにTomcatのservletapi.jarを見るように修正を入れよう。 ついでに、Project settingsもいじっておく。

C:\study1\WEB-INF\src>copy build.xml build.xml.org
(..ソース修正..)
C:\study1\WEB-INF\src>diff -u build.xml.org build.xml
--- build.xml.org	2004-06-28 13:31:09.846140800 +0900
+++ build.xml	2004-06-28 13:52:40.281696000 +0900
@@ -2,7 +2,7 @@


     <!-- Local system paths -->
-    <property name="servlet.jar" value="/javasoft/lib/servlet.jar"/>
+    <property name="servlet.jar" value="C:\java\tomcat_5.0\common\lib\servlet-api.jar"/>
     <property name="jdbc20ext.jar" value="/javasoft/lib/jdbc2_0-stdext.jar"/>
         <!-- NOTE: If "dist" target is used, a local
              "projects/lib" directory will be utilized or created -->
@@ -10,8 +10,8 @@


     <!-- Project settings -->
-    <property name="project.title" value="Jakarta Struts Blank "/>
-    <property name="project.distname" value="blank"/>
+    <property name="project.title" value="study1"/>
+    <property name="project.distname" value="study1"/>
     <property name="project.version" value="1.1"/>


@@ -22,6 +22,7 @@

     <!-- classpath for Struts 1.1 -->
     <path id="compile.classpath">
+        <pathelement path ="${servlet.jar}"/>
         <pathelement path ="lib/commons-beanutils.jar"/>
         <pathelement path ="lib/commons-digester.jar"/>
         <pathelement path ="lib/struts.jar"/>
C:\study1\WEB-INF\src>ant compile
Buildfile: build.xml

prepare:

resources:

compile:
    [javac] Compiling 2 source files to C:\study1\WEB-INF\classes

BUILD SUCCESSFUL
Total time: 2 seconds

よし。今度こそ成功。

デプロイ。

そしたら、warファイルを作成しよう。

C:\study1\WEB-INF\src>ant dist
Buildfile: build.xml

dist:
      [jar] Building jar: C:\projects\lib\study1.jar
      [war] Building war: C:\projects\lib\study1.war
      [war] Warning: selected war files include a WEB-INF/web.xml which will be
ignored (please use webxml attribute to war task)

BUILD SUCCESSFUL
Total time: 1 second

なんかWarningが出てるけどとりあえず無視して、 出来上がったstudy1.warを[tomcat-home]\webappsにコピーしてtomcatを再起動させる。

C:\study1\WEB-INF\src>copy \projects\lib\study1.war [tomcat-home]\webapps
C:\study1\WEB-INF\src>net stop "Apache Tomcat"
C:\study1\WEB-INF\src>net start "Apache Tomcat"

動かしてみる。

これで、http://localhost:8080/study1/index.jspでログイン画面が出るはず…だったんだけど、 なぜか、500のエラーが。 なんか、エラーメッセージが文字化けしてるけどとりあえずほっといて、スタックトレースを見てみる。

javax.servlet.ServletException: Cannot retrieve mapping for action /login
  org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
  org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
  org.apache.jsp.index_jsp._jspService(index_jsp.java:80)
  org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
  org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:298)
  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)

/loginってアクションのmappingが見つからないって言ってるのかな? 作ってあるんだけどなぁ…。う〜む。。。。あ! もしかして、大文字と小文字を区別するのかな? 直して再実行してみよう。

C:\study1\WEB-INF\src>cd ..
C:\study1\WEB-INF>copy struts-config.xml struts-config.xml.org
(..ソース修正..)
C:\study1\WEB-INF>diff -u struts-config.xml.org struts-config.xml
--- struts-config.xml.org       2004-06-28 14:01:12.868760000 +0900
+++ struts-config.xml   2004-06-28 14:18:51.931617600 +0900
@@ -7,7 +7,7 @@
     <form-bean name="LoginForm" type="study1.LoginForm" />
   </form-beans>
   <action-mappings>
-    <action name="LoginForm" path="/Login" type="study1.LoginAction">
+    <action name="LoginForm" path="/login" type="study1.LoginAction">
       <forward name="success" path="top.jsp" />
     </action>
   </action-mappings>
C:\study1\WEB-INF>cd src
C:\study1\WEB-INF\src>ant dist
C:\study1\WEB-INF\src>copy \projects\lib\study1.war [tomcat-home]\webapps
C:\study1\WEB-INF\src>net stop "Apache Tomcat"
C:\study1\WEB-INF\src>net start "Apache Tomcat"

今度こそ成功。 http://localhost:8080/study1/index.jspを表示して、ログインIDに適当な名前を入れて *1 ログインボタンを押したら無事に

こんにちは、hogeさん

と言われた。

次回はこれをベースにいろいろと手を加えていこう。

7/2追記。

すっごい忘れていたけど、このときからstruts環境を自分マシンにしているので、

  • jdk 1.4.2_04
  • Tomcat 5.0.25
  • Struts 1.1

という環境に移行している。 インストール記のころとはちょっと環境が違っているので注意。*2

*1  パスワードチェックしてないので別に何でもOK。今回は「hoge」と入れてみている。

*2  とは言っても、Tomcatのサービス名が違うくらいしか今のところ違いはないけどね。

本日のツッコミ(全1件) [ツッコミを入れる]

_ Orator [「スカラベ」で、DQM+(by 吉崎観音)を連想してしまうのは私だけですかそうですか。]


2004年07月02日 [長年日記]

_ [Struts][Java] 前回の補足。

前回の文章だと結構すんなり完成したように見えるけど、 実はあれ以外にもいろいろエラーが出てきてしまっていたりした。 「こんなエラーが発生したときにはここを疑って直すとよいかもよ」という文書って あんまり見かけないので、ちょっと書いてみることとする。

前回の成功したソースたちをベースに、少しずつエラーの出るソースに変えながら どんなエラーが発生するのか見てみよう。

JSPの終了タグを忘れた場合。

C:\study1\WEB-INF\src>pushd ..\..
C:\study1>copy index.jsp index.jsp.org
(..ソース修正..)
C:\study1>diff index.jsp.org index.jsp
8c8
<       ログインID:<html:text property="id" /><br />
---
>       ログインID:<html:text property="id"><br />
C:\study1>popd
C:\study1\WEB-INF\src>ant dist
C:\study1\WEB-INF\src>copy \projects\lib\study1.war [tomcat-home]\webapps
C:\study1\WEB-INF\src>net stop "Apache Tomcat"
C:\study1\WEB-INF\src>net start "Apache Tomcat"

こんな感じで、<html:text>の終了タグを忘れちゃった場合は、下記のようなエラーが発生した。

org.apache.jasper.JasperException: /index.jsp(11,0) ???? "&lt;/html:form" ???????????
  org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:39)
  org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:376)
  org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:134)
  org.apache.jasper.compiler.Parser.checkUnbalancedEndTag(Parser.java:1706)
  (...以下略...)

JSPで属性値のダブルクォーテーションを閉じ忘れちゃった場合。

こんどは、property属性の値のダブルクォーテーションを閉じ忘れた場合。

C:\study1\WEB-INF\src>pushd ..\..
(..ソース修正..)
C:\study1>diff index.jsp.org index.jsp
8c8
<       ログインID:<html:text property="id" /><br />
---
>       ログインID:<html:text property="id /><br />
C:\study1>popd
C:\study1\WEB-INF\src>ant dist
C:\study1\WEB-INF\src>copy \projects\lib\study1.war [tomcat-home]\webapps
C:\study1\WEB-INF\src>net stop "Apache Tomcat"
C:\study1\WEB-INF\src>net start "Apache Tomcat"

エラーを見ると、次の行のダブルクォーテーションまでを文字列とみなしていて、 そのせいでエラーが出ているようだ。

org.apache.jasper.JasperException: /index.jsp(9,46) ?????????
  org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:39)
  org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:376)
  org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:90)
  org.apache.jasper.compiler.Parser.parseAttribute(Parser.java:193)
  (...以下略...)

この二つを見る限り、JSPのパースエラーが発生するときは JasperException が発生するのかな?

struts-config.xmlがパースエラーになるような場合。

今度は、struts-config.xmlをパースエラーになるようにさせてみた。

C:\study1\WEB-INF\src>pushd ..
C:\study1\WEB-INF>copy struts-config.xml struts-config.xml.org
C:\study1\WEB-INF>diff struts-config.xml.org struts-config.xml
7c7
<     <form-bean name="LoginForm" type="study1.LoginForm" />
---
>     <form-bean name="LoginForm" type="study1.LoginForm />
C:\study1\WEB-INF>popd
C:\study1\WEB-INF\src>ant dist
C:\study1\WEB-INF\src>copy \projects\lib\study1.war [tomcat-home]\webapps
C:\study1\WEB-INF\src>net stop "Apache Tomcat"
C:\study1\WEB-INF\src>net start "Apache Tomcat"

エラーを見るとActionMappingsかActionFormBeansが見つからないよーって言っている。 ちゃんとファイルを作ったはずなのにこのように言われるときは、struts-config.xmlを 疑えということか。

javax.servlet.ServletException: Cannot find ActionMappings or ActionFormBeans collection
  org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
  org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
  org.apache.jsp.index_jsp._jspService(index_jsp.java:80)
  org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
  org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:298)
  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)

_ [Java][Eclipse] eclipseに入れたPlugin。

忘れないように覚書として。 会社の環境にあわせて、eclipseはちと古い2.1.2を使っている。

*1  デフォルトのままだと「パースペクティブのカスタマイズ」に出てこなかったので、[eclipse-home]\features\viPluginFeature_0.2.10\feature.xmlの//feature/requires/*をばっさり削除してやった。こんなことしていいのかは不明(汗)

_ [tDiary] 注釈。

ありゃ? 今までなら、こんな感じ(コレ→*1)に出ていた注釈がサイトぶち壊れ→復旧という工程を踏んでるうちに出ないようになっていたようだ。

さっくり、footnote.rbをpluginフォルダに突っ込んで対応。 ここ数回の更新では注釈を結構入れていたのに気づかなかった…_|‾|○

*1  おひょ。


2004年07月06日 [長年日記]

_ [TTBase] タスクトレイをアクティブにする Ver.1.10 仮公開。

最近「仮」ばっかりだけど、を元に修正をしてみた版をリリースした。 これで、WinXP以上の環境でもタスクトレイがアクティブになってくれるはず。

この版ではWin2003でしか動作を確認していない。 大丈夫だとは思うが、Win2k以下やWin9x系で動かなくなっていたら教えてほしい。

そうそう。 XPだと「アクティブでないインジケータを隠す」機能があるが、これを使ってタスクトレイをアクティブにしたときは全てのインジケータ(アイコン)を表示してあげることができるようにしてみた。

ちなみに、連続してこれを使うと、アイコンが表示されたり隠れたりしてくれる。

別に意図した動作ではなかったのだが、結構いい感じかも。


2004年07月12日 [長年日記]

_ [TTBase] CVSリポジトリだけ更新。

以前、naoさんが作ってくれたTTBPlugin_SetTaskTrayIconを使いたかったんだけど、SDKが変わってなかったので見よう見まねで変更してみた。

一応、それをベースに作ったプラグインは意図した通りに動いたのであっているのだろう。

後は、C版、Delphi版のテンプレートをそのままコンパイルしてみてうまくいくかどうかを確かめたらリリースしてしまうつもり。 しばしお待ちを…。

_ [TTBase] キーボードマクロプラグイン。

ってのを作ってみた。

複数ウィンドウを行ったりきたりしながら少しずつデータをコピペしなきゃいけないときとか、 キーボードマクロ機能のないエディタを使わなきゃいけないとき(VBとかVSとかとか)に 効力が発揮される予定。

まぁ、まだ上記の新TTBaseをリリースしていないので公開はできないんだけどね。


2004年07月13日 [長年日記]

_ [TTBase] v1.0.15 リリース

昨日の報告通り、コンパイルの確認は終わったので、v1.0.15としてリリースした。 Readme.txtを変え忘れていたのでついでにこちらも修正。

これで、TTBPlugin_SetTaskTrayIcon APIが使えるようになるはず。

_ [TTBase] キーボードマクロ Ver.1.00 仮公開

相変わらず「仮」の文字は一向に取れないが、v1.0.15をリリースしたのでこいつも併せて公開。

今日リリースのv1.0.15がないとTTBaseが固まるので注意しよう。

本日のツッコミ(全1件) [ツッコミを入れる]

_ 藤代千尋 [v1.0.13 で見事に固まりました。(^^; 試しにフォルダ作成を記録・再生してみたところ、うまくいきました。(^..]


2004年07月26日 [長年日記]

_ [買った] DiMAGE Xg

デジカメを買ってしまった。

最近のデジカメはボタンとかいっぱいあって私みたいな機械オンチにゃ使えないだろー、とか思ってたんだけど。 結構直感で使えるようになっていた。 この分だと最近の携帯電話*1の方が使うのが難しいやーね。

*1  いや、ぴっちだけどね。私のは(T-T)

_ [] 名古屋旅行。

に行ってきた。 ↑のデジカメを買ったその日に新幹線に乗って。

旅行に行くからデジカメ買ったのか、デジカメ買ったから旅行に行ったのか。 まぁそんなことはともかく、海の日があった3連休で名古屋まで遊びに行ってきた。目的は…決まってなかったけど、とりあえず金の鯱をぽけーっと見上げて、きしめんみそかつえびふりゃーと食い倒れて来れればいいかなーなんて思いながら。

とゆーわけで、もう一週間以上経ってるので記憶が既にあいまいだけど旅行記を少しばかし書いてみよーかな。

続きはまた…。

本日のツッコミ(全3件) [ツッコミを入れる]

_ 藤代千尋 [おお〜、にっきらしい。(^^;]

_ 藤代千尋 [2 週間たって、さらに記憶は曖昧に。(^^;]

_ うえっじ [で、ついに1ヶ月経ってしまったと……]