0

3層のネストされたリストがあるJSPページでdisplay:tableを生成するのに苦労しています。

私のメインクラスは「ExpenditureTotalsByRegions」で、「ExpenditureTotalsByTypes」のリストがあります。「ExpenditureTotalsByTypes」には「ExpenditureTotalsByProjects」のリストがあります。

主な問題は次のとおりです。このテーブルの行と列の数は次のように変化する可能性 があります。領域の数は変化します。タイプの数は異なる場合があります/地域; プロジェクトの数は/タイプによって異なります

JSPページは「ExpenditureTotalsByRegions」のリストを取得し、次のようになります。

Region 1
----------------------------------------------------------
Types |  Project 1 | Project 2
----------------------------------------------------------
type1 | $1,000     | $2,000
type2 | $2,000     | $2,500


Region 2
----------------------------------------------------------
Types |  Project 1 | Project 3  |Project 4
----------------------------------------------------------
type3 | $3,000     | $4,000     | $5,000
type4 | $3,500     | $4,500     | $5,500
type5 | $3,550     | $4,550     | $5,550

(上記の例では、「リージョン1」、「リージョン2」はリージョンの名前、「タイプ1」、「タイプ2」などはタイプの名前、「プロジェクト1」、「プロジェクト2」などは名前です。プロジェクトの金額と$expendituresは、プロジェクトで実際に費やされた金額です)

メインクラス:

public class ExpenditureTotalsByRegions {

    protected String fRegion = null;
    protected List<ExpenditureTotalsByTypes> fTypeExpenditures = new ArrayList<ExpenditureTotalsByTypes>();

    public ExpenditureTotalsByRegions(String region,List<ExpenditureTotalsByTypes> typeExpenditures) {
        fRegion = region;
        fTypeExpenditures = typeExpenditures;
    }

    public String getRegion() {
        return fRegion;
    }

    public void setRegion(String region) {
        fRegion = region;
    }

    public List<ExpenditureTotalsByTypes> getTypeExpenditures() {
        return fTypeExpenditures ;
    }

    public void setTypeExpenditures( List<ExpenditureTotalsByTypes> typeExpenditures) {
    fTypeExpenditures = typeExpenditures;
    }

    }

これで、「ExpenditureType」クラスは次のようになります。

    public class ExpenditureTotalsByTypes{

    protected String fTypeName;
    protected List<ExpenditureTotalsByProjects> fProjectExpenditures = new ArrayList<ExpenditureTotalsByProjects>();


    public String getTypeName() {
    return fTypeName;
    }

    public void setTypeName(String typeName) {
        fTypeName= typeName;
    }


    public List<ExpenditureTotalsByProjects> getProjectExpenditures() {
        return fProjectExpenditures;
    }

    public void setProjectExpenditures( List<ExpenditureTotalsByProjects> projectExpenditures) {
        fProjectExpenditures = projectExpenditures;
    }

}

これで、「ExpenditureTotalsByProjects:クラスは次のようになります。

public class ExpenditureTotalsByProjects {

    protected String fProjectName;
    protected Double fProjectExpenditure;


    public ExpenditureTotalsByProjects( String projectName, Double projectExpenditure)   {
        fProjectName = projectName;
        fProjectExpenditure = projectExpenditure;        
    }


    public String getProjectName() {        
        return fProjectName;
    }      

    public void setProjectName( String projectName ) {        
        fProjectName = projectName;
    }

    public Double getProjectExpenditure() {        
        return fProjectExpenditure;
    }      

    public void setProjectExpenditure( Double projectExpenditure ) {        
        fProjectExpenditure = projectExpenditure;
    }


}

私のアクションクラスは次のようになります:

public class ExpendituresTotalsReportByRegionsAction extends ActionBase {

    protected List<ExpenditureTotalsByRegions> fTableData = new ArrayList<ExpenditureTotalsByRegions>();

    public ExpendituresTotalsReportByRegionsAction(JpaTransactionManager transactionManager) {
        super(transactionManager);
    }

    @Override
    public String execute() throws Exception {
        if (fYear != 0) {
             fTableData = reportDao.getExpenditureTotalsReportByRegions(fYear);
         }

        return SUCCESS;
    }


    public List<ExpenditureTotalsByRegions> getTableData() {
        return fTableData;
    }

}

これが、JSPページでテーブルを作成しようとして実行時エラーが発生する方法です。

<body>
<div class="container">
<div class="prepend-1"><br>
    <display:table id="reportTable"
                   name="tableData"
                   requestURI=""
                   cellspacing="0px"
                   export="true"
                   class="displaytagTable">
        <display:setProperty name="decorator.media.html"
                             value="gov.doi.expenditures.decorator.TotalSpeciesDecorator"/>
        <display:setProperty name="decorator.media.rtf"
                             value="gov.doi.expenditures.decorator.ItextTotalSpeciesDecorator"/>
        <display:setProperty name="decorator.media.pdf"
                             value="gov.doi.expenditures.decorator.ItextTotalSpeciesDecorator"/>

            <display:caption class="titleText ">${reportTable.region}</display:caption>

            <c:forEach items="${reportTable.typeExpenditures}" var="typeList"> 

                <display:column title="Types" property="${typeList}.typeName"/>

                <c:forEach items="${typeList.projectExpenditures}" var="projectList">
                    <display:column title="${projectList}.projectName" property="${projectList}.projectExpenditure"/>
                </c:forEach>

            </c:forEach> 

    </display:table>
