これまで登録・修正・削除処理を出来るようにした2種の表及び、この2種の表から結合した表をエクセルの帳票として出力したいと思っています。
ネットなどで調べたところ、以下のサイトが参考に出来るのではないかと思っています。
http://codezine.jp/a/article.aspx?aid=41
ただ、このサイトのサンプルでは出力するデータが決めうちになっていて、
データベースからのデータ取得という部分に欠けています。
アドバイス等ご協力頂けないでしょうか?
よろしくお願い致します。
ネットなどで調べたところ、以下のサイトが参考に出来るのではないかと思っています。
http://codezine.jp/a/article.aspx?aid=41
ただ、このサイトのサンプルでは出力するデータが決めうちになっていて、
データベースからのデータ取得という部分に欠けています。
アドバイス等ご協力頂けないでしょうか?
よろしくお願い致します。
投稿:ばく[owada]/2006年 10月 17日 15時 11分
/更新:2006年 10月 17日 15時 11分
RE:帳票出力の方法について
by 竹形 誠司[takegata]
エクセルは私の守備範囲でないのであまり参考になることは申し上げられませんが、帳票の印刷ということでは、HTMLだけでも結構ちゃんとしたものができます。私の会社ではこんな帳票をブラウザから印刷して見積りや請求書に使っています。
iTextというライブラリを使ってPDFに出力する手もあるのですが、なかなか時間が取れなくて、そこまでやっていません(ある出版社から、このネタで本を書けと言われてるんですけどね・・・)
iTextというライブラリを使ってPDFに出力する手もあるのですが、なかなか時間が取れなくて、そこまでやっていません(ある出版社から、このネタで本を書けと言われてるんですけどね・・・)
投稿:竹形 誠司[takegata]/2006年 10月 17日 21時 28分
/更新:2006年 10月 17日 21時 32分
帳票出力すると一言で言っても、
HTMLでスタイルを作りこんだり、PDFにして改ざんされないものにする方法と
エクセルで修正など出来るものにするという方法があるんですね。
どの方法がいいのか検討してみます。
HTMLでスタイルを作りこんだり、PDFにして改ざんされないものにする方法と
エクセルで修正など出来るものにするという方法があるんですね。
どの方法がいいのか検討してみます。
投稿:ばく[owada]/2006年 10月 17日 22時 01分
/更新:2006年 10月 17日 22時 01分
エクセルで困るのは、似たようなファイルがいくつもできてしまって、どれが最終版だったのかや、誰が作って誰が編集したファイルなのかが分からなくなってしまうことなんですよね。そういう理由で私の会社では見積書や請求書等にはエクセルを使わないことにしています。
投稿:竹形 誠司[takegata]/2006年 10月 17日 22時 31分
/更新:2006年 10月 17日 22時 33分
おはようございます。
いろいろな状況を検討してみました。
その結果、ItextによるPDFでの帳票出力に挑戦することに致しました。
あるサイトさんのサンプルを元に、
Itextと日本語化のjarファイルをDLし、決め打ちのデータをPDFファイルで出力出来ることを確認しました。
JSPよりサーブレットで作った方が無難かというのを見ました。
これまでJSPでしかやってこなかったのですが、
サーブレットとの融合は容易に出来るものなのでしょうか?
いろいろな状況を検討してみました。
その結果、ItextによるPDFでの帳票出力に挑戦することに致しました。
あるサイトさんのサンプルを元に、
Itextと日本語化のjarファイルをDLし、決め打ちのデータをPDFファイルで出力出来ることを確認しました。
JSPよりサーブレットで作った方が無難かというのを見ました。
これまでJSPでしかやってこなかったのですが、
サーブレットとの融合は容易に出来るものなのでしょうか?
投稿:ばく[owada]/2006年 10月 18日 10時 50分
/更新:2006年 10月 18日 10時 50分
servletの実装は、それほど難しくはないのですが、コンパイル時にクラスパスを指定する必要があったり、コンパイルした後にマッピングする必要があったりして慣れるまではちょっとかかるかも知れません。
JSPでiTextを使うと、Tomcatのログに
iTextの使い方は私の最初の本「Java+MySQL+Tomcatで始めるサーバアプリケーション開発入門」に少し書いたのですが、「Java+MySQL+Tomcatで始めるWebアプリケーション構築入門」では削ってしまいました。サンプルのコードを探しておきますね。
JSPでiTextを使うと、Tomcatのログに
java.lang.IllegalStateException: getOutputStream()はこのレスポンスに対して既に呼び出されています
というエラーが残るのですが、これが気持ち悪くなければさしあたってはJSPでも問題無いと思います。iTextの使い方は私の最初の本「Java+MySQL+Tomcatで始めるサーバアプリケーション開発入門」に少し書いたのですが、「Java+MySQL+Tomcatで始めるWebアプリケーション構築入門」では削ってしまいました。サンプルのコードを探しておきますね。
投稿:竹形 誠司[takegata]/2006年 10月 18日 11時 55分
/更新:2006年 10月 18日 11時 56分
エラーログ吐いているだけで、特に動作に支障がないのであれば目を瞑ります。
お忙しいとは存じますが、サンプルコードよろしくお願い致します。
お忙しいとは存じますが、サンプルコードよろしくお願い致します。
投稿:ばく[owada]/2006年 10月 18日 13時 26分
/更新:2006年 10月 18日 13時 26分
「Java+MySQL+Tomcatで始めるサーバアプリケーション開発入門」から削ってしまった部分のラフ原稿があったのでPDFにしましたが、サンプルはサーブレットしかありませんでした。内容が古いので、テーブルの作り方だけ参考にしてください。
時間があれば、JSPで表組みをするサンプルも作ってみます。
時間があれば、JSPで表組みをするサンプルも作ってみます。
投稿:竹形 誠司[takegata]/2006年 10月 18日 14時 04分
/更新:2006年 10月 18日 14時 06分
iTextの開発者が今書いている「iText IN ACTION」という本のドラフトを入手して読んでいるのですが、やはりpdfなどのバイナリデータをJSPで生成することには問題があるようです。
JSPのソースコードに含まれるスペースや改行、タブなどの文字コードがバイナリデータに混入して、生成されたデータが壊れることがある、というのが理由だそうです。なるほど。
「iText IN ACTION」は下のページで購入を予約するとドラフトをダウンロードできます(但し英語です)。
http://manning.com/lowagie/
JSPのソースコードに含まれるスペースや改行、タブなどの文字コードがバイナリデータに混入して、生成されたデータが壊れることがある、というのが理由だそうです。なるほど。
「iText IN ACTION」は下のページで購入を予約するとドラフトをダウンロードできます(但し英語です)。
http://manning.com/lowagie/
投稿:竹形 誠司[takegata]/2006年 10月 18日 15時 24分
/更新:2006年 10月 18日 15時 26分
サンプル拝見させて頂きました。
テーブルの構成方法について、何となく理解出来ました。
追記にありましたJSPによるPDF処理には問題があるとのことでしたが、
サーブレットでの作成に変更せざる終えないということですね。
懸念事項として挙げられていたコンパイル時のクラスパスの指定、コンパイル後のマッピングも含めてご指導頂けますでしょうか?
よろしくお願い致します。
テーブルの構成方法について、何となく理解出来ました。
追記にありましたJSPによるPDF処理には問題があるとのことでしたが、
サーブレットでの作成に変更せざる終えないということですね。
懸念事項として挙げられていたコンパイル時のクラスパスの指定、コンパイル後のマッピングも含めてご指導頂けますでしょうか?
よろしくお願い致します。
投稿:ばく[owada]/2006年 10月 18日 15時 51分
/更新:2006年 10月 18日 15時 51分
サンプルを新たに作りました。
これをWEB-INF/classディレクトリに置いて、次のようなコマンドでコンパイルします。
上のコマンドの -cp というのはクラスパスのオプションです。サーブレットをコンパイルする際に servlet-api.jar にクラスパスを通しておく必要があるのですが、そのフルパスを指定すると上のようになってしまいます(ディレクトリ名にスペースが含まれているのでダブルクオーテーションで囲んでください)。また、itext-1.4.5.jar というのはiTextのライブラリです。これにもクラスパスを通します。
複数のクラスパスを同時に指定する場合はセミコロンで区切ります(Windowsの場合)
jamytoフォルダにPrintInvoice.classというファイルができたら、このサーブレットをURLにマッピングします。WEB-INFの下のweb.xmlに次のように書きます。
これをWEB-INF/classディレクトリに置いて、次のようなコマンドでコンパイルします。
C:\test\jsp\WEB-INF\classes>javac -d . -cp "C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\servlet-api.jar";"C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\itext-1.4.5.jar" PrintInvoice.java
ちょっと長いので、バッチファイルか何かにした方がいいかも知れません。上のコマンドの -cp というのはクラスパスのオプションです。サーブレットをコンパイルする際に servlet-api.jar にクラスパスを通しておく必要があるのですが、そのフルパスを指定すると上のようになってしまいます(ディレクトリ名にスペースが含まれているのでダブルクオーテーションで囲んでください)。また、itext-1.4.5.jar というのはiTextのライブラリです。これにもクラスパスを通します。
複数のクラスパスを同時に指定する場合はセミコロンで区切ります(Windowsの場合)
jamytoフォルダにPrintInvoice.classというファイルができたら、このサーブレットをURLにマッピングします。WEB-INFの下のweb.xmlに次のように書きます。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>PrintInvoice</servlet-name>
<servlet-class>jamyto.PrintInvoice</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrintInvoice</servlet-name>
<url-pattern>/PrintInvoice</url-pattern>
</servlet-mapping>
</web-app>
上の設定では、PrintInvoiceというサーブレットを/PrintInvoiceというURLにマッピングしています。アプリケーションのルートディレクトリが http://jamy.to/test であれば http://jamy.to/test/PrintInvoice でこのサーブレットが呼び出されます。帳票はこんな感じになります。<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>PrintInvoice</servlet-name>
<servlet-class>jamyto.PrintInvoice</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrintInvoice</servlet-name>
<url-pattern>/PrintInvoice</url-pattern>
</servlet-mapping>
</web-app>
投稿:竹形 誠司[takegata]/2006年 10月 19日 05時 53分
/更新:2006年 10月 19日 05時 56分
おはようございます。
printinvoice.java、servlet-api.jar、itext-1.4.5.jarを所定の場所に配置して、
コンパイル出来ました。
ただ、二つのjarファイルにクラスパスを通して、
C:\jamyto\jsp\WEB-INF\classes>javac PrintInvoice.java でコンパイルしようとしたら、
PrintInvoice.java:2: パッケージ javax.servlet は存在しません。
import javax.servlet.*;
^
PrintInvoice.java:3: パッケージ javax.servlet.http は存在しません。
import javax.servlet.http.*;
^
PrintInvoice.java:10: シンボルを見つけられません。
シンボル: クラス HttpServlet
public class PrintInvoice extends HttpServlet{
^
PrintInvoice.java:11: シンボルを見つけられません。
シンボル: クラス HttpServletRequest
場所 : jamyto.PrintInvoice の クラス
public void doGet(HttpServletRequest request,
^
PrintInvoice.java:12: シンボルを見つけられません。
シンボル: クラス HttpServletResponse
場所 : jamyto.PrintInvoice の クラス
HttpServletResponse respons
^
PrintInvoice.java:13: シンボルを見つけられません。
シンボル: クラス ServletException
場所 : jamyto.PrintInvoice の クラス
throws ServletException, IOException{
^
PrintInvoice.java:14: シンボルを見つけられません。
シンボル: クラス HttpSession
場所 : jamyto.PrintInvoice の クラス
HttpSession session = request.getSession();
^
PrintInvoice.java:175: シンボルを見つけられません。
シンボル: クラス ServletOutputStream
場所 : jamyto.PrintInvoice の クラス
ServletOutputStream out = response.getOutputStream();
^
エラー 8 個
これは、クラスパスのしての仕方が問題なのでしょうか?
以下のように設定しています。
.;C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\itext-1.4.5.jar;.;C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\iTextAsian.jar;.;C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\servlet-api.jar;
printinvoice.java、servlet-api.jar、itext-1.4.5.jarを所定の場所に配置して、
コンパイル出来ました。
ただ、二つのjarファイルにクラスパスを通して、
C:\jamyto\jsp\WEB-INF\classes>javac PrintInvoice.java でコンパイルしようとしたら、
PrintInvoice.java:2: パッケージ javax.servlet は存在しません。
import javax.servlet.*;
^
PrintInvoice.java:3: パッケージ javax.servlet.http は存在しません。
import javax.servlet.http.*;
^
PrintInvoice.java:10: シンボルを見つけられません。
シンボル: クラス HttpServlet
public class PrintInvoice extends HttpServlet{
^
PrintInvoice.java:11: シンボルを見つけられません。
シンボル: クラス HttpServletRequest
場所 : jamyto.PrintInvoice の クラス
public void doGet(HttpServletRequest request,
^
PrintInvoice.java:12: シンボルを見つけられません。
シンボル: クラス HttpServletResponse
場所 : jamyto.PrintInvoice の クラス
HttpServletResponse respons
^
PrintInvoice.java:13: シンボルを見つけられません。
シンボル: クラス ServletException
場所 : jamyto.PrintInvoice の クラス
throws ServletException, IOException{
^
PrintInvoice.java:14: シンボルを見つけられません。
シンボル: クラス HttpSession
場所 : jamyto.PrintInvoice の クラス
HttpSession session = request.getSession();
^
PrintInvoice.java:175: シンボルを見つけられません。
シンボル: クラス ServletOutputStream
場所 : jamyto.PrintInvoice の クラス
ServletOutputStream out = response.getOutputStream();
^
エラー 8 個
これは、クラスパスのしての仕方が問題なのでしょうか?
以下のように設定しています。
.;C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\itext-1.4.5.jar;.;C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\iTextAsian.jar;.;C:\Program Files\Apache Software Foundation\Tomcat 5.5\common\lib\servlet-api.jar;
投稿:ばく[owada]/2006年 10月 19日 09時 43分
/更新:2006年 10月 19日 09時 43分
web.xmlは上書いちゃっていいのでしょうか?
アプリケーションのルートディレクトリについてですが、
http://localhost:8080/がルートディレクトリだと思うのですが、
確認の方法ってありますか?
また、ルートディレクトリだと思っているhttp://localhost:8080/に
jamyto/PrintInvoiceを付けて(今までの処理の実行でCドラ直下のSampleディレクトリのjspファイルに対して「http://localhost:8080/Sample/Menu.jsp」と記述していたので)
http://localhost:8080/jamyto/PrintInvoice で実行すると
指定されたページがありません。という画面が出ます。
よろしくお願います。
アプリケーションのルートディレクトリについてですが、
http://localhost:8080/がルートディレクトリだと思うのですが、
確認の方法ってありますか?
また、ルートディレクトリだと思っているhttp://localhost:8080/に
jamyto/PrintInvoiceを付けて(今までの処理の実行でCドラ直下のSampleディレクトリのjspファイルに対して「http://localhost:8080/Sample/Menu.jsp」と記述していたので)
http://localhost:8080/jamyto/PrintInvoice で実行すると
指定されたページがありません。という画面が出ます。
よろしくお願います。
投稿:ばく[owada]/2006年 10月 19日 11時 19分
/更新:2006年 10月 19日 11時 19分
コンパイルできたのであれば、WEB-INF/classesの下にパッケージの階層に沿ったディレクトリを作って、できあがったclassファイルを入れておけばOKです。
↑で使われているクラスパスに"."(ドット)が複数含まれていますが、これはカレントディレクトリの意味ですから、一度指定すればOKです。また、iTextAsian.jarはコンパイルの時は必ずしも指定する必要はありません。指定しても害はありませんが。
web-xmlは必要な部分をコピー/ペーストしてください。
アプリケーションのルートディレクトリとは、WEB-INFがあるレベルを指します。Tomcatでは、複数のコンテキストを扱うことができますが、これらを「アプリケーション」と呼びます。このあたりについては「Java+MySQL+Tomcatで始めるWebアプリケーション構築入門」のP.341からの説明を参照してください。
PrintInvoice.java:2: パッケージ javax.servlet は存在しません。
これはクラスパスが通っていないために出るエラーですね。↑で使われているクラスパスに"."(ドット)が複数含まれていますが、これはカレントディレクトリの意味ですから、一度指定すればOKです。また、iTextAsian.jarはコンパイルの時は必ずしも指定する必要はありません。指定しても害はありませんが。
web-xmlは必要な部分をコピー/ペーストしてください。
アプリケーションのルートディレクトリとは、WEB-INFがあるレベルを指します。Tomcatでは、複数のコンテキストを扱うことができますが、これらを「アプリケーション」と呼びます。このあたりについては「Java+MySQL+Tomcatで始めるWebアプリケーション構築入門」のP.341からの説明を参照してください。
jamyto/PrintInvoiceを付けて(今までの処理の実行でCドラ直下のSampleディレクトリのjspファイルに対して「http://localhost:8080/Sample/Menu.jsp」と記述していたので)
の場合はhttp://localhost:8080/Sample/がアプリケーションのルートになります。ですから、サーブレットに対するURLはhttp://localhost:8080/Sample/PrintInvoiceですね。この指定で「ページがありません」というエラーになる場合は、サーブレットが正しく機能していないということになると思います。
投稿:竹形 誠司[takegata]/2006年 10月 19日 12時 34分
/更新:2006年 10月 19日 12時 35分
今一度作業状況を整理してみました。
いろいろ設定確認して表示させていたところ最初は文字化けになっていたのですが、新しいウィンドウで確認したところ、PDFの表示が出来ました。
午前中出来なかったのは、Tomcatの再起動をしていなかったことも原因の一つだと思われます。
※追記
これまでJSPを作成し、動作確認をしていたSampleフォルダ配下に同じ様にファイルを配置し、PDFが作成出来るようになりました。
残るは、Mysqlとも連携だと思うのですが、何から始めたらよいでしょうか?
PrintInvoice.javaの格納場所
C:\jamyto\JSP\WEB-INF\classes\PrintInvoice.java
PrintInvoice.classの格納場所
C:\jamyto\JSP\WEB-INF\classes\jamyto\PrintInvoice.class
修正したweb.xmlの格納場所
C:\jamyto\JSP\WEB-INF\web.xml
web.xmlの変更点
<?xml version="1.0" encoding="Windows-31J"?>
⇒<?xml version="1.0" encoding="UTF-8"?>
web.xmlに追加
<servlet>
<servlet-name>PrintInvoice</servlet-name>
<servlet-class>jamyto.PrintInvoice</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrintInvoice</servlet-name>
<url-pattern>/PrintInvoice</url-pattern>
</servlet-mapping>
動作確認したURL
http://localhost:8080/jamyto/PrintInvoice
いろいろ設定確認して表示させていたところ最初は文字化けになっていたのですが、新しいウィンドウで確認したところ、PDFの表示が出来ました。
午前中出来なかったのは、Tomcatの再起動をしていなかったことも原因の一つだと思われます。
※追記
これまでJSPを作成し、動作確認をしていたSampleフォルダ配下に同じ様にファイルを配置し、PDFが作成出来るようになりました。
残るは、Mysqlとも連携だと思うのですが、何から始めたらよいでしょうか?
PrintInvoice.javaの格納場所
C:\jamyto\JSP\WEB-INF\classes\PrintInvoice.java
PrintInvoice.classの格納場所
C:\jamyto\JSP\WEB-INF\classes\jamyto\PrintInvoice.class
修正したweb.xmlの格納場所
C:\jamyto\JSP\WEB-INF\web.xml
web.xmlの変更点
<?xml version="1.0" encoding="Windows-31J"?>
⇒<?xml version="1.0" encoding="UTF-8"?>
web.xmlに追加
<servlet>
<servlet-name>PrintInvoice</servlet-name>
<servlet-class>jamyto.PrintInvoice</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrintInvoice</servlet-name>
<url-pattern>/PrintInvoice</url-pattern>
</servlet-mapping>
動作確認したURL
http://localhost:8080/jamyto/PrintInvoice
投稿:ばく[owada]/2006年 10月 19日 13時 50分
/更新:2006年 10月 19日 14時 33分
MySQLとの連携は、データベースから取り出したデータをオブジェクトに入れて、それをサーブレットに渡す、という感じになると思います。
サーブレットにオブジェクトを渡すには、セッションを使うと簡単です。JSP側で
サンプルのサーブレットは、元々shop.Order というクラスに商品名や単価、数量、出荷先などの情報をセットして使っていたもので、PDFに埋め込む文字を、このオブジェクトから取り出していました。このあたりをアレンジしてみてください。
追記:
サーブレットにオブジェクトを渡すには、セッションを使うと簡単です。JSP側で
<jsp:useBean class="shop.Order" id="order" scope="session"/>
のように作成したオブジェクトはサーブレット側でshop.Order order=(shop.Order)session.getAttribute("order");
のようにすれば受け取ることができます。サンプルのサーブレットは、元々shop.Order というクラスに商品名や単価、数量、出荷先などの情報をセットして使っていたもので、PDFに埋め込む文字を、このオブジェクトから取り出していました。このあたりをアレンジしてみてください。
追記:
午前中出来なかったのは、Tomcatの再起動をしていなかったことも原因の一つだと思われます。
common/libの下にjarファイルを追加した場合はTomcatを再起動する必要があるんでしたね。忘れていました、すみません。
投稿:竹形 誠司[takegata]/2006年 10月 19日 19時 29分
/更新:2006年 10月 19日 22時 29分
おはようございます。
一連の動作を整理させて頂くと、
@ データベースより表のデータを取得して表示するJSPを作る。
A @で取得したデータをuseBeanを使って送る一文を埋め込む。
B getAttributeでAのデータを受け取る一文を埋め込んだサーブレットを作る。
こんな認識でよいでしょうか?
本でセッションやuseBeanの辺りを再読し、サンプルを見直してみます。
※追記
JSP側で以下の一文を追加するにあたって、クラス名、オブジェクト名は何にすればよいですか?
<jsp:useBean class="クラス名" id="オブジェクト名" scope="session"/>
いきなりJSPからは無理なのでしょうか?
一連の動作を整理させて頂くと、
@ データベースより表のデータを取得して表示するJSPを作る。
A @で取得したデータをuseBeanを使って送る一文を埋め込む。
B getAttributeでAのデータを受け取る一文を埋め込んだサーブレットを作る。
こんな認識でよいでしょうか?
本でセッションやuseBeanの辺りを再読し、サンプルを見直してみます。
※追記
JSP側で以下の一文を追加するにあたって、クラス名、オブジェクト名は何にすればよいですか?
<jsp:useBean class="クラス名" id="オブジェクト名" scope="session"/>
いきなりJSPからは無理なのでしょうか?
投稿:ばく[owada]/2006年 10月 20日 09時 05分
/更新:2006年 10月 20日 10時 50分
サーブレットにパラメータで値を渡すことも、もちろんできます。
こんな感じになります。
エラー処理などは省いているので、補ってください。
こんな感じになります。
エラー処理などは省いているので、補ってください。
投稿:竹形 誠司[takegata]/2006年 10月 20日 14時 19分
/更新:2006年 10月 20日 14時 20分
サンプルありがとうございました。
FORMのACTION要素を"/Sample/PrintInvoice"に変更することでPDFファイルを表示することが出来ました。
あとは、サーバーからデータを取ってくる部分をprintinvoiceform.jspに詰め込めばいい訳ですね?
FORMのACTION要素を"/Sample/PrintInvoice"に変更することでPDFファイルを表示することが出来ました。
あとは、サーバーからデータを取ってくる部分をprintinvoiceform.jspに詰め込めばいい訳ですね?
投稿:ばく[owada]/2006年 10月 20日 14時 57分
/更新:2006年 10月 20日 14時 57分
printinvoice.javaで項目名のレコードのみ表示できるようになりました。
その次の段階で分からないところが出てきました。
printinvoice.javaのif文の中身について教えてください。
table.addCell(new PdfPCell(new Phrase(aryItems[i],font)));と、
cell = new PdfPCell(new Phrase(nf.format(intPrice),font));を挿入してのtable.addCell(cell);の手順の違いと、
cell = new PdfPCell(new Phrase(nf.format(intPrice),font));を挿入してのtable.addCell(cell);と、
cell = new PdfPCell(new Phrase(Integer.toString(intAmount),font));を挿入してのtable.addCell(cell);の
new Phrase()中の違いは何でなのか教えてください。
よろしくお願いします。
PDFを出力するボタンを設置したJSPを載せます。
ここで表示しているテーブルの内容をPDFにしたいです。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.text.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items_list";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<FORM NAME="form1" ACTION="/Sample/PrintInvoice" METHOD="post">
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<H1><%="アイテム一覧"%></H1>
<DIV CLASS="section">
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH><TH>数量</TH><TH>購入金額</TH></TR>
<%while(rs.next())
{%>
<TR>
<TD CLASS ="C3"><%=rs.getString("co_item")%></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("price"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("sal"))%></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
<INPUT TYPE="submit" VALUE="帳票出力">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="history.back()">
</DIV>
</FORM>
</BODY>
</HTML>
その次の段階で分からないところが出てきました。
printinvoice.javaのif文の中身について教えてください。
table.addCell(new PdfPCell(new Phrase(aryItems[i],font)));と、
cell = new PdfPCell(new Phrase(nf.format(intPrice),font));を挿入してのtable.addCell(cell);の手順の違いと、
cell = new PdfPCell(new Phrase(nf.format(intPrice),font));を挿入してのtable.addCell(cell);と、
cell = new PdfPCell(new Phrase(Integer.toString(intAmount),font));を挿入してのtable.addCell(cell);の
new Phrase()中の違いは何でなのか教えてください。
よろしくお願いします。
PDFを出力するボタンを設置したJSPを載せます。
ここで表示しているテーブルの内容をPDFにしたいです。
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.text.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items_list";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<FORM NAME="form1" ACTION="/Sample/PrintInvoice" METHOD="post">
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<H1><%="アイテム一覧"%></H1>
<DIV CLASS="section">
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH><TH>数量</TH><TH>購入金額</TH></TR>
<%while(rs.next())
{%>
<TR>
<TD CLASS ="C3"><%=rs.getString("co_item")%></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("price"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("amount"))%></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("sal"))%></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
<INPUT TYPE="submit" VALUE="帳票出力">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="history.back()">
</DIV>
</FORM>
</BODY>
</HTML>
投稿:ばく[owada]/2006年 10月 20日 17時 11分
/更新:2006年 10月 20日 17時 14分
上のコードのテーブルの内容をPDFにするには、
<INPUT TYPE="hidden" NAME="item" VALUE="<%=rs.getString("co_item")%>">
のような形でパラメータをサーブレットに渡す必要があります。table.addCell(new PdfPCell(new Phrase(xxxxx,font)));
とcell = new PdfPCell(new Phrase(xxxxx,font));
table.addCell(cell);
は全く同じです。table.addCell(cell);
cell = new PdfPCell(new Phrase(nf.format(intPrice),font));
の nf.format(intPrice) では、整数を金額を表す書式に変換しています。cell = new PdfPCell(new Phrase(Integer.toString(intAmount),font));
の Integer.toString(intAmount) は整数を文字列に変換しています。
投稿:竹形 誠司[takegata]/2006年 10月 20日 22時 15分
/更新:2006年 10月 20日 22時 21分
おはようございます。
ご指摘いただいた部分を修正いたしました。
しかし、うまくパラメータが渡せていないのか、テーブル部分の記述に問題があるのかご購入年月日の1文までしは表示されなくなってしまいました。
確認の程、よろしくお願いいたします。
jspファイルがうまくリンクできないのでコピペします。
------------------items_list_select.jsp------------------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.text.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items_list";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<FORM NAME="form1" ACTION="/Sample/PrintInvoice" METHOD="post">
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<H1><%="アイテム一覧"%></H1>
<DIV CLASS="section">
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH><TH>数量</TH><TH>購入金額</TH></TR>
<%while(rs.next())
{%>
<TR>
<TD CLASS ="C3"><%=rs.getString("co_item")%><INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=rs.getString("Co_Item")%>"></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%><INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=rs.getString("Item_Name")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("price"))%><INPUT TYPE="hidden" NAME="Price" VALUE="<%=rs.getString("Price")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("amount"))%><INPUT TYPE="hidden" NAME="Amount" VALUE="<%=rs.getString("Amount")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("sal"))%><INPUT TYPE="hidden" NAME="Sal" VALUE="<%=rs.getString("Sal")%>"></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
<INPUT TYPE="submit" VALUE="帳票出力">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="history.back()">
</DIV>
</FORM>
</BODY>
</HTML>
ご指摘いただいた部分を修正いたしました。
しかし、うまくパラメータが渡せていないのか、テーブル部分の記述に問題があるのかご購入年月日の1文までしは表示されなくなってしまいました。
確認の程、よろしくお願いいたします。
jspファイルがうまくリンクできないのでコピペします。
------------------items_list_select.jsp------------------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.text.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items_list";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD>
<TITLE>JSPサンプル</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-31J">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
</HEAD><BODY>
<FORM NAME="form1" ACTION="/Sample/PrintInvoice" METHOD="post">
<%NumberFormat exObject = NumberFormat.getNumberInstance();%>
<H1><%="アイテム一覧"%></H1>
<DIV CLASS="section">
<TABLE>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH><TH>数量</TH><TH>購入金額</TH></TR>
<%while(rs.next())
{%>
<TR>
<TD CLASS ="C3"><%=rs.getString("co_item")%><INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=rs.getString("Co_Item")%>"></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%><INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=rs.getString("Item_Name")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("price"))%><INPUT TYPE="hidden" NAME="Price" VALUE="<%=rs.getString("Price")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("amount"))%><INPUT TYPE="hidden" NAME="Amount" VALUE="<%=rs.getString("Amount")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("sal"))%><INPUT TYPE="hidden" NAME="Sal" VALUE="<%=rs.getString("Sal")%>"></TD>
</TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
<INPUT TYPE="submit" VALUE="帳票出力">
<INPUT TYPE="button" VALUE="メニューに戻る" ONCLICK="history.back()">
</DIV>
</FORM>
</BODY>
</HTML>
投稿:ばく[owada]/2006年 10月 23日 11時 20分
/更新:2006年 10月 23日 11時 49分
フォームで指定されているパラメータ名とサーブレットで指定されているパラメータ名が違います。
<TR>
<TD CLASS ="C3"><%=rs.getString("co_item")%><INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=rs.getString("Co_Item")%>"></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%><INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=rs.getString("Item_Name")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("price"))%><INPUT TYPE="hidden" NAME="Price" VALUE="<%=rs.getString("Price")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("amount"))%><INPUT TYPE="hidden" NAME="Amount" VALUE="<%=rs.getString("Amount")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("sal"))%><INPUT TYPE="hidden" NAME="Sal" VALUE="<%=rs.getString("Sal")%>"></TD>
</TR>
とするならば、<TD CLASS ="C3"><%=rs.getString("co_item")%><INPUT TYPE="hidden" NAME="Co_Item" VALUE="<%=rs.getString("Co_Item")%>"></TD>
<TD CLASS ="C3"><%=rs.getString("item_name")%><INPUT TYPE="hidden" NAME="Item_Name" VALUE="<%=rs.getString("Item_Name")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("price"))%><INPUT TYPE="hidden" NAME="Price" VALUE="<%=rs.getString("Price")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("amount"))%><INPUT TYPE="hidden" NAME="Amount" VALUE="<%=rs.getString("Amount")%>"></TD>
<TD CLASS ="C4"><%=exObject.format(rs.getLong("sal"))%><INPUT TYPE="hidden" NAME="Sal" VALUE="<%=rs.getString("Sal")%>"></TD>
</TR>
String[] aryCo_Items = request.getParameterValues("co_item");
String[] aryItem_Names = request.getParameterValues("item_name");
String[] aryPrices = request.getParameterValues("price");
String[] aryAmounts = request.getParameterValues("amount");
String[] arySals = request.getParameterValues("sal");
の部分はString[] aryItem_Names = request.getParameterValues("item_name");
String[] aryPrices = request.getParameterValues("price");
String[] aryAmounts = request.getParameterValues("amount");
String[] arySals = request.getParameterValues("sal");
String[] aryCo_Items = request.getParameterValues("Co_Item");
String[] aryItem_Names = request.getParameterValues("Item_Name");
String[] aryPrices = request.getParameterValues("Price");
String[] aryAmounts = request.getParameterValues("Amount");
String[] arySals = request.getParameterValues("Sal");
でなければなりません。String[] aryItem_Names = request.getParameterValues("Item_Name");
String[] aryPrices = request.getParameterValues("Price");
String[] aryAmounts = request.getParameterValues("Amount");
String[] arySals = request.getParameterValues("Sal");
投稿:竹形 誠司[takegata]/2006年 10月 23日 12時 51分
/更新:2006年 10月 23日 12時 51分
ご指摘ありがとうございいます。
パラメータ名の大文字・小文字の区別されるということでよいですか?
※追記
パラメータ名修正したら、テーブルが表示できるようになりました。
ありがとうございます。
パラメータ名の大文字・小文字の区別されるということでよいですか?
※追記
パラメータ名修正したら、テーブルが表示できるようになりました。
ありがとうございます。
投稿:ばく[owada]/2006年 10月 23日 13時 11分
/更新:2006年 10月 23日 13時 14分