配列やコレクションの繰り返し処理をする<logic:iterate>

本文介绍了如何利用Struts标签库中的<logic:iterate>标签来处理数组和集合数据,包括如何指定变量名、集合源、索引变量、循环次数、起始索引等关键属性,以及如何输出数组或集合中的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 配列やコレクションの繰り返し処理をするには、<logic:iterate>タグを使用します。

<html:iterater>タグの主要属性
属性概要
idJSP内で使用する変数名を指定します。
collectionスクリプトレットで指定された値を指定します。
nameスコープに登録されているBean名を指定します
property出力対象のBeanのプロパティを指定します。
scopename属性で指定したオブジェクトを取り出すscopeを指定します。指定しない場合、pege、request、session、spplicationの順で検索します。
indexId現在のindex番号を格納する変数を指定します。
length最大の繰り返し数を指定します。※1
offset繰り返し処理を開始するindex番号を指定します。省略時はゼロ※1
※1 最大繰り返し数と開始index番号の指定の実装例はこちらを参照して下さい。


例1)JSP内でスクリプトレットで生成した配列を出力する

<%@ page pageEncoding = "Shift_JIS" %>
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<%
String[] strArray = {"str1","str2","str3"};
%>

<html><body>

●JSP内で生成したString型の配列を表示する。<br>
<logic:iterate id="data" collection="<%= strArray %>" indexId="idx" >
   <bean:write name="idx" />  : <bean:write name="data" /> <br>
</logic:iterate>
</logic:iterate>
<hr>

</body></html>

String配列が、スクリプトレットで指定されているので、collection属性を使用している。
インデックス番号を表す変数に"idx"を指定している。

画面イメージ






スポンサード リンク



例2)セッションに格納された配列、List、Mapオブジェクトを出力する

<%@ page pageEncoding = "Shift_JIS" %>
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<html><body>

●String型の配列を表示する<br>
<logic:iterate id="data" name="strData" >
  <bean:write name="data" /> <br>
</logic:iterate>
<hr>

●List型の配列を表示する<br>
<logic:iterate id="data" name="listData" >
  <bean:write name="data" /> <br>
</logic:iterate>
<hr>

●Map型のKeyとvalueをそれぞれ表示する<br>
<logic:iterate id="data" name="mapData" >
  <bean:write name="data" property="key" />
    : 
  <bean:write name="data" property="value" /> <br>
</logic:iterate>

</body></html>

配列、コレクションが直接セッションに格納してあるので、property属性は指定していない。
Map、<bean:write>タグのproperty属性に、key、valueを指定することでそれぞれ、keyと値が出力される。

画面イメージ





配列、コレクションのセッション格納処理抜粋(アクションクラス)

public ActionForward execute(ActionMapping mapping,
                   ActionForm form,
                   HttpServletRequest request,
                   HttpServletResponse response) {

  // 配列データをセッションに登録
  String[] str = {"str1","str2","str3"};
  request.setAttribute("strData", str);

  // Listデータをセッションに登録
  List<String> list = new ArrayList<String>();
  list.add("list1");
  list.add("list2");
  list.add("list3");
  request.setAttribute("listData", list);

  // Mapデータをセッションに登録
  Map<String,String> map = new   LinkedHashMap<String,String>(); 
  map.put("key1", "map1");
  map.put("key2", "map2");
  map.put("key3", "map3");
  request.setAttribute("mapData", map);

  return mapping.findForward("success");
}




例3)セッションに格納された、Baen内の配列、List、Mapオブジェクトを出力する

<%@ page pageEncoding = "Shift_JIS" %>
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<html><body>

●Bean内のString型の配列を表示する<br>
<logic:iterate id="data" name="IterateForm" property="stringForm" >
  <bean:write name="data" /> <br>
</logic:iterate>
<hr>

●Bean内のList型の配列を表示する<br>
<logic:iterate id="data" name="IterateForm" property="listForm" >
  <bean:write name="data" /> <br>
</logic:iterate>
<hr>

●Bean内のMap型のKeyとvalueをそれぞれ表示する<br>
<logic:iterate id="data" name="IterateForm" property="mapForm" >
  <bean:write name="data" property="key" />
     : 
  <bean:write name="data" property="value" /> <br>
</logic:iterate>

</body></html>

配列、コレクションが直接セッションに格納してあるので、property属性は指定していない。
Map、<bean:write>タグのproperty属性に、key、valueを指定することでそれぞれ、keyと値が出力される。

画面イメージ




Beanのセッション格納処理抜粋(アクションクラス)

