【问题标题】:Good practices to follow while mixing Javascript and JSP?混合 Javascript 和 JSP 时要遵循的良好做法?
【发布时间】:2013-01-18 20:19:19
【问题描述】:

在理想情况下,我想将 Javascript 分离到一个完全不同的文件中,并将其包含在 JSP 页面中。但在某些情况下,我很难遵守这条规则,仅仅是因为动态生成的 Javascript 更容易编写!!

几个例子:

1) 警告框中特定于区域设置的错误消息。

<%
Locale locale = ..//get current locale
%>

<script language="JavaScript">
function checkMessage() {
  if(document.form.msg.value=='') {
    alert(<%= *LocaleHelper.getMessage(locale,"please_provide_message")* %>); //get the locale specific message . mixing Javascript and JSP !!!
  }
}

2) 初始化值。有时您需要使用 JSP 获取值,这将在 javascript 方法中使用

function computeExpiry () {
 var creationDate= <%= creationDate =%>
 var currentDate = document.form.date.value;
 var jsCreationDate= converToDate(creationDate);
 return currentDate>creationDate ;
}

3) 动态初始化配置对象

var myConfig = {
     modal:true,
     resize:true,
   <% if (lastPage) { %>
     showPreviousButton  :true,  
     showNextButton : false ,
     showSubmitButton : true,
   <%}  else  {%>
   showPreviousButton  :true,  
     showNextButton : true ,
     showSubmitButton : false,
   <%} %>  

您可以想象,如果没有任何约定,我们所有的 JSP 都将是 Javascript 和 JSP 的难看混合体,难以理解和维护,并且包含大量不可重用的 javascript 代码

我不是在寻找完美的解决方案。我知道这样做比尝试保持纯 Javascript 和 JSP 分离更容易。我正在寻找可以简化此过程的建议,并希望很多人有值得分享的经验。

【问题讨论】:

    标签: java javascript jsp


    【解决方案1】:

    混合使用 JavaScript 和 JSP 会使代码更难阅读、重用、维护并且还会降低性能(这样的 JS 代码不能被外部化和压缩)。尽可能避免这种情况。

    一种方法是在一个地方收集所有与 JSP 相关的变量,并将非 JSP 代码分解到另一个纯/静态 JavaScript 文件中。例如:

    <script type='text/javascript' > 
        var app = { // global app "namespace" holds app-level variables
         msg: "<%= *LocaleHelper.getMessage(locale,"please_provide_message")* %>";
         creationDate: <%= creationDate =%>;
         btnConfig: {
           <% if (lastPage) { %>
               showNextButton : false ,
               showSubmitButton : true,
           <%} else  {%>
               showNextButton : true ,
               showSubmitButton : false,
           <%} %>
          }
        };
    </script>
    
    // following JS has no JSP, you can externalize them into a separate JS file
    // s.t. they can be compressed and cached.
    function checkMessage() {
      if(document.form.msg.value=='') {
        alert(app.msg);
      }
    }
    
    function computeExpiry () {
        var creationDate= app.creationDate;
        var currentDate = document.form.date.value;
        var jsCreationDate= converToDate(creationDate);
        return currentDate > creationDate;
     }
    
     var myConfig = _.extend({   // underscore library's extend
         modal: true,
         resize: true,
         showPreviousButton: true,  
     }, app.btnConfig);
    

    顺便说一句,在实际应用中,我推荐像RequireJS 这样的模块加载器库,而不是原始地定义全局变量。

    【讨论】:

    • 您提到 checkMessage() 可以外化为 JS 文件。但这变成了无效的 Javascript,因为它引用了该文件中未定义的变量“app”。你同意吗?如果是,您是否遵循某种变量命名约定来 tdocument 必须在其他地方定义“app”才能使此功能正常工作?
    • 如果在包含其他文件之前定义app,就可以了(stackoverflow.com/questions/2932782/…)。实际上,在实际应用中,我推荐像 RequireJS 这样的模块加载器库。
    【解决方案2】:

    我尽量避免这种情况,但是当我必须将数据从后端传递 到前端时,我使用了一个平面 JavaScript 对象,该对象由后端的哈希创建。您可以将任何语言的哈希转换为 JSON 字符串。在您的 HTML 页面中放置一个 &lt;script&gt; 标记并将该 JSON 字符串转储到其中并将其分配给 JavaScript 变量。

    例如:

    <script>
      var dataFromBackEnd = JSON.parse(<%= Hash.toJSON(); %>); // I'm just assuming JSP part
    </script>
    

    从这一点来看,JavaScript 应该关注逻辑。如果存在 JS 需要对其采取措施的条件,则将其布尔值传递给 JS。不要混合逻辑。

    【讨论】:

    • 这看起来是一个不错且干净的方法。你真正要说的是首先初始化所有的 javascript 变量。因为“Hash”可能不是JSP唯一的变量..会有静态变量,请求对象中会有不同的变量等等。所以对于每个这样的“后端”变量,初始化一个javascript变量然后移动前进?
    • 如果您将所有这些变量转储到一个 JS 对象中,它会更加干净。这里要注意安全。当然,您不能将所有内容都传递给前端
    • 你能用代码说明如何在一个 JS 对象中转储不同的 JSP 变量吗?
    【解决方案3】:

    首先,您可以避免使用小脚本。而是使用它使用 JSP 标记,如 JSTL。它可以让你更好地格式化你的代码。

    【讨论】:

      猜你喜欢
      • 2017-03-27
      • 1970-01-01
      • 2020-05-19
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多