ステップ1~6で学習した内容を基にして、電子フォームを使用するシステムを構築していきます。
■概要
次に示す流れで画面が遷移するシステムを構築します。

メニュー画面から[作成]ボタンをクリックすると、申請書の入力画面が表示されます。
メニュー画面で[作成]ボタン以外のボタンをクリックすると、工事中画面が表示されます。
申請書の入力画面でデータを入力し、[申請]ボタンをクリックすると、申請書の確認画面が表示されます。
申請書の確認画面で[確認]ボタンをクリックすると、メニュー画面に戻ります。
このシステムの処理の流れを次に示します。

(1) 電子フォームを作成する
申請書の入力用の電子フォームと、申請書の確認用の電子フォームを作成します。
申請書の入力用の電子フォーム
次に示す電子フォームを作成します。
作成した電子フォームを「Shoseki」という名前で保存します。

この電子フォームのサンプルファイルは、Windowsの場合は「フレームワークのインストールフォルダ\sample\tutorial\eform」にあります。SolarisおよびLinuxの場合は「/opt/FJSVfcdn/sample/tutorial/eform」にあります。各項目の設定内容については、サンプルファイルを参照してください。
作成するときのポイントを次に示します。
単価と冊数から金額を求める関数式、および各金額の合計を求める関数式を設定して、[計算]ボタンをクリックしたときに関数が実行されるように設定します。
[申請]ボタンをクリックしたときの送信先をWebアプリケーション「AppController」に設定します。
申請書の確認用の電子フォーム
入力用の電子フォーム「Shoseki」を基にして、次に示す電子フォームを作成します。
作成した電子フォームを「Shoseki-Kakunin」という名前で保存します。

この電子フォームのサンプルファイルは、Windowsの場合は「フレームワークのインストールフォルダ\sample\tutorial\eform」にあります。SolarisおよびLinuxの場合は「/opt/FJSVfcdn/sample/tutorial/eform」にあります。各項目の設定内容については、サンプルファイルを参照してください。
入力用の電子フォームから変更する内容を次に示します。
[ファイル]-[電子フォームのプロパティ]をクリックして、[ファイルの概要]タブの[タイトル]を「書籍購入申請書(確認)」に変更します。
[計算]ボタンおよび[リセット]ボタンを削除します。
[書式]-[関数定義]をクリックして表示される関数定義一覧から関数名を削除します。
[申請]ボタンのラベルおよび項目名を「確認」に変更します。
(2) Webページを作成する
メニュー画面と工事中画面のWebページを作成します。
メニュー画面のWebページ
Webアプリケーションを起動するために、次に示すWebページ「Menu.htm」を作成します。
このWebページのサンプルファイルは、Windowsの場合は「フレームワークのインストールフォルダ\sample\tutorial\Shoseki」にあります。SolarisおよびLinuxの場合は「/opt/FJSVfcdn/sample/tutorial/Shoseki」にあります。

このWebページでは、[作成]ボタンまたは[変更/取消]ボタンをクリックしたときに、Webアプリケーション「AppController」が起動されて、Webアプリケーションにコマンド名と申請書名が通知されます。
例:
「書籍購入申請書」の[作成]ボタンをクリックすると、次に示す値が通知されます。
menu=作成 docName=書籍購入申請書
工事中画面のWebページ
「書籍購入申請書」の[作成]ボタン以外のボタンがクリックされたときに表示される、次に示すWebページ「UnderConstruction.htm」を作成します。
このWebページのサンプルファイルは、Windowsの場合は「フレームワークのインストールフォルダ\sample\tutorial\Shoseki」にあります。SolarisおよびLinuxの場合は「/opt/FJSVfcdn/sample/tutorial/Shoseki」にあります。

