我正在开发一个struts2(2.1.8)web应用程序。我想使用执行等待拦截器,以便在处理上传的文件时显示等待页面。
在解决了线程问题(execAndWait拦截器在等待后没有重定向到success页面)之后,我没有一个NPE访问getText()方法,我继续遇到一些问题。
如果调试动作执行所有的jsp表单变量(包括上传的文件)都可以(与调试检查员我可以看到文件路径,内容类型,文件名),但文件不在目录中它必须是:
C:\apps\apache-tomcat-6.0.39\work\Catalina\localhost\validador\upload_24cd6d23_a0ec_4887_a47c_7af1f5b703d1_00000002.tmp
我也读过这篇文章:无法找到文件源时,处理文件的struts-jQuery的执行等待拦截器
但是我已经声明了一个自定义拦截器堆栈,包括默认堆栈:
<interceptors>
<interceptor name="execAndWaitExtended" class="aoc.interceptor.myExecuteAndWaitInterceptor"></interceptor>
<interceptor-stack name="waitStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="execAndWaitExtended" />
</interceptor-stack>
</interceptors>
我的行动宣言:
<package name="default" namespace="/" extends="struts-default" >
...
<action name="uploadUpdatePDF" class="aoc.action.signature.UpdatePDFUpload">
<interceptor-ref name="waitStack"/>
<result type="tiles" name="input">tilesDef.validacioUpdatePDF</result>
<result name="wait">pages/wait.jsp</result>
<result type="tiles" name="sucess">tilesDef.validacioUpdatePDFResult</result>
</action>
理解线程问题解决了,从上传的文件的文件名或文件路径似乎可以调试,我不明白为什么文件实际上没有存储在服务器目录中(和它的工作正常之前执行和等待拦截器被添加)。
有什么建议吗?
我不确定你的myExekteAndWaitInterceptor是做什么的,但是它需要复制文件,以便运行你的操作的后台线程可以使用。
在下面的代码中,我假设有一个名为AbstractUploadAction的基类,它实现了上传文件所需的方法(即获取文件和文件名)。
public class CustomExecuteAndWaitInterceptor extends org.apache.struts2.interceptor.ExecuteAndWaitInterceptor {
@Override
protected BackgroundProcess getNewBackgroundProcess(String name, ActionInvocation actionInvocation,
int threadPriority) {
BackgroundProcess bgProcess;
if (actionInvocation.getAction() instanceof AbstractUploadAction) {
AbstractUploadAction uploadAction = (AbstractUploadAction)actionInvocation.getAction();
try {
File origFile = uploadAction.getUpload();
if (origFile != null) {
File altFile = new File(origFile.getParentFile(), origFile.getName() + "-alt.tmp");
FileUtils.copyFile(origFile, altFile);
altFile.deleteOnExit();
uploadAction.setUpload(altFile);
}
} catch (Exception ex) {
throw new RuntimeException("Error copying uploaded file", ex);
}
bgProcess = new UploadBackgroundProcess(name + "BackgroundThread", actionInvocation, threadPriority);
} else {
bgProcess = super.getNewBackgroundProcess(name, actionInvocation, threadPriority);
}
return bgProcess;
}
/**
* Wraps the standard {@link BackgroundProcess} to clean up alternate file created above.
*/
private class UploadBackgroundProcess extends BackgroundProcess {
public UploadBackgroundProcess(String threadName, ActionInvocation invocation, int threadPriority) {
super(threadName, invocation, threadPriority);
}
@Override
protected void afterInvocation() throws Exception {
super.afterInvocation();
FileUtils.deleteQuietly(((AbstractUploadAction)getAction()).getUpload());
}
}
}
当使用执行和等待拦截器时,您通常应该假设,您可能想要的任何资源,如果不是直接对您的操作可用,则不会对您可用,除非您在执行和等待拦截器启动之前复制它或注入它。
主要内容:1. 动作,2. JSP页面,3. 执行和等待拦截器,4. 示例,参考在Struts2中附带一个名为“execAndWait”一个非常有趣的“执行和等待”拦截器,这是一个非常方便的拦截器长时间运行操作在后台,显示用户的自定义的等待页面。在本教程中,它显示了一个完整的使用 Struts2 execAndWait 拦截器的例子。 1. 动作 一个普通的动作类,有一个长时间运行进程,证明了execAndWait效果。 LongProcessAction.java 2. J
主要内容:Struts2框架的拦截器:,如何使用拦截器?,创建自定义的拦截器,创建拦截器类:,创建动作类:,创建视图,创建页面:,配置文件,堆叠多个拦截器:拦截器的概念是Servlet过滤器或JDK代理类一样的。拦截器允许横切功能分开实现的动作,以及框架。使用拦截器,可以实现如下: 提供预处理行动之前被称为逻辑。 提供后处理逻辑动作后被调用 捕获异常,这样可以进行替代处理。 Struts2框架提供的许多功能都使用拦截实现的例子包括异常处理,文件上传,生命周期回调和验证等事实上作为Struts2的
我尝试使用Struts2上传文件(图像)。但是,我的文件、文件内容和文件名类型的值为空!我试图寻找这个问题,但没有任何结果。 这就是我想做的: jsp: 行动: struts.xml
例子 $ gcc -save-temps a/foo.c $ ls foo.* foo.c foo.i foo.o foo.s $ gcc -save-temps=obj a/foo.c -o a/foo $ ls a foo foo.c foo.i foo.o foo.s 技巧 如上所示,使用选项-save-temps可以保存gcc运行过程中生成的临时文件。这些中间文件的名字是
问题内容: 如何保存/加载类所在的文件?我之前没有该位置的物理路径,而是想动态地找到该文件。 我想加载一个XML文件并对其进行读写,但我不确定该如何解决。 问题答案: 在一般情况下,您不能。从类加载器加载的资源可以是任何东西:目录中的文件,嵌入jar文件中的文件,甚至可以通过网络下载。
问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器