ももらぼっ!にっき


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 (2004年07月01日 22:15)

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