web-dev-qa-db-ja.com

JSPリストからJavaScript配列を入力する

さて、おそらく誰かが私が解決しようとしている問題について私を助けてくれるでしょう。基本的に、Countryオブジェクトのリストを取得するJSPページがあります(Spring Portlet SimpleFormControllerのメソッドreferenceData()から、完全に関連しているわけではありませんが、必要に応じて言及しています)。各Countryオブジェクトには一連の州オブジェクトがあり、各州と国には名前フィールドがあります。

public class Country  {
    private String name;
    private Set<Province> provinces;

    //Getters and setters
}

public class Province {
    private String name;

    //Getters and setters
}

これで、JSPに国と州の2つのドロップダウンメニューがあり、国で州をフィルタリングしたいと思います。私はこれに従っています tutorial/guide JavaScriptでチェーンを選択させます。

ここで、コンテンツからJavaScript配列を作成する動的な方法が必要です。そして、誰もが言う前にAJAX私たちのプロジェクトはポートレットを使用しており、DWRのようなフレームワークの使用やサーブレットの作成は避けたいので、これは問題外です。これがJavaScript/JSPIです。これまでのところありますが、アレイに何も入力していません。

var countries = new Array();
<c:forEach items="${countryList}" var="country" varStatus="status">
    countries[status.index] = new Array();
    countries[status.index]['country'] = ${country.name};
    countries[status.index]['provinces'] =
    [
        <c:forEach items="${country.provinces}" var="province" varStatus="provinceStatus">
            '${province.name}'
            <c:if test="${!provinceStatus.last}">
              ,
            </c:if>
        </c:forEach>
    ];
</c:forEach>

上記の場合にJSPでJavaScript配列を作成する方法、またはこの場合に「ベストプラクティス」が考慮される方法を知っている人はいますか?前もって感謝します!

14
Ian Dallas
var countries = new Array();
<c:forEach items="${countryList}" var="country" varStatus="status"> 
    countryDetails = new Object();
    countryDetails.country = ${country.name}; 
    var provinces = new Array();

        <c:forEach items="${country.provinces}" var="province" varStatus="provinceStatus"> 
           provinces.Push(${province.name});
        </c:forEach> 
    countryDetails.provinces = provinces;
    countries.Push(countryDetails);
</c:forEach> 

今あなたが持っているものはjavascriptでこのようなものです

var countries = [
  {country:"USA",
  provinces: [
    "Ohio",
    "New York",
    "California"
  ]},
  {country:"Canada",
  provinces: [
    "Ontario",
    "Northern Territory",
    "Sascetchewan"
  ]},
]

もう1つのオプションは、出力を私が投稿したJavaScriptのように見せることです。

var countries = [
<c:forEach items="${countryList}" var="country" varStatus="status">  
    {country: '${country.name}',
    provinces : [ 
        <c:forEach items="${country.provinces}" var="province" varStatus="provinceStatus">  
           '${province.name}'
           <c:if test="${!provinceStatus.last}">    
             ,    
           </c:if>   
        </c:forEach>  
    ]}
    <c:if test="${!status.last}">    
      ,    
    </c:if>  
    </c:forEach>  
];
24
John Hartsock

[〜#〜] json [〜#〜] の使用を検討しましたか?ジェネリックコレクションと出力を取得できるライブラリがいくつかあります JSON for Java and other language

3
Ben S

コードの主な問題は、「status.index」を${ }内に配置するのを忘れたことです。

countries[${status.index}] = new Array();

とはいえ、ページにlotのJavascriptコードが含まれることになるため、これはかなり悪い方法です。 @John Hartsockの回答の2番目のように、Javascriptオブジェクト表記を使用してリストを作成する方がはるかに優れています。

1
Pointy