- PR -

JSPから出力されるHTMLのトリミング

投稿者投稿内容
なぶ
会議室デビュー日: 2004/08/17
投稿数: 4
投稿日時: 2004-08-17 20:38
いつもお世話になっております。

現在、JSPを使用しているのですが、JSPから出力されるHTMLをトリミングしたいと考えて
います。
具体的には、HTMLから改行(CRとLF)水平タブ(HT)を削除したいのです。

私としては、JSPからServletに変換される際、HTMLの出力部分で改行と水平タブを出力
させないように出来たらと思うのですが、このようなことは可能なのでしょうか?

尚、使用している環境は以下の通りです。
OS: Windows2000 SP4
AppServer: Tomcat 5.0.27
JDK: 1.4.2_05

どなたかご存知の方がいらっしゃいましたら、ご教授の程宜しくお願い致します。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-08-17 22:46
恐らく Jasper にそのような機能はありません。
JSPからServletに変換される過程に何らかの処理がしたければ JSP コンパイラに手を加える必要がありますね。
JSP に対してなんらかのプリプロセッサで処理をする、またはサーブレットフィルタにてダイナミックに処理を行う、といったところでしょうか。
なぶ
会議室デビュー日: 2004/08/17
投稿数: 4
投稿日時: 2004-08-18 13:14
ご返答ありがとうございます。
引用:

インギさんの書き込み (2004-08-17 22:46) より:
恐らく Jasper にそのような機能はありません。
JSPからServletに変換される過程に何らかの処理がしたければ JSP コンパイラに手を加える必要がありますね。
JSP に対してなんらかのプリプロセッサで処理をする、またはサーブレットフィルタにてダイナミックに処理を行う、といったところでしょうか。


出来れば、プリプロセッサでの処理は避けたいので、サーブレットフィルタが候補ですね。
その場合、処理の流れは、
 1.クライアントからのリクエスト
 2.フィルタでの前処理
 3.JSPでの処理
 4.フィルタでの後処理
 5.クライアントへのレスポンス
といった感じになると思います。

肝心のHTMLのトリミング処理を行うとしたら、4で行うことになると思うのですが、どのように実現したらいいのでしょうか。
JSPから出力されるHTMLを取得してトリミングをし、再度PrintWriterに出力内容を書き込む方法で実現は出来そうですが、そもそも出力されるHTMLの取得は出来るのでしょうか?
また、そのままPrintWriterに出力するとJSPからの出力も表示されるので、これを表示させない処理も必要ですね。
私なりに調べては見ているのですが、サーブレットフィルター内で出力されるHTMLを取得する方法、JSPからの出力を削除する方法が見つかりません。

もしくは、他にいい方法がないでしょうか。

[ メッセージ編集済み 編集者: なぶ 編集日時 2004-08-18 13:32 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-08-18 14:10
レスポンスのフィルタリングについては、この記事が参考になると思います。
http://www-6.ibm.com/jp/developerworks/java/011116/j_j-tomcat.html
ダメ猫
常連さん
会議室デビュー日: 2004/02/20
投稿数: 45
投稿日時: 2004-08-18 14:28
こんにちわダメ猫です。

反則技ですが、JSPの最後の方で、JSPの出力情報をいじるコードを書く方法があります。

コンパイルされたJAVAコードを見ながら作ると良いです。
使うクラスは

PageContext
JspWriter
BodyContent

を参考にすると良いでしょう。

実際に実行したことは無いので保障はできませんが・・・・・・

出力する部分はJSPでなくJAVAのコードで書けば簡単に改行は入れなくて済むのですが・・・・
このような条件で使う場合はJSPを使うメリットは少ないと思うので(JSPにしても複雑になってしまう)JAVAで表示をお勧めします。

それか、JSP内部にJSPやHTMLのインポートを使用すれば完全ではないにしろ、改行を少なくはできます。
なぶ
会議室デビュー日: 2004/08/17
投稿数: 4
投稿日時: 2004-08-18 14:43
様々なアイデアや情報をありがとうございます。

改行とタブを削除するカスタムタグを作成してそのタグで囲んだところ、とりあえずタブと改行が削除されたHTMLが出力されました。
#結局プリプロセッサみたいなものですね。(^^;

ですが、この方法だと各JSPでこのタグを使わなければならないので、やはりサーブレットフィルターのように必ず実行されるような処理にしたいと思います。

もう少し試してみます。

[ メッセージ編集済み 編集者: なぶ 編集日時 2004-08-18 14:47 ]
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-08-18 21:17
支障がなければ教えてください。なぜそんなことがしたいのですか?
あなたが目的を達するために、ひょっとしたら別の解決方法があるかもしれませんよ。
なぶ
会議室デビュー日: 2004/08/17
投稿数: 4
投稿日時: 2004-08-20 19:48
引用:

aaさんの書き込み (2004-08-18 21:17) より:
支障がなければ教えてください。なぜそんなことがしたいのですか?
あなたが目的を達するために、ひょっとしたら別の解決方法があるかもしれませんよ。



詳しくはいえませんが、出力されるHTMLに改行とタブは無い方が業務の都合上、処理しやすいのです。
つまり、出力内容のファイルが1行で、尚且つタブが無いようにしたいのです。

ukさんから教えていただいたURLの内容を参考に、「HttpServletResponseWrapper」と「ServletOutputStream」のラッパークラスを作成してみたところ、Servletではうまくいきました。
しかし、JSPでは逆に何も表示されなくなってしまいました。
HttpServletResponseWrapperを継承したクラスには、PrintWriterを返すgetPrintWriterを定義しており、getPrintWriterが実行されるところまでは確認できました。
どうやら、この返されるPrintWriterのインスタンスに問題があるようです。

この2つのクラスの内容は、ukさんから教えていただいたURL
http://www-6.ibm.com/jp/developerworks/java/011116/j_j-tomcat.html
に記述されているコードとほぼ同様で、「ServletOutputStream」に「replaceContent」にHTMLのトリミング処理を記述したぐらいしか違いはありません。

とりあえず、この先は時間があるときにでも調査しようと思います。
ここにレスを書いてくださった皆様に感謝します。

スキルアップ/キャリアアップ(JOB@IT)