</div>
</div>

</body>

テストデータ:

 List<ExpenditureTotalsByProjects> projectExpenditures = new ArrayList<ExpenditureTotalsByProjects>();
         List<ExpenditureTotalsByTypes> TypesExpenditures = new ArrayList<ExpenditureTotalsByTypes>();
         List<ExpenditureTotalsByRegions> regionExpenditures = new ArrayList<ExpenditureTotalsByRegions>();


         //Test data for reg1 
         projectExpenditures.add(new ExpenditureTotalsByProjects("project1",1000.00) );
         projectExpenditures.add(new ExpenditureTotalsByProjects("project2",2000.00) );

         //1st Types with 2 projects in reg1
         ExpenditureTotalsByTypes sp1 = new ExpenditureTotalsByTypes();
         sp1.setTypes("Types1");
         sp1.setProjectExpenditures(projectExpenditures);
         TypesExpenditures.add(sp1);


         //2nd Types with 2 projects in reg1
         projectExpenditures = new ArrayList<ExpenditureTotalsByProjects>();
         projectExpenditures.add(new ExpenditureTotalsByProjects("project1",1500.00) );
         projectExpenditures.add(new ExpenditureTotalsByProjects("project2",2500.00) );

         ExpenditureTotalsByTypes sp2 = new ExpenditureTotalsByTypes();
         sp2.setTypes("Types2");
         sp2.setProjectExpenditures(projectExpenditures);
         TypesExpenditures.add(sp2);


         //regionExpenditures.add(new ExpenditureTotalsByRegions("reg1",TypesExpenditures));

         tableData.add(new ExpenditureTotalsByRegions("reg1",TypesExpenditures));

         //Test data for reg2 
         TypesExpenditures = new ArrayList<ExpenditureTotalsByTypes>();

         projectExpenditures = new ArrayList<ExpenditureTotalsByProjects>();
         projectExpenditures.add(new ExpenditureTotalsByProjects("project3",3000.00) );
         projectExpenditures.add(new ExpenditureTotalsByProjects("project4",4000.00) );
         projectExpenditures.add(new ExpenditureTotalsByProjects("project5",5000.00) );

         sp1 = new ExpenditureTotalsByTypes();
         sp1.setTypes("Types3");
         sp1.setProjectExpenditures(projectExpenditures);
         TypesExpenditures.add(sp1);

         projectExpenditures = new ArrayList<ExpenditureTotalsByProjects>();
         projectExpenditures.add(new ExpenditureTotalsByProjects("project3",3500.00) );
         projectExpenditures.add(new ExpenditureTotalsByProjects("project4",4500.00) );
         projectExpenditures.add(new ExpenditureTotalsByProjects("project5",5500.00) );

         sp2 = new ExpenditureTotalsByTypes();
         sp2.setTypes("Types4");
         sp2.setProjectExpenditures(projectExpenditures);
         TypesExpenditures.add(sp2);

         projectExpenditures = new ArrayList<ExpenditureTotalsByProjects>();
         projectExpenditures.add(new ExpenditureTotalsByProjects("project3",3550.00) );
         projectExpenditures.add(new ExpenditureTotalsByProjects("project4",4550.00) );
         projectExpenditures.add(new ExpenditureTotalsByProjects("project5",5550.00) );

         ExpenditureTotalsByTypes sp3 = new ExpenditureTotalsByTypes();
         sp3.setTypes("Types5");
         sp3.setProjectExpenditures(projectExpenditures);
         TypesExpenditures.add(sp3);


         tableData.add(new ExpenditureTotalsByRegions("reg2",TypesExpenditures));

エラーの取得: "java.lang.RuntimeException:java.lang.RuntimeException:javax.servlet.jsp.JspException:プロパティの検索中にエラーが発生しました"しかし、'forEach'を使用したテーブル構築についてもサポートが必要です。助けてください

さらに情報が必要な場合はお知らせください。前もって感謝します。

4

1 に答える 1

1

これを行う1つの方法は次のとおりです。

<body>
<div class="container">
<div class="prepend-1"><br>
    <c:forEach items="${tableData}" var="regionList"> 
        <display:table id="TypeExpenditures"
                    name="${regionList.typeExpenditures}"
                    requestURI=""
                    cellspacing="0px"
                    export="true"
                    class="displaytagTable">


                <display:caption class="titleText ">${regionList.region}</display:caption>
                <display:column title="Types" property="typeName"/>

                <c:forEach items="${TypeExpenditures.projectExpenditures}" var="projectList"> 
                    <display:column title="${projectList.projectName}"  class='alignRight'>
                       $ ${projectList.projectExpenditure}
                    </display:column>
                </c:forEach>


        </display:table>
    </c:forEach>
</div>
</div>

</body>
于 2012-12-24T20:51:52.613 に答える