Strut2 execAndWait拦截器+;JSON结果类型+;Dojo dijit.ProgressBar=AJAX进度条
我正在使用Dojo ProgressBar使用execAndWait拦截器在Struts2中显示一个长时间运行的进程。对于返回等待结果的每个调用,execAndWait拦截器将操作放在值堆栈上。但是,当结果类型为JSON时,该操作仅具有该操作的默认值 这是我的struts操作配置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
(我尝试对结果名称进行通配符,但没有成功)
注意:我必须将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>