如何在Struts 2中将url推送到值堆栈

时间:2014-04-22 16:19:08

标签: java javascript jsp struts2 valuestack

我正在使用Struts 2.3.16。

如何将操作URL推送到值堆栈?

我试过了:

<s:push value="methodUrl">
  <s:url action="action" method="method" />
</s:push>

<s:push value="methodUrl">
  <s:url action="action" method="method" var="methodUrl" />
</s:push>

<s:push>
  <s:url action="action" method="method" var="methodUrl" />
</s:push>

即使我有struts.devMode=true,以上所有内容都会失败而不会记录任何错误。 由于s:push需要价值,因此只有第三种选择的失败才真正被期待。

背景: 我需要将URL传递给JavaScript函数,该函数位于选择标记的单独.js文件中,如下所示:

<s:select name="actionAttribute" list="attributeList"
          listKey="key" listValue="value"
          onchange="ajaxFunction('%{methodUrl}')" />

我知道如果函数在我的'<s:url action="action" method="method" />'文件中定义,我可以在JS函数中使用.jsp,但是当JavaScript在不同的文件中时,这不起作用。

当我输入上面的段落时,我意识到我可以在JSP中定义一个JavaScript函数,将JavaScript传递给ajaxFunction

所以现在我的问题纯粹是学术性的。

有没有办法s:push s:url到价值堆栈?

2 个答案:

答案 0 :(得分:0)

如果您使用url标记的var属性,则值放入值堆栈。

<s:url action="action" method="method" var="methodUrl" />
<s:select name="actionAttribute" list="attributeList"
          listKey="key" listValue="value"
          onchange="ajaxFunction('%{#methodUrl}')" />

您也可以使用不带参数的函数

<s:select name="actionAttribute" list="attributeList"
          listKey="key" listValue="value"
          onchange="ajaxFunction()" />
<script type="text/javascript">
  function ajaxFunction(){
    var methodUrl = '<s:property value="%{#methodUrl}"/>';
    // or even better
    var methodUrl2 = '<s:url action="action" method="method" var="methodUrl" />';
  }
</script>

好的,如果你想在值堆栈中push一个值,你应该使用这个标签,但是该值应该是对象的引用,它将转换为字符串url并作为参数传递给JS功能

<s:url action="action" method="method" var="methodUrl" />
<s:push value="%{#methodUrl}">
  <s:select name="actionAttribute" list="attributeList"
          listKey="key" listValue="value"
          onchange="ajaxFunction('%{top}')" />
  <script type="text/javascript">
    function ajaxFunction(url){
      alert(url);
    }
  </script>
</s:push>

答案 1 :(得分:0)

由于缺乏积极的回应,似乎使用s:push将s:url推送到值堆栈是不可能的。罗曼的反应并不是我想要的。

根据Roman的回答和我自己的实验,显然必须使用s:url的var属性才能获取值堆栈上的URL。为了防止URL出现在页面上,必须在JSP中使用JavaScript,例如基于Roman的第二个代码块:

<script type="text/javascript">
  function noNeedToExecute(){
    var dummy = '<s:url action="action" method="method" var="methodUrl" />';
  }
</script>

或者,必须使用这样的CSS:

<style>
  .hidden {display: none;}
</style>
...
<span class=hidden>
  <s:url action="action" method="method" var="methodUrl" />
</span>

我希望有一个纯粹的Struts实现,但显然我必须忍受失望。 ; - )

我离开上面并没有隐瞒我完全错了的事实。我不知道我做了什么错误的举动让我相信<s:url ... var="varName" .../>会在页面上显示需要隐藏的网址。我错了,我为浪费罗曼C的时间道歉。