无法在JSP脚本标记内创建Struts2标记

时间:2017-04-20 22:47:11

标签: javascript jsp struts2

我在JSP页面的<s:param>标记内有一些javascript。

我想在某个条件为真的情况下创建一个struts2标签。这就是我所拥有的:

<s:param name="pageScript">
  <script type="text/javascript">
  $(document).ready(function() {
      if(translateField === "true") {
        var declaredValue;
        declaredValue= document.createElement("div");
        declaredValue.innerHTML = '<s\:textfield label="HELLO" \/>';              
      } else {
        var declaredValue = document.createElement("input");
        declaredValue.type = "text";
        declaredValue.id = "declaredValueInput";
        declaredValue.value = "some value";
      }
  });
  </script>
</s:param>

我按照本页面上的评论:Create Struts2 tag inside JavaScript function并且我在一个JSP中的一个struts标记中包含了我的JS。

任何人都会看到我可能做错了什么,或者是否有更好的方法可以解决这个问题?

我使用文本字段作为示例,但最后我想创建一个<s:select>标记。

要明确说明我想要做什么:我正在尝试动态创建一个元素,如果一个标志基本上设置为true。因此,如果该标志为true,则创建一个在我的struts类中使用列表的标记,否则使用普通的ol'文本字段。

我在我的示例中使用了一个文本字段,看看我是否可以使用struts标记。

1 个答案:

答案 0 :(得分:0)

引用你所链接的答案:

  

JS在客户端上执行。 JSP标记在服务器上进行评估。

这意味着,当浏览器的Javascript引擎开始读取那段Javascript时,就不再有Struts标签的痕迹了,因为它们在页面渲染之前就被翻译成了HTML代码。

您可以使用正确的语法将一个Struts标记注入JS中,这将是

declaredValue.innerHTML = '<s:textfield label="HELLO" />';              

,那么你就会遇到这样的问题:生成的HTML不会被清理包含在Javascript字符串中('"等...) 。但这是你真正需要的吗?你不能简单地存储"HELLO"文本,然后自己构建一个HTML <input type="text" />吗?

类似的东西:

var text  = '<s:text name="HELLO" />';

或(记得在JS块中的escapeJavascript="true"标签中使用<s:property />,否则您将容易受到XSS攻击):

var text  = '<s:property value='getText("HELLO")' escapeJavascript="true" />';

然后

var label = '<label for="hello">' + text + '</label>';
var input = '<input type="text" id="hello" />';
declaredValue.innerHTML = label + input;

应该让你更接近你想要实现的目标。

P.S:innerHTML很快,但不是在Javascript中创建对象的正确方法。