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