从Java管理动态JavaScript的最佳实践是什么?
我正在用JSP开发一个网页,它使用大量来自Java后端类的动态生成的JavaScript代码。它是关于谷歌地图和一个叫做MarkerClusterer的JS库的 目前,这个类通过在Java中处理字符串并将其直接打印到JSP页面来生成JavaScript代码,但是在Java字符串中编写JS并维护它变得有点复杂 JavaScript始终需要大量修改,因为这个类正在不同的项目中使用。理想情况下,我希望以一种可以用作库的方式对其进行打包,而不需要进一步修改,所以这就是问题所在,什么是实现这一点的最佳方式 下面是代码的一部分:从Java管理动态JavaScript的最佳实践是什么?,java,javascript,jsp,markerclusterer,Java,Javascript,Jsp,Markerclusterer,我正在用JSP开发一个网页,它使用大量来自Java后端类的动态生成的JavaScript代码。它是关于谷歌地图和一个叫做MarkerClusterer的JS库的 目前,这个类通过在Java中处理字符串并将其直接打印到JSP页面来生成JavaScript代码,但是在Java字符串中编写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() {"
...
公共类JavascriptGenerator{
公共字符串gerarPorRegiao(字符串上下文路径、列表列表A、布尔信息窗口已启用){
字符串saida=“”;
赛达+=“”
+ ""
+ ""
+“var映射;”;
for(Estado e:Estado.values()){
saida+=“var mc”+e.toString()+“;”;
}
saida+=“变量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();”
+“函数geocoderInit(){”
...
您可以做的一件事是,使用字符串缓冲区并将所有java脚本内容添加到其中。
然后将其写入一个扩展名为.js的文件。这样,您的脚本就可以维护了您可以做的一件事是,使用字符串缓冲区并将所有java脚本内容添加到其中。
然后将其写入一个扩展名为.js的文件。这样,您的脚本就可以维护了您可以编写一个单独的JSP文件来创建javascript。然后javascript的所有静态部分都会像往常一样:
var map;
<% for(Estado e: Eastado.values()) { %>
var mc<%=e.toString()%>;
<% } %>
var selecionado;
...
var映射;
var-mc;
选择变种;
...
然后,此JSP可由其他JSP创建的HTML页面加载:
<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>
然后,在脚本、过滤器或任何类似的程序中,您可以直接使用这些参数或使用它们从数据库加载数据。您可以编写一个单独的JSP文件来创建javascript。然后,javascript的所有静态部分都会像往常一样:
var map;
<% for(Estado e: Eastado.values()) { %>
var mc<%=e.toString()%>;
<% } %>
var selecionado;
...
var映射;
var-mc;
选择变种;
...
然后,此JSP可由其他JSP创建的HTML页面加载:
<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>
然后,在脚本、过滤器或任何类似的地方,您可以直接使用这些参数,或者使用它们从数据库加载数据。我会说:不要
不要动态生成javascript。这将是一场维护的噩梦。将js保存在静态文件中,并使用ajax获取数据。您的数据可以是JSON的形式。JSON可以使用您可以下载的众多JSON库中的一个从对象层次结构自动生成。我想说:不要
不要动态生成javascript。这将是一场噩梦。将js保存在一个静态文件中,并使用ajax获取数据。您的数据可以是JSON的形式。JSON可以使用您可以下载的众多JSON库中的一个从对象层次结构自动生成。做某事从来没有最好的方法。只有有效的方法最适合你。做某事从来没有最好的方法。只有最适合你的方法。我也在考虑类似的事情,但是如何将方法需要的变量传递到页面?也许我可以使用
SESSION
或POST
来代替?不知道你所说的SESSION和POST是什么意思。我认为这不起作用。你可以传递URL pJSP的参数:path/to/JSP/file.JSP?id=17我按照你说的方式做了,只是我使用了SESSION
,因为它支持传递对象。你提到的URL参数称为GET
,与SESSION
和POST
,它是web程序中从一个页面传递数据到另一个页面的三种方式之一mming。如果您想了解更多信息,请阅读此处,这是一篇PHP文章,但每种web语言都有这样一条:将数据放入会话意味着将其保存在服务器端。这意味着如果用户打开多个浏览器选项卡,而所有选项卡共享一个会话,则可能会出现问题。POST超出范围,因为-tag始终通过HTTP GET。我也在考虑类似的事情,但是如何将方法需要的变量传递到页面?也许我可以使用SESSION
或POST
来代替?我不知道SESSION和POST是什么意思。我想不会起作用。你可以将URL参数传递到JSP:path/to/JSP/file.JSP?id=17我按照你说的方式做了,除了使用SESSION
,因为它支持传递对象。您提到的URL参数称为GET
,与SESSION
和POST
一起,它是web编程中从一个页面传递数据到另一个页面的三种方式之一。如果您想了解更多信息,请阅读这里,这是一篇PHP文章,但每个web站点都有语言有这样的功能:将数据放入会话意味着将其保存在服务器端。这意味着如果用户打开多个浏览器选项卡,因为所有选项卡共享一个会话,则可能会出现问题。POST超出范围,因为-tag总是通过HTTP get加载javascript文件。从理论上讲,这似乎是一个不错的选择——除非您尝试这样做在实践中实现这一点:)如果页面上有几个复杂度适中的jQuery UI元素(几个jQuery datatables,和Select2,和..),并且它们都开始使用AJAX下载数据,结果是您看到一个“逐渐”出现的页面—首先是这个datatable,然后是,