- PR -

JSP で コードビハインド

1
投稿者投稿内容
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-09-28 00:49
NetBeans6.1

<%@page contentType="text/html" pageEncoding="UTF-8" extends="common.Index3" %>

上記のようにすると、ASP.NET みたいにコード分離が出来るらしいのですが、
Java では、ASP.NET のように ASPX が 元クラスの派生クラスになるように
コーディング(されている)してるのを見たことがありません。

そーゆーフレームワークなりがあるならば教えてください。

現在、試行錯誤中ですが、
HttpJspPage インターフェースを実装しているが、abstract にすると、JSP
でエラーが出て、abstract しないと、_jspService が無いって怒られる始末。
HttpJspPageのJavaDocには、_jspService は自動的にバインドされるから実装
側で意図しなくてよい、云々と書いてあり、詳細はJSP仕様書 JSP_Engine を
見ろ、と書いてあるが、JSP仕様書のどこにその具体的記述があるのかさっぱり
です。


SimplifiedJSPServlet クラスのサンプル
http://www.koders.com/java/fid75C9C7C526ADBF50B3FF7199C4F8042C5E6F756C.aspx?s=mdef:insert

HttpJspPageインターフェース
http://sdc.sun.co.jp/java/docs/j2ee/sdk_1.3/ja/techdocs/api/javax/servlet/jsp/HttpJspPage.html

JspPageインターフェース
http://sdc.sun.co.jp/java/docs/j2ee/sdk_1.3/ja/techdocs/api/javax/servlet/jsp/JspPage.html


abstract public class Index3 implements HttpJspPage {
//... _jspService 以外すべて実装すると、
//... 初回一発目で、init() が呼ばれ、
//... 以後JSP参照毎に service() が呼ばれる
//... とこまでは確認。ゴールが近いのか遠い
//... のかさっぱりわかりません。。。


}

ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-09-29 17:16
解決してないけど、TOMCAT6.0のソース見ました。

org.apache.jasper.runtime.HttpJspBase にそのまんまがありました。

これと同じことやってあげれば、少しは先に進みそうです。

JSPもサーブレットだったってこと再認識しました;;

以上

http://tomcat.apache.org/download-60.cgi


山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2008-09-30 00:51
>上記のようにすると、ASP.NET みたいにコード分離が出来るらしいのですが、
>Java では、ASP.NET のように ASPX が 元クラスの派生クラスになるように
>コーディング(されている)してるのを見たことがありません。
私も見たことがあります。

>そーゆーフレームワークなりがあるならば教えてください。
私が知る限り、そのようなフレームワークはありません。
jsp の親クラスに処理をさせるのではなく、予めサーブレットや EJB で前処理をしておき jsp では表示のみを行わせるのが主流ではないでしょうか。
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-09-30 01:59
インギさんレスありがとうございます。
あることはあるのですね。フレームワークとか厳かなものとしては存在しないだけで。

むーん。まだTOMCATソース精査してないけどなんか足りない。
コード:
public abstract class Index3 extends BaseServlet {
    public abstract void _jspService(HttpServletRequest request, 
            HttpServletResponse response)
            throws ServletException, IOException ;

    public Index3() {
        System.err.println("Index3.java initialized.");
    }

    private int x = 100;
    
    public int getX() { return x; }

}




こうすると、コンストラクタが呼ばれます。

コード:
<%@page contentType="text/html" pageEncoding="UTF-8" extends="xxx.common.Index3" %>
<%@ page import="java.io.IOException" %>
<jsp:useBean id="e" class="xxx.common.Entity" scope="request"></jsp:useBean>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <meta http-equiv="Pragma" content="no-cache" />
        <meta http-equiv="Cache-Control" content="no-cache" />

        <title>JSP Page</title>
    </head>
    <body>
        <h2>Hello World! <!--<%= e.getA() %>--></h2>
        <div>
            
        </div>
        <select name="Drop1">
            <option></option>
            <option></option>
        </select>
    </body>
</html>




テスト用JSPはコレ。

今のところコンパイル前の時点でJSP構文エラーが出てしまいます。
_jspService が宣言されてない、ってゆーエラー。当然といえば
当然なんですが。

コード:
public abstract class BaseServlet extends HttpServlet implements HttpJspPage {

    protected ServletConfig servletConfig;

    public abstract void _jspService(HttpServletRequest request, 
            HttpServletResponse response)
            throws ServletException, IOException ;
    /**
     * JspPage::inherits
     */
    public void jspInit(){
        System.err.println("OK- jspInit called");
    }
    //... 省略:JspPage と Servlet インターフェース全部定義している。。。



もうちょっとがんばります。

ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-09-30 02:08
>jsp の親クラスに処理をさせるのではなく、予めサーブレットや EJB で前処理をして>おき jsp では表示のみを行わせるのが主流ではないでしょうか。

個人的に、JSP 内で、request に setAttribute したやつ引っ張ってくる記述したり
何々クラスのインポートしたり、な記述が見られるのは好きじゃないというか、
ASP.NET がこーゆー構成だから。

シーサーみたいに、XHTML のプロセッサ導入して、HTML をパースしつつ
ベースクラスを初期化してコマンドに相当するイベントメソッドを呼び出して。。。
とかやるより、JSP の親クラスとして .java が存在すれば、コードもすっきり
しません?というか、しませんよね。Javaはパーシャルクラス定義できません
もんね。


1

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