ステップ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ページが表示されます。