チュートリアル6(記事生成)

では記事生成部を作成します。
記事は3つまでの繰り返しとなりますが、普通にやろうと思うと Paraselene では簡単に作成できません。name が被ると配列化を引き起こすため各<DIV>の特定が困難になります。
そのため、BlogHtml インスタンスをもう1つ準備し、そこへ記事を書き込み、記事部分を丸ごと this へ複製する事で処理を実現する事にします。

tutorial3/logic/BlogHtml.java①
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
    private void addArticle( int no ) {
        if ( Article.db.size() <= no )  return;
        BlogHtml    dummy = (BlogHtml)PageLoader.getPageFactory().getPage( PageType.BLOG_HTML );
        Article article = Article.db.get( no );
        dummy.getJumpA().setAttribute( new Attribute( "name", "jump" + Integer.toString( no % MAX_ARTICLE ) ) );
        dummy.getDateDiv().setValueString( article.getDate() );
        dummy.getTitleDiv().setValueString( article.title );
        dummy.getTextDiv().setValueString( article.text );
        Text    category = new Text( "カテゴリ: " );
        for ( int i = 0; i < article.category.length; i++ ) {
            if ( article.category[i] ) {
                category.append( Article.CATEGORY[i] );
                category.append( " " );
            }
        }
        dummy.getCategoryDiv().removeHTMLPart();
        dummy.getCategoryDiv().addHTMLPart( category );
        this.getMainDiv().addHTMLPart( dummy.getArticleDiv().getReplica() );
    }
tutorial3/logic/BlogHtml.java②
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
    public Page outputMain( Page from, RequestParameter req ) throws PageException {
        // 出力内容を設定します。
        // 初期化したい場合は、init()をコールして下さい。
 
        getMainDiv().removeHTMLPart();
        for ( int i = 0; i < MAX_ARTICLE; i++ ) {
            addArticle( page * MAX_ARTICLE + i );
        }
        return this;
    }

ただし、このままでは記事が正しく表示されません。

記事は3件まで表示。<BR>それより多い場合は、前へ、次へリンクで移動。

Paraselene がタグを自動的にエスケープしてしまいます。
これは、

記事は3件まで表示。
それより多い場合は、前へ、次へリンクで移動。

と表示されなければなりません。
※画像もリンク切れとして表示されていますが、後で処理を追加します。

tutorial3/logic/BlogHtml.java③
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
    private void addArticle( int no ) {
        if ( Article.db.size() <= no )  return;
        BlogHtml    dummy = (BlogHtml)PageLoader.getPageFactory().getPage( PageType.BLOG_HTML );
        Article article = Article.db.get( no );
        dummy.getJumpA().setAttribute( new Attribute( "name", "jump" + Integer.toString( no % MAX_ARTICLE ) ) );
        dummy.getDateDiv().setValueString( article.getDate() );
        dummy.getTitleDiv().setValueString( article.title );
        //dummy.getTextDiv().setValueString( article.text );
        dummy.getTextDiv().removeHTMLPart();
        dummy.getTextDiv().addHTMLPart( new PlainText( article.text ) );
        Text    category = new Text( "カテゴリ: " );
        for ( int i = 0; i < article.category.length; i++ ) {
            if ( article.category[i] ) {
                category.append( Article.CATEGORY[i] );
                category.append( " " );
            }
        }
        dummy.getCategoryDiv().removeHTMLPart();
        dummy.getCategoryDiv().addHTMLPart( category );
        this.getMainDiv().addHTMLPart( dummy.getArticleDiv().getReplica() );
    }

通常のテキストは、Text クラスが処理しており、自動的に各種エスケープを行っています。
そこで、Text クラスの代わりに PlainText クラスを使用します。このクラスは、渡された文字列をそのまま無加工で出力しますので、ブラウザへは<BR>のまま出力されます。

注意点
今回は処理を簡単にするためこのようにしていますが、実際にインターネットへ公開するサイトでは、全てのタグ記述を許してはいけません。
特に<SCRIPT>タグ等はクラッカーの攻撃手段に利用されるため、セキュリティー上、非常に問題があります。

チュートリアル7(ページ切替)