如何从Ajax或JavaScript调用Struts1 Action?

时间:2010-02-18 15:03:45

标签: java javascript ajax struts

我需要在加载JSP时调用一个动作。跟踪访问该页面的用户数量。

我有一个动作VisitorCounterAction,它会更新数据库。 在加载JSP时,我正在调用ajax函数callCounter();

{

        alert("callCounter");
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }

        // i need some correction here
        xmlhttp.open("GET",VisitorCounterAction,false);
        xmlhttp.send(null);
        alert("callCounter returned from Action");
        }

我得到一个例外:

/web/guest/content?p_p_id=31&p_p_lifecycle=0&p_p_state=pop_up&p_p_mode=view&_31_struts_action=%2Fimage_gallery%2Fview_slide_show&_31_folderId=10605 generates exception: null

请帮我解决这个问题。或者任何其他方式来调用Action。 我无法重新加载页面,因为它将再次调用onload函数。

谢谢, DJ

3 个答案:

答案 0 :(得分:0)

调用操作时需要指定正确的url。在struts.xml文件中,您将创建一个带有名称的操作条目。假设名字是VisitorCounterAction。请注意,这不是Action类的名称,而是您在struts.xml中使用的名称。

此外,您还可以配置struts来识别特定的扩展名。默认情况下是.do。

要请求操作,您将使用:VisitorCounterAction.do。

所以试试:

  xmlhttp.open("GET","VisitorCounterAction.do",false);

还要注意URL周围的双引号,因为这是xmlHttp对象的open()方法中的String。

答案 1 :(得分:0)

XMLHttpRequest对象的open方法的第二个参数应该是一个字符串,它是请求的URL。在您的情况下,应该是Struts的Action Mapping映射到您的VisitorCounterAction。类似的东西:

xmlhttp.open("GET", "/viewCounterAction.do", false); 

答案 2 :(得分:0)

如果您使用的是Liferay 4.2,则此链接可能会对您有所帮助(http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/Ajax+Toolkit)。 Liferay 4.2拥有自己的一套用于执行AJAX功能的JavaScript API(在jquery中实现)。