📜  Struts 2 execAndWait拦截器示例(1)

📅  最后修改于: 2023-12-03 14:47:44.209000             🧑  作者: Mango

Struts 2 execAndWait拦截器示例

在使用Struts 2时,我们可能会遇到需要执行一些比较耗时的操作,比如文件上传、文件读写等等。这些操作会导致浏览器进入等待状态,并且可能会影响用户体验。为此,Struts 2提供了execAndWait拦截器,可以将长时间操作放到后台线程中执行,让用户界面不会被阻塞。

下面的示例演示了如何使用execAndWait拦截器。

创建Action类

我们先创建一个名为LongTimeOperationAction的Action类,它的作用是模拟一个耗时操作,比如等待10秒钟。

public class LongTimeOperationAction extends ActionSupport {
    private String result;
    
    public String execute() throws Exception {
        Thread.sleep(10000);
        result = "Hello Struts 2";
        return SUCCESS;
    }

    public String getResult() {
        return result;
    }

    public void setResult(String result) {
        this.result = result;
    }
}

上面的代码中,我们在execute方法中使用Thread.sleep方法模拟一个耗时10秒的操作,并将字符串"Hello Struts 2"赋值给result属性。最后,我们在getResult方法中返回result属性的值。

配置struts.xml

接下来,我们需要在struts.xml文件中配置execAndWait拦截器。具体来说,我们需要在Action对应的拦截器栈中添加execAndWait拦截器。

<interceptors>
    <interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor" />
    <interceptor-stack name="default">
        <interceptor-ref name="exception"/>
        <interceptor-ref name="alias"/>
        <interceptor-ref name="i18n"/>
        <interceptor-ref name="servletConfig"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="chain"/>
        <interceptor-ref name="modelDriven"/>
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="validation">
            <param name="excludeMethods">input,back,cancel,browse,save</param>
        </interceptor-ref>
        <interceptor-ref name="workflow">
            <param name="excludeMethods">input,back,cancel,browse,save</param>
        </interceptor-ref>
        <interceptor-ref name="execAndWait" />
        <interceptor-ref name="debugging"/>
    </interceptor-stack>
</interceptors>
在JSP页面中使用

最后,我们需要在JSP页面中使用execAndWait拦截器。具体来说,我们需要使用<s:action>标签来引用LongTimeOperationAction,并使用<@s.execAndWait>标签包裹我们需要延迟显示的内容。

<%@ taglib prefix="s" uri="/struts-tags"%>

<s:action name="longTimeOperation">
    <@s.execAndWait name="longTimeOperation">
        Waiting...
    </@s.execAndWait>
    <br />
    <s:property value="result" />
</s:action>

上面的代码中,我们使用<s:action>标签引用了名为LongTimeOperationAction的Action类。接下来,我们在<@s.execAndWait>标签中添加了Waiting...这段文字,意味着我们需要等待一段时间才能看到下面的<s:property>标签中的内容。最后,我们使用<s:property>标签显示了LongTimeOperationAction中的结果。

示例结果

最终的结果是,我们在浏览器中看到了Waiting...提示,然后等待10秒钟后,看到了"Hello Struts 2"的结果。

这就是Struts 2 execAndWait拦截器的使用示例,希望能对大家有所帮助。