【问题标题】:Ajax response in struts2 action classstruts2动作类中的Ajax响应
【发布时间】:2012-02-14 17:42:59
【问题描述】:

我正在尝试使用 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 class-response 语句和 struts.xml 中。任何人都可以帮我解决这个问题。提前致谢。

【问题讨论】:

  • 既然有这么多更好的 JS 选项,为什么还要使用“原始”JavaScript?无论如何,使用 Firebug/Chrome 开发工具等很容易检查响应中返回的内容,如果响应有效,那么它就在您的 JS 中。
  • 我相信一个简单的调试器将帮助您查明问题。如果您提交表单,它是否工作正常?
  • @Umesh 当我单击提交按钮时,它会调用 javascript 并控制转到指定的操作类并在日志文件中打印静态消息。但是响应没有出现在 jsp 中。我在动作课上用的是对还是错?
  • @Dave Newton:我不知道其他 Javascript 可以使用 ajax。它在 Struts1 中运行良好,所以我曾经在 struts2 中尝试过。如果还有其他方法可以做到这一点,请帮助我。
  • @shiva:你的方法中的这个响应是什么。我相信你可以使用流结果来发送数据,或者如果你想从你的动作类发送一大块 HTML,只需发回模板本身.

标签: ajax jsp struts2


【解决方案1】:

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

动作

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 的文本字符串响应。” 字符串

更新

这是一个完整的 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>

以上代码运行良好,希望对您有所帮助。

【讨论】:

  • Jsp代码呢?你也可以发一下吗?如果你这样做,我可以很容易地检查它。提前致谢。
  • @shiva你看过James Jithin的帖子吗,相信他已经指出了你代码中的各种问题
  • Struts2 是否支持 Ajax?
  • Struts2 不关心你是使用 ajax 调用还是简单调用。它可以完美地与任何 Java-Script 框架配合使用。
  • 非常感谢 Umesh。但是上面的程序本身并没有在jsp页面中显示responseText。它显示带有 html 标题的警报:Struts 问题报告,没有为命名空间/ 和操作名称映射的操作 [object MozURLProperty]。我不知道找到这个问题。请帮帮我。
【解决方案2】:

这里需要对JavaScript函数进行修正。当你说var xmlHttp 时,它在函数ajaxEditFunctionCall 中有一个作用域,而不是showMessage。此外,showMessage() 中的 xmlhttpajaxEditFunctionCall 中的 xmlHttp 对象不同。因此,保持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>

【讨论】:

  • 感谢您的简短示例。当我尝试这个更正并运行我的应用程序时。它完美地将 Ajax>>readystate 显示为 0,1,2,3,4。但是 responseText 显示为“/no action mapped for name space / and action name in alert box。我必须检查的地方。我已经在 struts.xml 文件中指定了动作名称。我认为现在问题出在 URL 中。
  • 我收到警报消息,因为在 JSP 中找不到操作映射。你能帮我解决这个问题吗?
  • 检查您尝试从 JavaScript 传递的 url 是否与 struts.xml 配置匹配。
  • 我发现了错误。我在 struts.xml 文件中为两个类指定了相同的操作名称。非常感谢您的帮助。
【解决方案3】:

上面的例子是完美的工作

转换成json对象使用

jsonobj=jQuery.parseJSON(req.responseText);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2015-12-21
    • 1970-01-01
    • 2014-08-02
    • 2010-12-12
    • 2013-01-03
    相关资源
    最近更新 更多