【问题标题】:jQuery tmpl and JSP code not playing nicelyjQuery tmpl 和 JSP 代码不能很好地播放
【发布时间】:2011-09-16 19:53:05
【问题描述】:

我已经在一些项目中使用了jQuery tmpl 库并且非常喜欢它。

我没有在需要使用 JSP 的小项目上使用它,事情变得很奇怪。它没有完全工作。

<script id="servicesRow" type="text/x-jquery-tmpl">
    <tr id="id_${id}">
        <td>${name2}<br />${id}</td>
        <td>${supported_roles}</td>
        <td><button class="edit">Edit</button></td>
        <td><button class="delete">Delete</button></td>
        <td><a href="#">Show clients</a></td>
    </tr>
</script>

我试图理解为什么没有数据显示。事实证明,页面中的文本正在发生某种解析,看起来像 ${foo}。因此,当我在页面上查看源代码时,所有这些元素都已被替换,如下所示:

<script id="servicesRow" type="text/x-jquery-tmpl">
    <tr id="id_">
        <td><br /></td>
        <td></td>
        <td><button class="edit">Edit</button></td>
        <td><button class="delete">Delete</button></td>
        <td><a href="#">Show clients</a></td>
    </tr>
</script>

它仍然可以用作模板,但是 jQuery tmpl 无法完成它的工作。我得到很多空行。

语法与我为 JSTL 找到的一些文档相匹配。但我可以说,我还没有安装它。我在 Windows 7 上开发现有的 Tomcat,并从头开始在我的 webapps/ 文件夹中构建一个应用程序。我可以说,我没有启用任何类似的东西,我很惊讶裸露的${} 被解析(而不是更像&lt;%= %&gt; 的东西,这在 PHP 或 ASP 和类似。

所以我的问题是:如何关闭我的 jQuery tmpl 模板的这种解析行为?全局,本地到单个 JSP,或者转义它(我尝试过额外的大括号,我尝试过反斜杠,我尝试过各种引号)。我认为理想情况下会是这样的:

<foo:stopParsingMyDollarSignsAndBracesPlease>
<script id="servicesRow" type="text/x-jquery-tmpl">
    <tr id="id_${id}">
        <td>${name2}<br />${id}</td>
        <td>${supported_roles}</td>
        <td><button class="edit">Edit</button></td>
        <td><button class="delete">Delete</button></td>
        <td><a href="#">Show clients</a></td>
    </tr>
</script>
</foo:stopParsingMyDollarSignsAndBracesPlease>

感谢任何帮助或想法。谢谢!

【问题讨论】:

    标签: jquery jsp el jquery-templates


    【解决方案1】:

    您可以通过用反斜杠引用来保护您的“$”免受 JSP 的攻击。

    在 JSP 中,“${}”构造用于引入表达式语言(“EL”)构造。例如,如果有一个名为“firstName”的请求属性,您可以通过以下方式获取名字:

    <input type='text' name='firstName' value='${firstName}'>
    

    在我看来,使用表达式语言比使用可怕的“scriptlet”语法(“

    【讨论】:

    • 我可以看到它的用处,恼人的是语法与 jQuery tmpl 重叠,但也许也有用。谢谢!
    【解决方案2】:

    ${} 表示法是 Expression Language。您可以通过

    在每个 JSP 的基础上关闭它
    <%@page isELIgnored="true" %>
    

    或在应用程序范围内通过web.xml 中的以下内容:

    <jsp-config>
        <el-ignored>true</el-ignored>
    </jsp-config>
    

    或者,如果您真的想在 JSP 的其他地方使用 EL,那么您只需通过 \ 转义 jQuery 模板中的那些。您真的很想避免使用老式的 scriptlets

    <tr id="id_\${id}">
    

    或者你可以把所有的 JS 代码放到它自己的 JS 文件中(如果 jQuery tmpl 支持的话)。

    【讨论】:

    • 哦,伙计,我把反斜杠放在大括号上,而不是美元符号上。当然,这更符合逻辑。我会尝试各种配置。这让我又跑了!谢谢!
    • &lt;%@page isELIgnored="true" %&gt; 运行良好。原来是空的现在充满了数据!
    • 如果您在 JSP 或应用程序范围内禁用 EL,我想知道您的 .jsp 实际上不应该是 .html 文件更好。
    • BalusC,也许吧。还为时过早。就 JSP 而言,我绝对还没有进入“最佳实践领域”。我非常感谢能够使用 stackoverflow 快速确定发生了什么。
    【解决方案3】:

    在 jQuery 模板中使用 {{= variable_name}} 而不是 ${variable_name}

    https://github.com/jquery/jquery-tmpl/issues/56

    【讨论】:

      【解决方案4】:

      如果您不想转义所有 jQuery 标签,您可以使用所有 jQuery 脚本构建一个单独的 JSP,并维护这个独特的 JSP 保护:

      &lt;%@page isELIgnored="true" %&gt;

      然后你可以在需要的地方包含这个 JSP。

      【讨论】:

      • 这是真的,但与@BalusC 的回答重复。
      • 这不是重复。它使用相同的配置,但具有不同的原理。我建议在一个独特的页面中创建一个标签集中,并在需要时重复使用它。
      【解决方案5】:

      不建议关闭EL,当jsp页面有其他el时,如何处理, 你可以这样做:

      <script id="servicesRow" type="text/x-jquery-tmpl">
      <tr id="id_{{= id}}">
          <td>{{= name2}}<br />${id}</td>
          <td>{{= otherInfo}}</td>
          <td><button class="edit">Edit</button></td>
          <td><button class="delete">Delete</button></td>
          <td><a href="#">Show clients</a></td>
      </tr>
      

      注意:El中有一个空格,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 2013-02-27
        • 2019-11-10
        • 2015-09-19
        • 2014-05-15
        • 1970-01-01
        • 2016-06-23
        相关资源
        最近更新 更多