次に、JavaサーブレットのHelloFormクラスとHelloActionクラスを作成しますが、その前にソース・フォルダーとJavaパッケージを作成する必要があります。
まず、「Hello」プロジェクトを右クリックして[新規のソース・フォルダー]を選択します。
図16 新規ソース・フォルダーの作成
すると、[新規ソース・フォルダー]画面が表示されるので、[プロジェクト名]で「Hello」を参照し、[フォルダー名]で「WEB-INF/src」を参照して、[終了]ボタンを選択します。
これで、「ソース・フォルダー」の作成は完了したので、次にJavaパッケージを作成します。先ほど作成した「ソース・フォルダー」(「WEB-INF/src」)で右クリックして、新規の[Java パッケージ]を選択します。
図17 Javaパッケージの作成
[ソース・フォルダー]で「Hello/WEB-INF/src」を参照し、[名前]で「hello」と入力して[終了]ボタンを選択します。同様の操作で「hello.form」パッケージも作成します。これで、新規のJavaパッケージの作成は完了です。
Javaパッケージを作成したら、「hello.form」パッケージ配下に以下の.javaファイル(HelloForm.java)を作成します。
HelloForm.java |
package hello.form;
import org.apache.struts.action.ActionForm;
/**
* HelloForm.java
*/
public class HelloForm extends ActionForm {
private String name;
/**
*
* @return
*/
public String getName() {
return name;
}
/**
*
* @param name
*/
public void setName(String name) {
this.name = name;
}
} |
|
「hello」パッケージ配下に、以下の.javaファイル(HelloAction.java)を作成します。
HelloAction.java |
package hello;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import hello.form.HelloForm;
/**
* HelloAction.java
*/
public class HelloAction extends Action {
Log log = LogFactory.getLog(HelloAction.class);
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
request.setCharacterEncoding("Windows-31J");
HelloForm helloForm = (HelloForm) form;
log.info(" user = "+helloForm.getName());
return mapping.findForward("success");
}
} |
|
これで、Eclipse上での作業は完了です。サーブレットの中で行われるサーバ側の処理についても、今後の連載で随時紹介していきます。
今度はWEB-INFフォルダのstruts-config.xmlを以下の内容に編集します。内容については次回説明します。
struts-config.xml |
<?xml version="1.0" encoding="Shift-JIS" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<!-- ========================= Form Bean Definitions -->
<form-beans>
<form-bean name="HelloForm" type="hello.form.HelloForm" />
</form-beans>
<!-- ========================= Global Exception Definitions -->
<global-exceptions>
</global-exceptions>
<!-- ========================= Global Forward Definitions -->
<global-forwards>
</global-forwards>
<!-- ========================= Action Mapping Definitions -->
<action-mappings>
<action
attribute="HelloForm"
input="/pages/Who.jsp"
name="HelloForm"
path="/hello"
type="hello.HelloAction"
scope="session"
validate="true">
<forward name="success" path="/pages/Hello.jsp" />
</action>
</action-mappings>
<!-- ========================== Message Resources Definitions -->
<!-- ========================== Plug Ins Configuration -->
<!-- ========================== Tiles plugin -->
<!-- ========================== Validator plugin -->
</struts-config> |
|
おわびと訂正のお知らせ
上記struts-config.xmlについて、「<form-bean name="HelloForm" 」を「<form-bean name="helloForm" 」と表記したり、「attribute="HelloForm"」を「attribute=" HelloForm "」と表記したり、「name="HelloForm"」を「name=" HelloForm "」と表記するなど、間違いが多数あり、修正させていただきました。
内容について正確を期せずに混乱を招いた点、読者の皆様におわび申し上げます(2008年8月29日)。
アクション・フォームBeansでは、Webブラウザからのリクエストデータを取得する時に、どの文字エンコード(文字エンコーディング)方式を使用しているかの情報を得る(setCharacterEncodingメソッドなど)まえにリクエストデータを取得します。そのため、日本語の文字化けが発生します。
日本語の文字化け対応を防ぐには、Tomcatのサンプルプログラムとして提供されているSetCharacterEncodingFilter.javaを利用します。
- PKG\Hello\WEB-INF\src配下にフォルダ「filters」を作成
- 作成したfiltersに「%TOMCAT_HOME%\webapps\examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.java」をコピー
- Eclipseで[プロジェクト・エクスプローラー]の「Hello」を選択して右クリックをし、[リフレッシュ]を選択
- Eclipseで[プロジェクト]の[クリーン]を選択して、Helloプロジェクトをコンパイル
- PKG\Hello\WEB-INF\web.xmlに以下の部分を追加(「add start」から「add end」まで)
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
……【略】……
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- add start -->
<filter>
<filter-name>EncodeFilter</filter-name>
<filter-class>filters.SetCharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Shift_JIS</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--add end -->
<servlet>
……【略】……
</web-app> |
6.完了したら、Eclipse上から「Tomcat起動」アイコン(猫マーク)を押して、再起動
これで、文字化けの対応は完了です。 Javaの文字エンコーディングについて詳しく知りたい読者は、以下の記事を参考にしてください。
では、いよいよ動かしてみることにしましょう。Eclipseで[プロジェクト]の[クリーン]を選択してHelloプロジェクトをコンパイルします。
エラーが発生しないことが確認できたら、コンテキストパスを設定します。コンテキスト(Context)とは、プログラムが処理を実行する際の判断材料となるものです。プロジェクトの配置状況や、条件などを設定できます。こちらも、詳細は次回説明します。
Tomcatへ「Hello」プロジェクトの配置状況を伝えるため、「/TOMCAT_HOME/conf/server.xml」に以下のコンテキストパスを設定(追記)します。
<Context path="/hello" docBase="Helloプロジェクトの位置" /> |
Apacheのサイトによると、「Tomcat 6 では,Tomcat 4.x と異なり, <Context> 要素を直接 server.xml ファイルに置くことは推奨されない。」とありますが、Tomcatを再起動しないとコンテキストパスを再ロードしてくれないということなので、コンテキストを変更した際はTomcatを再起動すれば問題ありません(2008年8月29日追記)。
コンテキストパスの設定場所は、<Host>タグの中に設定します。例としては、以下のようになります。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
……【略】……
<Context path="/hello" docBase="C:\PKG\Hello" />
</Host> |
完了したら、Eclipse上から「Tomcat起動」アイコン(猫マーク)を押して、起動してみてください。コンソールが何やら動きだしましたね。早速確認してみましょう。Webブラウザから以下のURLを参照してみてください。
http://localhost:8080/hello/pages/Who.jsp |
すると、どうでしょうか。あなたが作成した画面がWebアプリケーションとして動作しました。
図18 質問画面
ここで終わりではありません。「あなたの名前は?」と聞かれている横のテキストボックスにあなたの名前を入力して「OK」ボタンを押してみてください。
図19 回答画面
画面で「ようこそ、XXXさん!」(XXXは前の画面のテキストボックス内に入力した文字)と表示されましたね! おめでとうございます。Webアプリケーションが見事に動きました!
このように、Strutsを使ったWebアプリケーション開発はそれほど難しいものではないということが分かっていただけたでしょうか?
次回第3回からは、今回のサンプルアプリケーションを基に、今回説明できなかったTomcat・Strutsの設定ファイルやソースコードを見ながら、サーバとクライアントの関係などのWebアプリケーションの常識について詳しく説明していく予定です。
眞野 寿彦(まの としひこ)
株式会社メセナ・ネットコム所属
SEとして充実した日々を送っている。現在はStrutsを使ったWebアプリケーション開発を担当中。「信頼されるプロジェクトマネジャー」を目指し、自分に必要なことを常に考え、行動し、「真の技術者」として日々成長している。
趣味はボウリング、ビリヤード、ダーツ
尊敬する人はティム・バーナーズ=リー