struts2动作类中的Ajax响应

时间:2012-01-20 04:16:40

标签: ajax jsp struts2

我正在尝试使用struts2在jsp中实现ajax(避免表单提交)。我使用ajax代码通过url将请求传递给struts2动作。但struts2的反应并没有在日本出现。它显示“空”值。我使用AJAX在jsp中调用动作的代码如下所示。

    function ajaxEditFunctionCall(){  
 var xmlHttp;
     var url = "ajaxcall.action?stateName="+frm.stateName.value;  
  try{   
    xmlHttp=new XMLHttpRequest();   
  }catch (e){
      try{ 
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); 
      }catch (e){ 
          try{  
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); 
            }catch (e){
                alert("Your browser does not support AJAX!");
                return false;
            }
      }
  }
  alert(1);
  xmlHttp.onreadystatechange = showMessage; 
      alert(2);

  xmlHttp.open("GET", URL, true); 

       alert(3);
       xmlHttp.send(null);  
  }

      function showMessage() { 
       alert("Inside Show Message1");
         alert(xmlhttp.readyState);
             if(xmlhttp.readyState==4)  
            { 
             alert("Inside Show Message2&ReadyState4");
                 alert(xmlhttp.responseText);  
            }  
       }  

   Included following code in Action Class:

public String ajaxcall() throws Exception{

     System.out.println("Inside AjaxCall");
     String errorXml = "This is a Sample to Check";  

     response.setContentType("text/html"); 
     response.setHeader("Cache-Control", "no-cache"); 
         response.setContentType("text/html");   
     response.getWriter().write(errorXml); 

     return null;

}

Struts.xml中包含的代码:

  <action name="ajaxcall" class="com.logic.action.CustomerAction" method="ajaxcall">
       <result name="success" >/pages/customer/addCustomer.jsp</result> 
   </action>

我认为错误发生在action-response语句和struts.xml中。任何人都可以帮我解决这个问题。在此先感谢。

3 个答案:

答案 0 :(得分:5)

我相信这个简单的代码应该适用于Ajax调用。下面的示例使用流结果,但您甚至可以使用JSON,XML或任何其他您想要的格式作为返回。 如果请求来自脚本/ ajax或任何其他方式,服务器端struts2没有考虑到帐户

动作

public class TextResult extends ActionSupport  {
    private InputStream inputStream;
    public InputStream getInputStream() {
        return inputStream;
    }

    public String execute() throws Exception {
        inputStream = new StringBufferInputStream("Hello World! This is a text string response from a Struts 2 Action.");
        return SUCCESS;
    }
}

Struts.xml文件

struts.xml中

<action name="text-result" class="actions.TextResult">
    <result type="stream">
        <param name="contentType">text/html</param>
        <param name="inputName">inputStream</param>
    </result>
</action>

你可以在JS上使用上面的设置。成功调用Action将返回“Hello World!这是来自Struts 2 Action的文本字符串响应。” string

更新

这是一个完整的工作代码,作为Ajax调用

JSP代码

<head>
<script type="text/javascript">
            var xmlHttp;
            function ajaxEditFunctionCall(){

                var URL = "welcomeAjax.action?stateName=State1";
                try{
                    xmlHttp=new XMLHttpRequest();
                }catch (e){
                    try{
                        xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
                    }catch (e){
                        try{
                            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                        }catch (e){
                            alert("Your browser does not support AJAX!");
                            return false;
                        }
                    }
                }
                //alert(1);
                xmlHttp.onreadystatechange = showMessage;
                //alert(2);

                xmlHttp.open("GET", URL, true);

                //alert(3);
                xmlHttp.send(null);
            }

            function showMessage() {
                //alert("Inside Show Message1");
                //alert(xmlHttp.readyState);
                if(xmlHttp.readyState==4)
                {
                    alert("Inside Show Message2&ReadyState4");
                    alert(xmlHttp.responseText);
                }
            }  
        </script>
</head>
<body>
<s:form id="form">
<input type="button" onclick="ajaxEditFunctionCall()"/>
</s:form>
<body>

以下是Action类的代码

动作

private InputStream inputStream;
    public InputStream getInputStream() {
        return inputStream;
    }

    public String ajax() throws Exception {
        inputStream = new StringBufferInputStream("Hello World! This is a text string response from a Struts 2 Action.");
        return SUCCESS;
    }

最后我们需要在struts.xml文件中定义关系

struts.xml中

<action name="welcomeAjax" class="com.demo.WelcomeAction" method="ajax">
            <result type="stream">
                <param name="contentType">text/html</param>
                <param name="inputName">inputStream</param>
            </result>
 </action>

上面的代码工作得很好,希望能帮到你。

答案 1 :(得分:3)

此处,需要对JavaScript函数进行更正。当您说var xmlHttp时,它在函数ajaxEditFunctionCall内有一个范围,而不是showMessage。此外,xmlhttp中的showMessage()xmlHttp中的ajaxEditFunctionCall对象不同。因此,请将var xmlHttp声明保持全局并进行更正。这是工作代码:

<script type="text/javascript">
            var xmlHttp;
            function ajaxEditFunctionCall(){

                var URL = "ajaxcall.action?stateName=State1";
                try{
                    xmlHttp=new XMLHttpRequest();
                }catch (e){
                    try{
                        xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
                    }catch (e){
                        try{
                            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                        }catch (e){
                            alert("Your browser does not support AJAX!");
                            return false;
                        }
                    }
                }
                //alert(1);
                xmlHttp.onreadystatechange = showMessage;
                //alert(2);

                xmlHttp.open("GET", URL, true);

                //alert(3);
                xmlHttp.send(null);
            }

            function showMessage() {
                //alert("Inside Show Message1");
                //alert(xmlHttp.readyState);
                if(xmlHttp.readyState==4)
                {
                    alert("Inside Show Message2&ReadyState4");
                    alert(xmlHttp.responseText);
                }
            }  
        </script>

Java代码是:

public class CustomerAction extends ActionSupport implements ServletResponseAware {

    HttpServletResponse response;

    public String ajaxcall() {

        System.out.println("Inside AjaxCall");
        String errorXml = "This is a Sample to Check";

        response.setContentType("text/html");
        response.setHeader("Cache-Control", "no-cache");
        try {
            response.getWriter().write(errorXml);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

        return null;
    }

    public void setServletResponse(HttpServletResponse response) {
        this.response = response;
    }
}

struts.xml是:

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="default" extends="struts-default">
        <action name="ajaxcall" class="com.logic.action.CustomerAction" method="ajaxcall">
            <result name="success" >/pages/customer/addCustomer.jsp</result>
        </action>
    </package>
</struts>

答案 2 :(得分:0)

以上示例完美无缺

转换为json对象使用

jsonobj=jQuery.parseJSON(req.responseText);