2013-09-25 86 views
2

我正在開發一個JSP頁面,該頁面使用Java後端類中動態生成的大量JavaScript代碼。它是關於谷歌地圖和名爲MarkerClusterer的JS庫。從Java管理動態JavaScript的最佳實踐是什麼?

目前這個類正在通過處理Java中的Strings並將其直接打印到JSP頁面中來生成JavaScript代碼,但是在Java String中編寫JS並保持這一點有點複雜。

由於這個類正在不同的項目中使用,JavaScript總是需要大量的修改。理想情況下,我希望以可用作圖書館的方式將其打包,而不需要進一步修改,所以這就是問題所在,最好的方法是什麼?

下面的代碼的一部分:

public class JavascriptGenerator { 

    public String gerarPorRegiao(String contextPath, List<Endereco> lista, boolean infoWindowEnabled) { 
     String saida = ""; 

     saida += "<script type=\"text/javascript\" src=\"http://maps.google.com/maps/api/js?sensor=false\"></script>" 
       + "<script type=\"text/javascript\" src=\"" 
       + contextPath 
       + "/js/markerclusterer.js\"></script>" 
       + "<script type=\"text/javascript\">" 
       + "var map;"; 
     for(Estado e: Estado.values()) { 
      saida += "var mc" + e.toString() + ";"; 
     } 
       saida += "var selecionado;" 
       + "var center = new google.maps.LatLng(-11.0, -51.9);" 
       + "var geocoder = new google.maps.Geocoder();" 
       + "var infowindow = new google.maps.InfoWindow();" 
       + "var markerContent = new Array();" 
       + "function geocoderInit() {" 
... 
+0

從來沒有一種最好的方式去做某件事。只有最適合*你*的方式。 – Philipp

回答

2

我會說:不。

請勿動態生成JavaScript。我會成爲一個噩夢來維持。將你的js保存在一個靜態文件中,並使用ajax來獲取你的數據。您的數據可以採用JSON格式。 JSON可以使用許多可以下載的json庫中的一個從對象層次結構中自動生成。

+0

這似乎是理論上的一個很好和優雅的選擇 - 除非當你嘗試在實踐中實現這一點:)如果在適度複雜的頁面上有幾個jQuery UI元素(幾個jQuery數據表和Select2,以及..),並且他們都開始使用AJAX下載數據,結果就是你看到一個「逐漸」變爲現實的頁面 - 取消這個數據表,然後,選擇「找到」它的選項,然後......「用戶體驗「受到影響,並且整個頁面顯示爲緩慢加載.. –

+0

我不同意,並且衆所周知,如果網頁上發生了某些情況,頁面對人類的顯示速度會更快。但我的答案的核心是使用json庫來呈現數據。如果你希望你可以在腳本標籤中放入一個json blob。這不會更難以維持。 –

+0

「如果您希望只需將json blob放在腳本標記中」 - 您可以(在jsp中)創建自定義標記,以javascript格式在部分的合適位置輸出您的json。這是你的建議嗎,還是你想的更簡單? –

1

一件事你可以做的是,用一個字符串緩衝區,並添加你的Java腳本的東西進去。 然後用.js作爲擴展名將其寫入一個文件。所以,這使得您的腳本可以維護

1

您可以編寫一個單獨的JSP文件來創建javascript。然後使用Javascript的所有靜態部分會像往常一樣:

var map; 

<% for(Estado e: Eastado.values()) { %> 
var mc<%=e.toString()%>; 
<% } %> 

var selecionado; 
... 

該JSP然後可以通過HTML頁面的其他JSP創建加載:

<script type="text/JavaScript" src="path/to/jsp/file.jsp"></script> 

如果你的腳本需要訪問數據時,你可以通過URL傳遞參數:

<script type="text/JavaScript" src="path/to/jsp/file.jsp?id=15"></script> 

然後,在腳本中,過濾器或任何類似,您可以直接使用這些參數或用它們來從數據庫或使加載數據。

+0

我也在想這樣的事情,但如何將方法需要的變量傳遞給頁面?也許我可以用'SESSION'或'POST'來代替? –

+0

不知道SESSION和POST是什麼意思。我認爲不行。您可以將URL參數傳遞給JSP:path/to/jsp/file.jsp?id = 17 – isnot2bad

+0

我按照您的說法操作,只是使用了'SESSION',因爲它支持傳遞對象。您引用的URL參數稱爲'GET',以及'SESSION'和'POST',這是在Web編程中將數據從一個頁面傳遞到另一個頁面的三種方法之一。如果你想知道更多關於它的信息,請閱讀這裏,這是一篇PHP文章,但是每種Web語言都有這樣的內容:[link](http://www.royhochstenbach.com/php-passing-information-http-post-vs- http-get-vs-sessions-vs-cookies /) –