public ActionForward execute(ActionMapping mapping,
                   ActionForm form,
                   HttpServletRequest request,
                   HttpServletResponse response) {

   // 配列データを登録
  String[] str = {"str1","str2","str3"};

   // Listデータを登録
  List<String> list = new ArrayList<String>();
  list.add("list1");
  list.add("list2");
  list.add("list3");

  // Mapデータを登録
  Map<String,String> map = new   LinkedHashMap<String,String>(); 
  map.put("key1", "map1");
  map.put("key2", "map2");
  map.put("key3", "map3");

  // 配列、コレクションデータをアクションフォームに設定
  DynaActionForm inform = (DynaActionForm)form;
  inform.set("mapForm", map);
  inform.set("listForm", list);
  inform.set("stringForm",str);

   return mapping.findForward("success");
}



检查以下的代码,确认是否有bug,并分析改代码 Public Const sheetNameInfo = "抽出条件" Public Const sampleSheetNameInfo = "20240402サンプル" Public Const compareNameInfo = "ファイルの比較" Public Const compareSampleNameInfo = "比較結果サンプル" Public Const compareResultInfo = "比較結果" Public Const compareStartCol = "B" Public Const compareStartRowCol = "B5:C" Sub CompareFileNameConsistency(ByVal baseSheetName As String) Dim wsBase, wsExist, wsTemplate, wsNew As Worksheet Dim arrBase, arrOther, arrTemplate Dim dataColl As Collection, filesList As Collection Dim i, cnt, arr(), lastRow, startCol, missingCount As Long Dim arrResult() As Variant Dim fileArr(1 To 8) Dim key As String 'シートが存在時、シートが削除する On Error Resume Next Set wsExist = Worksheets(compareResultInfo) If Not wsExist Is Nothing Then Application.DisplayAlerts = False wsExist.Delete Application.DisplayAlerts = True End If On Error GoTo 0 Set wsTemplate = Nothing On Error Resume Next Set wsTemplate = Worksheets(compareSampleNameInfo) On Error GoTo 0 If wsTemplate Is Nothing Then MsgBox "シート「" & compareSampleNameInfo & "」が存在ない", vbExclamation Exit Sub End If 'シート(基準)のファイル名と更新日時 Set wsBase = Worksheets(baseSheetName) arrBase = wsBase.Range(compareStartRowCol & wsBase.Cells(wsBase.Rows.Count, compareStartCol).End(xlUp).Row).Value Set dataColl = New Collection '固定シート以外のすべてのワークシートを繰処理する For Each ws In ThisWorkbook.Worksheets If ws.Name = compareNameInfo Then ElseIf ws.Name = compareSampleNameInfo Then ElseIf ws.Name = sheetNameInfo Then ElseIf ws.Name = sampleSheetNameInfo Then ElseIf ws.Name = baseSheetName Then Else 'ファイル名と時間の比較 arrOther = ws.Range(compareStartRowCol & ws.Cells(ws.Rows.Count, compareStartCol).End(xlUp).Row).Value For i = 1 To UBound(arrOther, 1) If Trim(arrOther(i, 1)) <> "" Then dataColl.Add Array(ws.Name, arrOther(i, 1), arrOther(i, 2)) End If Next End If Next ' dataCollからファイル名と時間を辞書に収集する Dim dictExist As Object Set dictExist = CreateObject("Scripting.Dictionary") For i = 1 To dataColl.Count key = CStr(dataColl(i)(1)) & "|" & CStr(dataColl(i)(2)) dictExist(key) = True Next missingCount = 0 For i = 1 To UBound(arrBase, 1) If Trim(arrBase(i, 1)) <> "" Then ' ファイル名が存在する場合、 key = CStr(arrBase(i, 1)) & "|" & CStr(arrBase(i, 2)) If Not dictExist.Exists(key) Then missingCount = missingCount + 1 dataColl.Add Array("", arrBase(i, 1), arrBase(i, 2)) dictExist(key) = True '重複追加を防止する End If End If Next cnt = dataColl.Count If cnt > 0 Then ReDim arrResult(1 To cnt, 1 To 3) For i = 1 To cnt arrResult(i, 1) = dataColl(i)(0) ' シート名 arrResult(i, 2) = dataColl(i)(1) ' ファイル名 arrResult(i, 3) = dataColl(i)(2) ' 更新日時 Next End If Set filesList = New Collection For i = 1 To UBound(arrResult, 1) fileArr(1) = arrResult(i, 1) 'シート名 fileArr(2) = arrResult(i, 2) 'ファイル名 fileArr(3) = arrResult(i, 3) ' 更新日時 For j = 1 To UBound(arrBase, 1) If arrResult(i, 1) <> "" And arrResult(i, 2) = arrBase(j, 1) And arrResult(i, 3) = arrBase(j, 2) Then fileArr(4) = baseSheetName ' シート名 fileArr(5) = arrBase(j, 1) ' ファイル名 fileArr(6) = arrBase(j, 2) ' 更新日時 fileArr(7) = "True" ' ファイル名の比較結果 fileArr(8) = "True" ' 更新日時の比較結果 Exit For ElseIf arrResult(i, 1) <> "" And arrResult(i, 2) = arrBase(j, 1) And arrResult(i, 3) <> arrBase(j, 2) Then fileArr(4) = baseSheetName ' シート名 fileArr(5) = arrBase(j, 1) ' ファイル名 fileArr(6) = arrBase(j, 2) ' 更新日時 fileArr(7) = "True" ' ファイル名の比較結果 fileArr(8) = "False" ' 更新日時の比較結果 Exit For ElseIf arrResult(i, 1) = "" And arrResult(i, 2) = arrBase(j, 1) And arrResult(i, 3) = arrBase(j, 2) Then fileArr(2) = "" 'ファイル名 fileArr(3) = "" ' 更新日時 fileArr(4) = baseSheetName ' シート名 fileArr(5) = arrBase(j, 1) ' ファイル名 fileArr(6) = arrBase(j, 2) ' 更新日時 fileArr(7) = "False" ' ファイル名の比較結果 fileArr(8) = "False" ' 更新日時の比較結果 Exit For End If Next filesList.Add Array(fileArr(1), fileArr(2), fileArr(3), fileArr(4), fileArr(5), fileArr(6), fileArr(7), fileArr(8)) Next 'データを配列に格納する ReDim arr(1 To filesList.Count, 1 To 8) For i = 1 To filesList.Count arr(i, 1) = filesList(i)(0) ' シート名1 arr(i, 2) = filesList(i)(1) ' ファイル名 arr(i, 3) = filesList(i)(2) ' 更新日時 arr(i, 4) = filesList(i)(3) ' シート名2 arr(i, 5) = filesList(i)(4) ' ファイル名 arr(i, 6) = filesList(i)(5) ' 更新日時 arr(i, 7) = filesList(i)(6) ' ファイル名の比較結果 arr(i, 8) = filesList(i)(7) ' 更新日時の比較結果 Next '新いシートを作成 wsTemplate.Copy After:=Worksheets(Worksheets.Count) Set wsNew = ActiveSheet wsNew.Name = compareResultInfo If Err.Number <> 0 Then wsNew.Name = compareResultInfo & "_" & Format(Now, "hhmmss") Err.Clear End If On Error GoTo 0 'シートにデータを書き込む startCol = 2 lastRow = 5 For i = 1 To UBound(arr, 1) wsNew.Cells(lastRow, startCol).Value = arr(i, 1) 'シート名1 wsNew.Cells(lastRow, startCol + 1).Value = arr(i, 2) 'ファイル名 wsNew.Cells(lastRow, startCol + 2).Value = arr(i, 3) ' 更新日時 wsNew.Cells(lastRow, startCol + 3).Value = arr(i, 4) 'シート名2 wsNew.Cells(lastRow, startCol + 4).Value = arr(i, 5) 'ファイル名 wsNew.Cells(lastRow, startCol + 5).Value = arr(i, 6) ' 更新日時 wsNew.Cells(lastRow, startCol + 6).Value = arr(i, 7) ' ファイル名の比較結果 wsNew.Cells(lastRow, startCol + 7).Value = arr(i, 8) ' 更新日時の比較結果 lastRow = lastRow + 1 Next '列幅の自動調整 wsNew.Columns("B:I").AutoFit '線の設定 Set rng = wsNew.Range(wsNew.Cells(5, startCol), wsNew.Cells(lastRow - 1, startCol + 7)) With rng.Borders .LineStyle = xlContinuous .Color = vbBlack .Weight = xlThin End With '更新日時1列センター With wsNew.Range(wsNew.Cells(5, startCol + 2), wsNew.Cells(lastRow - 1, startCol + 2)) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .NumberFormat = "yyyy/mm/dd hh:mm:ss" End With '更新日時2列センター With wsNew.Range(wsNew.Cells(5, startCol + 5), wsNew.Cells(lastRow - 1, startCol + 5)) .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .NumberFormat = "yyyy/mm/dd hh:mm:ss" End With End Sub
07-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值