0

JSTL を使用して JSP ビューに表示する前に、次のデータ構造を使用して JDBC の結果をサーブレット コントローラーに格納しています。

TreeMap
  - TreeMap
      - String[]

行ごとに 4 列のデータが返されます。

"CATEGORY","OSDIRECTORY","FILENAME","DESCRIPTION"
"CATEGORY","OSDIRECTORY","FILENAME","DESCRIPTION"
"CATEGORY","OSDIRECTORY","FILENAME","DESCRIPTION"
etc.

目標は、結果を次のようにデータ構造に格納することです。

Category
    - FILENAME
        - OSDIRECTORY
        - DESCRIPTION

そして、ビューに最終結果を次のように表示するには

Category A
    Hyperlink
    Hyperlink
    Hyperlink
Category B
    Hyperlink
    Hyperlink
etc.

関連するサーブレット コントローラーのコード スニペット

...
TreeMap treeMap = new TreeMap();

rs = stmt.executeQuery(query); 

// Gather raw data
while(rs.next()){

    if(!treeMap.containsKey(rs.getString("CATEGORY"))){
        treeMap.put(rs.getString("CATEGORY"), new TreeMap());
    }

    String[] tmp = { rs.getString("OSDIRECTORY"), rs.getString("DESCRIPTION") };
    ((TreeMap)treeMap.get(rs.getString("CATEGORY"))).put(rs.getString("FILENAME"), tmp);
}

request.setAttribute("filemap", treeMap);

RequestDispatcher rd = request.getRequestDispatcher(VIEW_URL);

rd.forward(request, response);
...

関連する JSP ビュー JSTL スニペット

<c:forEach var="f" items="${filemap}">
    <h1><c:out value="${f.key}"/></h1>
    <c:forEach var="g" items="${filemap[f.key]}">
      <a href="TBD">
        <c:out value="${filemap[f.key][g.key][0]}"/>
        <c:out value="${filemap[f.key][g.key][1]}"/>
      </a>
    </c:forEach>
</c:forEach>

JSTL 式のいくつかを表現するためのより簡潔な方法があるのではないかと思っています。

たとえば、 ${filemap[f.key][g.key][0]} は冗長すぎるようです。

4

2 に答える 2

1

マップのマップを使用する代わりに、データを表すオブジェクトを作成します。ファイルを含むカテゴリがあるので、次のようなカテゴリとファイル オブジェクトを作成します。

public class Category {
    private String name;
    private List<DbFile> files = new ArrayList<DbFile>();
    // getters & setters for each property go here
}

public class DbFile {
    private String filename;
    private String osDirectory;
    private String description;
    // getters & setters for each property go here
}

次に、データ アクセス コードで、結果セットを反復処理し、次のようにカテゴリ オブジェクトのリストを作成できます。

Map<String, Category> categoryMap = new TreeMap<String, Category>();

while(rs.next()){
    String categoryName = rs.getString("CATEGORY");
    Category category = categoryMap.get(categoryName);

    if(!categoryMap.containsKey(categoryName)){
        category = new Category();
        category.setName(categoryName);
    }

    DbFile file = new DbFile();
    file.setFilename(rs.getString("FILENAME"));
    file.setOsDirectory(rs.getString("OSDIRECTORY"));
    file.setDescription(rs.getString("FILENAME"));

    category.getFiles().add(file);
    categoryMap.put(categoryName, category);
}

request.setAttribute("categories", Arrays.asList(categoryMap.values()));

次に、ページのコードはより単純になります。

<c:forEach var="category" items="${categories}">
   <h1><c:out value="${category.name}"/></h1>
   <c:forEach var="file" items="${category.files}">
       <a href="TBD">
           <c:out value="${file.osDirectory}"/>
           <c:out value="${file.description}"/>
       </a>
    </c:forEach>
</c:forEach>
于 2013-05-01T02:45:51.300 に答える