2010-06-14 41 views
15

Ok vì vậy có lẽ ai đó có thể giúp tôi giải quyết vấn đề tôi đang cố gắng giải quyết. Về cơ bản tôi có một trang JSP có danh sách các đối tượng Quốc gia (từ phương thức referenceData() từ một Spring Portlet SimpleFormController, không hoàn toàn phù hợp nhưng chỉ đề cập trong trường hợp nó là). Mỗi đối tượng Nước có một tập các đối tượng tỉnh và mỗi tỉnh và đất nước có một trường tên:Populating JavaScript Array từ Danh sách JSP

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

    //Getters and setters 
} 

public class Province { 
    private String name; 

    //Getters and setters 
} 

Bây giờ tôi có hai đơn thả xuống trong JSP của tôi cho các quốc gia và các tỉnh, tôi muốn lọc các tỉnh theo quốc gia. Tôi đã theo dõi điều này tutorial/guide để tạo chuỗi chọn trong JavaScript.

Bây giờ tôi cần một cách năng động để tạo mảng JavaScript từ nội dung của mình. Và trước khi bất kỳ ai đề cập đến AJAX, điều này nằm ngoài câu hỏi vì dự án của chúng tôi sử dụng các portlet và chúng tôi muốn tránh xa việc sử dụng các khung công tác như DWR hoặc tạo một servlet. Đây là JavaScript/JSP tôi có cho đến nay nhưng nó không được đưa Array với bất cứ điều gì:

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> 

Có ai biết làm thế nào để tạo ra một mảng JavaScript trong JSP trong trường hợp trên hoặc những gì 'thực hành tốt nhất' sẽ được xem xét trong trường hợp này? Cảm ơn trước!

Trả lời

22
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> 

bây giờ những gì bạn có là một cái gì đó như thế này trong javascript

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

Các tùy chọn khác sẽ làm cho đầu ra của bạn trông giống như javascript tôi đăng.

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> 
]; 
+2

Điều thứ hai sẽ dẫn đến việc tạo ra ít mã hơn đáng kể, vì vậy tôi chắc chắn sẽ đi theo lộ trình đó. – Pointy

+0

Ngọt ngào, cảm ơn! Tôi đang gặp vấn đề với Bộ điều khiển của mình, nhưng đây chính xác là những gì tôi đang tìm kiếm ... cảm ơn lần nữa! Tôi đã kết thúc với giải pháp thứ hai sản xuất JSON trong trường hợp ai đó đang tự hỏi. –

+0

Vui vì tôi có thể giúp đỡ. –

3

Bạn đã xem xét sử dụng JSON chưa? Có một số thư viện trên mạng có thể lấy một bộ sưu tập chung và đầu ra JSON for Java and other languages.

+0

Tôi đã xóa nhận xét trong đó tôi đã nói điều này không hữu ích - tôi nhận ra rằng nó thực sự * có thể * hữu ích nếu các lớp Java ở đây là thích hợp. Bằng cách chuyển đổi thành chuỗi JSON, bạn có thể chỉ cần xuất chuỗi và hoàn thành. Tuy nhiên, lưu ý rằng JSON là một dạng bị hạn chế của ký pháp objecct Javascript đầy đủ, vì vậy đối với một số loại dữ liệu, nó có thể không hoạt động tốt. ** Rất ** thuận tiện nếu nó hoạt động, tuy nhiên. Tôi luôn có một hàm 'EL: toJSON()' EL trong các ứng dụng của tôi :-) – Pointy

1

Vấn đề chính trong mã của bạn là bạn quên đặt "status.index" bên trong ${ }.

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

Bây giờ, những gì đã nói, đó sẽ là một chặng đường khá xấu để làm những việc vì bạn muốn kết thúc với một nhiều mã Javascript trong trang của bạn. Tốt hơn nhiều để tạo danh sách sử dụng ký hiệu đối tượng Javascript như trong câu trả lời thứ hai của @John Hartsock.

Các vấn đề liên quan