Strut2 execAndWait拦截器+;JSON结果类型+;Dojo dijit.ProgressBar=AJAX进度条

Strut2 execAndWait拦截器+;JSON结果类型+;Dojo dijit.ProgressBar=AJAX进度条,ajax,json,dojo,struts2,progress-bar,Ajax,Json,Dojo,Struts2,Progress Bar,我正在使用Dojo ProgressBar使用execAndWait拦截器在Struts2中显示一个长时间运行的进程。对于返回等待结果的每个调用,execAndWait拦截器将操作放在值堆栈上。但是,当结果类型为JSON时,该操作仅具有该操作的默认值 这是我的struts操作配置 (我尝试对结果名称进行通配符,但没有成功) 注意:我必须将JSON包装在文本区域中,因为Dojo的iframe.send希望它包装在文本区域中 <action name="upload" class="Proc

我正在使用Dojo ProgressBar使用execAndWait拦截器在Struts2中显示一个长时间运行的进程。对于返回等待结果的每个调用,execAndWait拦截器将操作放在值堆栈上。但是,当结果类型为JSON时,该操作仅具有该操作的默认值

这是我的struts操作配置
(我尝试对结果名称进行通配符,但没有成功)
注意:我必须将JSON包装在文本区域中,因为Dojo的iframe.send希望它包装在文本区域中


<action name="upload" class="ProcessFileAction" method="upload">
  <interceptor-ref name="agfStack" />
  <interceptor-ref name="execAndWait">
    <param name="delay">1000</param>
    <param name="delaySleepInterval">500</param>
  </interceptor-ref>
  <result name="wait" type="json">
    <param name="noCache">true</param>
    <param name="contentType">text/html</param>
    <param name="wrapPrefix"><![CDATA[<html><body><textarea>]]></param>
    <param name="wrapSuffix"><![CDATA[</textarea></body></html>]]></param>
    <param name="includeProperties">percentComplete,processMessage,running</param>
  </result>
  <result name="success" type="json">
    <param name="noCache">true</param>
    <param name="contentType">text/html</param>
    <param name="wrapPrefix"><![CDATA[<html><body><textarea>]]></param>
    <param name="wrapSuffix"><![CDATA[</textarea></body></html>]]></param>
    <param name="includeProperties">percentComplete,processMessage,running</param>
  </result>
  <result name="error" type="json">
    <param name="noCache">true</param>
    <param name="contentType">text/html</param>
    <param name="wrapPrefix"><![CDATA[<html><body><textarea>]]></param>
    <param name="wrapSuffix"><![CDATA[</textarea></body></html>]]></param>
    <param name="includeProperties">percentComplete,processMessage,running</param>
  </result>
</action>

我将查看JSON结果类型和ExecAndWait拦截器的代码以获得更多线索。

在查看了
JSONResult
之后,我发现了问题

在JSON上设置“root”对象时,它会在值堆栈上查找值。如果不是,则查看ActionInvocations操作(不与ExecAndWait IntercePro一起使用)

因此,我创建了一个LongRunningImpl类来保存LongRunning信息


public class LongRunningImpl implements LongRunning {
  private Integer percentComplete = 0;
  private String processMessage = "Uploading file...";
  private boolean running = true;
...
}
我在行动中使用了该对象:


public class ProcessFileAction {
  LongRunning longRunning;

  private FileProcessor fileProcessor;
  private File file;
  private String fileContentType;
  private String fileFileName;

  public String upload() throws Exception {
    getLongRunning().setProcessMessage("Processing File...");
    getLongRunning().setPercentComplete(10);
    try {
      if(!getFile().exists()) {
        getFile().createNewFile();
      }
      File processedFile = getFileProcessor().process(getFile(), getLongRunning());
    } catch(Exception e) {
      e.printStackTrace();
      getLongRunning().setProcessMessage("An error occurred while processing your file.");
      getLongRunning().setPercentComplete(100);
      getLongRunning().setRunning(false);
      return ERROR;
    }
    getLongRunning().setProcessMessage("Process Complete!");
    getLongRunning().setPercentComplete(100);
    getLongRunning().setRunning(false);
    return SUCCESS;
  }
...
}
然后在我的结果上设置根对象:


