目次

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

リンクの設定

続いて、ページ切り替え用のリンクを設けます。

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:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
    private Tag makeLink( String str, int page_no, int article_no ) throws PageException {
        String  query = "page=" + Integer.toString( page_no );
        String  fragment = null;
        article_no %= MAX_ARTICLE;
        if ( article_no > 0 ) {
            fragment = "jump" + Integer.toString( article_no );
        }
        URIAttribute    href = createPageToURI( "href", PageType.BLOG_HTML, fragment, query );
        Tag tag = new Tag( "a", false );
        tag.setAttribute( href );
        tag.setValueString( str );
        return tag;
    }
 
    private void addPageLink() throws PageException {
        Tag tag = new Tag( "div", false );
        if ( page > 0 ) {
            tag.addHTMLPart( makeLink( "前へ", page - 1, 0 ), new Text( " | " ) );
        }
        tag.addHTMLPart( makeLink( "ホーム", 0, 0 ) );
        // 最大ページ番号
        int page_count = (Article.db.size() + MAX_ARTICLE - 1) / MAX_ARTICLE - 1;
        if ( page < page_count ) {
            tag.addHTMLPart( new Text( " | " ), makeLink( "次へ", page + 1, 0 ) );
        }
        getMainDiv().addHTMLPart( tag );
    }
 
    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 );
        }
        addPageLink();
        return this;
    }

最近の記事も同様に処理します。 最近の記事は<UL>タグです。 <UL>タグはListクラス、<LI>タグは ListItem クラスです。 最大5件までリンクを生成します。

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:
22:
23:
24:
25:
26:
    private void makeNewLink() throws PageException {
        List    list = getNewUl();
        list.removeHTMLPart();
        int count = Article.db.size();
        if ( count > 5 )    count = 5;
        for ( int i = 0; i < count; i++ ) {
            ListItem    item = new ListItem( ListItem.Type.LIST_ITEM );
            item.addHTMLPart(
                makeLink( Article.db.get( i ).title, i / MAX_ARTICLE, i )
            );
            list.addHTMLPart( item );
        }
    }
 
    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 );
        }
        addPageLink();
        makeNewLink();
        return this;
    }

履歴の削除

管理ページからこのページに戻ると、履歴が参照されるため表示ページを覚えています。
しかし、管理ページから戻った場合はホーム状態が良いでしょう。
このため、管理ページから戻る際は履歴をクリアし、新規インスタンスを表示させるようにします。
AdminHtml の inputMain に履歴クリア処理を入れます。

tutorial3/logic/AdminHtml.java
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
    public Forward inputMain( RequestParameter req, Forward fw ) throws PageException {
        // fwにはモックアップと同じ遷移先が設定されています。
        // 別の遷移先としたい場合は、新しくForwardインスタンスを生成して
        // リターンして下さい。
 
        if ( getDeleteInput().isClicked() ) {
            Tag[]   tag = getTargetTags();
            for ( int i = 0; i < tag.length; i++ ) {
                CheckBox    box = (CheckBox)tag[i];
                if ( box.isChecked() ) {
                    Article.db.remove( (Article)box.getUserData() );
                    deleteImage( (Article)box.getUserData() );
                }
            }
            makeList();
        }
        else if ( getPostInput().isClicked() ) {
            Article article = null;
            try {
                Control.checkNull( "が未入力です。", getTitleInput(), getTextTextarea() );
                String[]    category = getCategorySelect().getValueStrings();
                if ( category.length == 0 ) {
                    throw new ControlException( "が未入力です。", getCategorySelect() );
                }
                article = new Article( getTitleInput().getValueString(), getTextTextarea().getValueString(), category );
                article.image[0] = getFileName( getTopImageInput() );
                article.image[1] = getFileName( getBottomImageInput() );
                // 正しいデータなので登録する。
                Article.db.add( 0, article );
                makeList();
                // 入力項目は初期化する
                getTitleInput().setValueString( null );
                getTextTextarea().setValueString( null );
                getCategorySelect().setValueString( null );
                getErrorFont().setVisible( false );
            }
            catch( ControlException e ) {
                Tag error = getErrorFont();
                error.setVisible( true );
                error.setValueString( e.getControl().getTitle() + e.getMessage() );
                getTopImageInput().delete();
                getBottomImageInput().delete();
                deleteImage( article );
            }
        }
        if ( fw.getPageID() == PageType.BLOG_HTML ) {
            req.getHistory().removePage( PageType.BLOG_HTML );
            req.getHistory().removePage( PageType.ADMIN_HTML );
        }
        return fw;
    }

チュートリアル8(Dawnloadable)