(3) Webアプリケーションを作成する
次に示す3つのWebアプリケーションを作成します。これらのWebアプリケーションのサンプルプログラムは、Windowsの場合は「フレームワークのインストールフォルダ\sample\tutorial\Shoseki\WEB-INF\classes」にあります。SolarisおよびLinuxの場合は「/opt/FJSVfcdn/sample/tutorial/Shoseki/WEB-INF/classes」にあります。
AppController
最初に起動されるWebアプリケーションです。WebページとWebアプリケーションの制御を行います。
DispAppProg
申請書の入力画面を表示します。
ApplyProg
申請を受け付け、申請書の確認画面を表示します。
それぞれのWebアプリケーションのソースプログラムを次に示します。
AppControllerクラスのソースプログラム
// WebページとWebアプリケーションの制御を行うWebアプリケーション
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.fujitsu.form.*;
import java.util.Enumeration;
public class AppController extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
// Menu.htmからの送信なのか、書籍購入申請書の入力画面からの送信なのかを
// 切り分けます。
if (HtmlFormUtil.getEnctyp(request) == HtmlFormUtil.MULTIPART){
HtmlFormUtil hfu = new HtmlFormUtil(request);
request.setAttribute("FormInputStream", hfu.getInputStream());
String 申請 = hfu.getParameter("申請");
if (申請 != null && 申請.equals("申請")) {
// 書籍購入申請書の入力画面から送信されている場合は、
// 申請受付処理を行います。
// サーブレットのリクエストディスパッチを使用して、申請受付処理を
// 実行します。
ServletContext context = getServletContext();
RequestDispatcher rd =
context.getRequestDispatcher("/servlet/ApplyProg");
rd.forward(request, response);
} else if (hfu.getParameter("確認").equals("確認")) {
// 書籍購入申請書の確認画面から送信されている場合は、メニュー画面に
// 戻ります。
response.sendRedirect("../Menu.htm");
}
} else {
// メニュー画面でどのボタンがクリックされたかを判定します。
String 書類 =
new String(
(request.getParameter("docname").getBytes("iso-8859-1")),
"Shift_JIS"
);
String メニュー =
new String(
(request.getParameter("menu").getBytes("iso-8859-1")),
"Shift_JIS"
);
// 書籍購入申請書の[作成]ボタンがクリックされた場合、書籍購入申請画面
// 表示処理を行います。それ以外の場合は、工事中画面を表示します。
if ((書類 != null && 書類.equals("書籍購入申請書")) &&
(メニュー != null && メニュー.equals("作成"))) {
ServletContext context = getServletContext();
RequestDispatcher rd =
context.getRequestDispatcher("/servlet/DispAppProg");
rd.forward(request, response);
} else {
// 書籍購入申請書の[作成]ボタン以外がクリックされたので、
// リダイレクトを使用して、固定のHTMLファイルを表示します。
response.sendRedirect("../UnderConstruction.htm");
}
}
}
}
DispAppProgクラスのソースプログラム
// 入力用の電子フォームを表示するWebアプリケーション
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.fujitsu.form.*;
import org.w3c.dom.*;
import java.util.*;
public class DispAppProg extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
try {
OutputDataBuilder odb =
new OutputDataBuilder(request, "Shoseki");
// 電子フォーム表示モードに環境定義モードを指定します。
odb.setDisplayMode(odb.DISPMODE_ENV);
// コンテントタイプを設定します。
response.setContentType(odb.getContentType());
// 申請日を設定するために、XMLデータの雛形からXmlDataAccess
// オブジェクトを生成します。
XmlDataAccess xda =
new XmlDataAccess(odb.getTemplateXMLData());
// 申請日の編集を行います。日付は、たとえば、2001年8月1日であれば、
// "20010801"としなければなりません。
Calendar cal =
Calendar.getInstance(TimeZone.getDefault(), Locale.JAPAN);
int year = cal.get(Calendar.YEAR);
String month = "" + (cal.get(Calendar.MONTH) + 1);
String day = "" + cal.get(Calendar.DATE);
if (month.length() == 1) {
month = "0" + month;
}
if (day.length() == 1) {
day = "0" + day;
}
String applyDate = year + month + day;
// 編集した申請日を申請日タグの値として設定します。
xda.setValue("申請者情報/申請日", applyDate);
// 編集したXMLデータを出力データとして設定します。
odb.setXMLData(xda.getDocument(), true);
// HTMLデータを生成し、Webブラウザへ送信します。
odb.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}
ApplyProgクラスのソースプログラム
// 申請を受け付けるWebアプリケーション
// このサンプルでは、受け取ったデータを単に返すだけの処理を行っています。
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.w3c.dom.*;
import com.fujitsu.form.*;
public class ApplyProg extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
// AppControllerクラスでリクエストオブジェクトに設定した、入力ストリーム
// を取得します。
InputStream is = (InputStream)request.getAttribute("FormInputStream");
InputDataBuilder idb;
try {
// InputDataBuilderオブジェクトを生成します。
if (is == null) {
idb = new InputDataBuilder(request);
} else {
idb = new InputDataBuilder(is, request.getContentType());
}
OutputDataBuilder odb =
new OutputDataBuilder(request, "Shoseki-Kakunin");
// 電子フォーム表示モードに環境定義モードを指定します。
odb.setDisplayMode(odb.DISPMODE_ENV);
// コンテントタイプを設定します。
response.setContentType(odb.getContentType());
// 項目制御情報を変更するので、その雛形を取得し、ItemAttributeAccess
// オブジェクトを生成します。
ItemAttributeAccess iaa =
new ItemAttributeAccess("項目制御情報");
// 電子フォームの入力項目をすべて読み取り専用にします。
iaa.setReadonly("氏名", ItemAttributeAccess.TRUE);
iaa.setReadonly("従業員番号", ItemAttributeAccess.TRUE);
iaa.setReadonly("所属", ItemAttributeAccess.TRUE);
iaa.setReadonly("申請日", ItemAttributeAccess.TRUE);
iaa.setReadonly("合計", ItemAttributeAccess.TRUE);
// また、同じ項目の文字色を青色にします。
iaa.setColor("氏名", ItemAttributeAccess.BLUE);
iaa.setColor("従業員番号", ItemAttributeAccess.BLUE);
iaa.setColor("所属", ItemAttributeAccess.BLUE);
iaa.setColor("申請日", ItemAttributeAccess.BLUE);
iaa.setColor("合計", ItemAttributeAccess.BLUE);
// 書籍記入欄は4行あるので、1~4まで4回繰り返します。
int cnt;
String sCnt[] = new String [4];
sCnt[0] = "1";
sCnt[1] = "2";
sCnt[2] = "3";
sCnt[3] = "4";
for ( cnt = 0 ; cnt <= 3 ; cnt++ ) {
// 入力項目をすべて読み取り専用にします。
iaa.setReadonly("書籍名" + sCnt[cnt], ItemAttributeAccess.TRUE);
iaa.setReadonly("著者名" + sCnt[cnt], ItemAttributeAccess.TRUE);
iaa.setReadonly("発行所" + sCnt[cnt], ItemAttributeAccess.TRUE);
iaa.setReadonly("あり" + sCnt[cnt], ItemAttributeAccess.TRUE);
iaa.setReadonly("なし" + sCnt[cnt], ItemAttributeAccess.TRUE);
iaa.setReadonly("単価" + sCnt[cnt], ItemAttributeAccess.TRUE);
iaa.setReadonly("冊数" + sCnt[cnt], ItemAttributeAccess.TRUE);
iaa.setReadonly("金額" + sCnt[cnt], ItemAttributeAccess.TRUE);
// また、同じ項目(あり、なしは除く)の文字色を青色にします。
iaa.setColor("書籍名" + sCnt[cnt], ItemAttributeAccess.BLUE);
iaa.setColor("著者名" + sCnt[cnt], ItemAttributeAccess.BLUE);
iaa.setColor("発行所" + sCnt[cnt], ItemAttributeAccess.BLUE);
iaa.setColor("単価" + sCnt[cnt], ItemAttributeAccess.BLUE);
iaa.setColor("冊数" + sCnt[cnt], ItemAttributeAccess.BLUE);
iaa.setColor("金額" + sCnt[cnt], ItemAttributeAccess.BLUE);
}
// Webブラウザで電子フォームに入力されたデータおよび項目制御情報を
// 出力データとして設定します。
odb.setXMLData(idb.getXMLData(), false);
odb.setItemAttribute(iaa.getDocument());
// HTMLデータを生成し、Webブラウザへ送信します。
odb.write(response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}
(4) Webアプリケーション環境定義ファイルを作成する
Webアプリケーション環境定義ファイル(deployment descriptor)を作成します。
次に示すxmlファイルを作成し、「web.xml」という名前で保存します。
web.xmlファイルの内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">
<web-app>
<servlet>
<servlet-name>AppController</servlet-name>
<servlet-class>AppController</servlet-class>
</servlet>
<servlet>
<servlet-name>DispAppProg</servlet-name>
<servlet-class>DispAppProg</servlet-class>
</servlet>
<servlet>
<servlet-name>ApplyProg</servlet-name>
<servlet-class>ApplyProg</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AppController</servlet-name>
<url-pattern>/servlet/AppController</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DispAppProg</servlet-name>
<url-pattern>/servlet/DispAppProg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ApplyProg</servlet-name>
<url-pattern>/servlet/ApplyProg</url-pattern>
</servlet-mapping>
</web-app>(5) Webサーバに配置する
(1)~(4)で作成したファイルをWebサーバに配置します。
配置するファイル | 配置する場所 |
|---|---|
電子フォームのファイル
|
|
Webページのファイル
|
|
Webアプリケーションをコンパイルしたクラスファイル
|
|
Webアプリケーション環境定義ファイル |
|
(6) WARファイルを作成する
アプリケーションサーバがWARファイルによるWebアプリケーションの配備に対応している場合、(5)で配置したファイルを使用して、WARファイルを作成します。jarコマンドを実行するために、Windowsの場合は、「コマンド プロンプト」を起動します。SolarisおよびLinuxの場合は、「端末エミュレータ」等を起動します。
Shosekiフォルダ配下に移動します。
次に示すコマンドを実行します。
|
「Shoseki.war」という名前でWARファイルを作成します。
次に示すコマンドを実行します。
jar cvf Shoseki.war *.htm WEB-INF |
(7) WARファイルを配備する
作成したWARファイルをアプリケーションサーバに配備します。配備の方法については、使用しているアプリケーションサーバのマニュアルを参照してください。
(8) 動作を確認する
Webブラウザで、アドレスに「http://localhost/Shoseki/Menu.htm」を指定して、[移動]ボタンをクリックします。

→メニュー画面のWebページが表示されます。
「書籍購入申請書」の[作成]ボタンをクリックします。

→入力用の電子フォームが表示されます。

データを入力して、[申請]ボタンをクリックします。

→次に示すメッセージが表示されます。

[OK]ボタンをクリックします。
→確認用の電子フォームが表示されます。
[確認]ボタンをクリックします。

→次に示すメッセージが表示されます。

[OK]ボタンをクリックします。
→メニュー画面のWebページが表示されます。
「書籍購入申請書」の[作成]ボタン以外のボタンをクリックします。

→工事中画面のWebページが表示されます。