<action name="upload" class="ProcessFileAction" method="upload">
  <interceptor-ref name="agfStack" />
  <interceptor-ref name="execAndWait">
    <param name="delay">1000</param>
    <param name="delaySleepInterval">500</param>
  </interceptor-ref>
  <result name="wait" type="json">
    <param name="noCache">true</param>
    <param name="contentType">text/html</param>
    <param name="wrapPrefix"><![CDATA[<html><body><textarea>]]></param>
    <param name="wrapSuffix"><![CDATA[</textarea></body></html>]]></param>
    <param name="root">longRunning</param>
    <param name="includeProperties">percentComplete,processMessage,running</param>
  </result>
  <result name="success" type="json">
    <param name="noCache">true</param>
    <param name="contentType">text/html</param>
    <param name="wrapPrefix"><![CDATA[<html><body><textarea>]]></param>
    <param name="wrapSuffix"><![CDATA[</textarea></body></html>]]></param>
    <param name="root">longRunning</param>
    <param name="includeProperties">percentComplete,processMessage,running</param>
  </result>
  <result name="error" type="json">
    <param name="noCache">true</param>
    <param name="contentType">text/html</param>
    <param name="wrapPrefix"><![CDATA[<html><body><textarea>]]></param>
    <param name="wrapSuffix"><![CDATA[</textarea></body></html>]]></param>
    <param name="root">longRunning</param>
    <param name="includeProperties">percentComplete,processMessage,running</param>
  </result>
</action>

1000
500
真的
文本/html
]]>
]]>
长跑
完成百分比、处理消息、正在运行
真的
文本/html
]]>
]]>
长跑
完成百分比、处理消息、正在运行
真的
文本/html
]]>
]]>
长跑
完成百分比、处理消息、正在运行

现在一切都好了!我可能会将此列为Struts2的缺陷,但我不确定如何接收它。我认为JSON结果对象应该先检查值堆栈上的操作,然后再默认返回ActionInvocation上的操作。

您是否有可能修改答案以了解FileProcessor是什么?无论是源代码,甚至是如何实现它的摘要都会非常有用

public class LongRunningImpl implements LongRunning {
  private Integer percentComplete = 0;
  private String processMessage = "Uploading file...";
  private boolean running = true;
...
}

public class ProcessFileAction {
  LongRunning longRunning;

  private FileProcessor fileProcessor;
  private File file;
  private String fileContentType;
  private String fileFileName;

  public String upload() throws Exception {
    getLongRunning().setProcessMessage("Processing File...");
    getLongRunning().setPercentComplete(10);
    try {
      if(!getFile().exists()) {
        getFile().createNewFile();
      }
      File processedFile = getFileProcessor().process(getFile(), getLongRunning());
    } catch(Exception e) {
      e.printStackTrace();
      getLongRunning().setProcessMessage("An error occurred while processing your file.");
      getLongRunning().setPercentComplete(100);
      getLongRunning().setRunning(false);
      return ERROR;
    }
    getLongRunning().setProcessMessage("Process Complete!");
    getLongRunning().setPercentComplete(100);
    getLongRunning().setRunning(false);
    return SUCCESS;
  }
...
}

<action name="upload" class="ProcessFileAction" method="upload">
  <interceptor-ref name="agfStack" />
  <interceptor-ref name="execAndWait">
    <param name="delay">1000</param>
    <param name="delaySleepInterval">500</param>
  </interceptor-ref>
  <result name="wait" type="json">
    <param name="noCache">true</param>
    <param name="contentType">text/html</param>
    <param name="wrapPrefix"><![CDATA[<html><body><textarea>]]></param>
    <param name="wrapSuffix"><![CDATA[</textarea></body></html>]]></param>
    <param name="root">longRunning</param>
    <param name="includeProperties">percentComplete,processMessage,running</param>
  </result>
  <result name="success" type="json">
    <param name="noCache">true</param>
    <param name="contentType">text/html</param>
    <param name="wrapPrefix"><![CDATA[<html><body><textarea>]]></param>
    <param name="wrapSuffix"><![CDATA[</textarea></body></html>]]></param>
    <param name="root">longRunning</param>
    <param name="includeProperties">percentComplete,processMessage,running</param>
  </result>
  <result name="error" type="json">
    <param name="noCache">true</param>
    <param name="contentType">text/html</param>
    <param name="wrapPrefix"><![CDATA[<html><body><textarea>]]></param>
    <param name="wrapSuffix"><![CDATA[</textarea></body></html>]]></param>
    <param name="root">longRunning</param>
    <param name="includeProperties">percentComplete,processMessage,running</param>
  </result>
</action>