タグを動的にループさせよう!

※サンプルでは、HTMLを使用していますが、XHTMLでも基本的に同じです。

A.タグが内容に複数の子要素を持つ場合

下記のHTMLの赤字の部分を動的に変更してみます。赤字の部分を動的にループさせ、タグ及びCXタグの
値を変更します。

loop.html
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title>タグを動的にループさせよう!</title></head>
<body text="#000000" bgcolor="#FFFFFF" link="#0000FF" vlink="#800080" alink="#800080">
<div align="center">
<table width="100%" border="0">
<tr>
<td bgcolor="0099FF">
<table width="100%" border="0">
<tr>
<td height="2" colspan="3">&nbsp;</td>
</tr>
<tr>
<td height="2" bgcolor="#FFFF66">タイトル</td>
<td height="2" bgcolor="#FFFF66">ジャンプ</td>
<td height="2" bgcolor="#FFFF66">内容</td>
</tr>
<tr name="loop">
<td width="50%" height="4" bgcolor="#00FFCC"><!-- @quark id="name" --><!-- /@quark --></td>
<td width="8%" height="4" bgcolor="#CCFFFF"><a href="" target="_blank">START</a></td>
<td width="42%" height="4" bgcolor="#CCFFFF"><!-- @quark id="set" --><!-- /@quark --></td>
</tr>

</table>
</td>
</tr>
</table>
</div>
</body>
</html>

Meteorを使用して作成します。

(1)赤字の部分の動的変更を行うためにLooperクラスのサブクラスを作成します。このクラスにてLooperクラスの
  executeメソッドをオーバーライドし、動的ループを行うためのロジックを記述します。

LoopML.java

//Kuro API

import jp.kuro.meteor.*;
import jp.kuro.meteor.hook.Looper;

//標準API
import java.util.*;

public class LoopML extends Looper {

    Element tag;
    Element tag2;
    Element tag3;

    public void init(Element xt) {
        //タグ検索
        tag = xt.child("a");
        tag2 = xt.cxTag("name");
        tag3 = xt.cxTag("set");
    }

    public void execute(Element elm, Object obj) {
        //表示データの加工
        HashMap rec = (HashMap) obj;
        String NAME = (String) rec.get("name");
        String SET = (String) rec.get("set");
        if (SET.equals("")) {
            SET = " ";
        }
        String URL = (String) rec.get("url");
        //表示ロジック
        tag2.clone().content(NAME);
        tag.clone().attribute("href", URL);
        tag3.clone().content(SET);

    }
}


(2)動的ループのロジックを呼び出すサーブレット本体を作成します。

LoopServletHTML.java

//標準API

import java.io.*;
import java.util.*;
//ServletAPI
import javax.servlet.*;
import javax.servlet.http.*;
//Kuro API
import jp.kuro.meteor.*;
import jp.kuro.meteor.printer.HttpPrinter;

public class LoopServletHTML extends HttpServlet {
    ParserFactory pf;

    public void init(ServletConfig sConf) throws ServletException {
        //"loop.html"の絶対パスを取得する
        ServletContext sc = sConf.getServletContext();
        String path = sc.getRealPath("/WEB-INF/html/");
        //パーサファクトリオブジェクトを生成し、"loop.html"を読み込む
        pf = new ParserFactory(path);
        pf.parser(Parser.HTML, "loop.html", "Shift_JIS");
    }

    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        doPost(req, res);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        //Parserオブジェクトのコピーを取得する
        Parser xt = pf.parser("loop");

        //表示用データのセット
        ArrayList rsVec = new ArrayList();
        for (int i = 0; i < 3; i++) {
            HashMap hash = new HashMap();
            hash.put("name", "KuroProject");
            hash.put("set", "Kuro Project オフィシャルページ");
            hash.put("url", "http://kuro.s26.xrea.com");
            rsVec.add(hash);
        }

        //赤字部分の動的ループのロジックを呼び出す。

        Element tag = xt.element("tr", "name", "loop");
        tag.execute(new LoopML(), rsVec);
        //反映する
        xt.flush();
        //HTTP出力する。
        HttpPrinter prt = new HttpPrinter(res);
        prt.print(xt);
    }
}

B.タグがテキストのみを内容として持つ場合

下記のHTMLの赤字の部分を動的に変更してみます。赤字の部分を動的にループさせ、タグの値を変更します。

loop2.html
<html>
<head>
<title>タグを動的にループさせよう!</title>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<form name="form1" method="post" action="">
<select name="select">
<option value="test">test</option>
</select>
<br>
<br>
</form>
</body>
</html>


(1)赤字の部分の動的変更を行うためにHookerクラスのサブクラスを作成します。このクラスにてHookerクラスの
  executeメソッドをオーバーライドし、動的ループを行うためのロジックを記述します。

LoopML2.java

import jp.kuro.meteor.*;
import jp.kuro.meteor.hook.Hooker;

public class LoopML2 extends Hooker {
    public void execute(Element xt) {

        for (int j = 0; j < 3; j++) {
            xt.attribute("value", Integer.toString(j));
            xt.content("test" + Integer.toString(j));
            xt.flush();
        }
    }
}

(2)動的ループのロジックを呼び出すサーブレット本体を作成します。

LoopServletHTML2.java
//標準API

import java.io.*;

//ServletAPI
import javax.servlet.*;
import javax.servlet.http.*;

//Kuro API
import jp.kuro.meteor.*;
import jp.kuro.meteor.printer.HttpPrinter;

public class LoopServletHTML2 extends HttpServlet {
    ParserFactory pf;
    String path2;
    //Analyzer anl;

    public void init(ServletConfig sConf) throws ServletException {
        ServletContext sc = sConf.getServletContext();

        //anl = new Analyzer();

        String path = sc.getRealPath("/WEB-INF/html/");
        path2 = sc.getRealPath("/WEB-INF/");

        //パーサファクトリオブジェクトを生成し、"loop2.html"を読み込む
        pf = new ParserFactory(path);
        pf.parser(Parser.HTML, "loop2.html", "Shift_JIS");
    }

    public void doGet(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        doPost(req, res);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        //Parserオブジェクトを取得する
        Parser xt = pf.parser("loop2");

        //anl.setCharacterEncoding("Shift_JIS");
        //req.setCharacterEncoding("Shift_JIS");

        //System.out.println(anl.analyze(req));
        //System.out.println(req.getParameter("textfield"));
        //System.out.println(req.getParameter("textfield2"));
        //System.out.println(req.getParameter("submit"));

        Element tag = xt.element("option", "value", "test");

        tag.execute(new LoopML2());

        //反映する
        xt.flush();

        HttpPrinter prt = new HttpPrinter(res);
        prt.print(xt);

    }
}



(C)Yasumasa Ashida