6

我正在使用 Struts 2。使用拦截器,我在每个页面执行开始时创建一个数据库连接。

例如,如果用户访问“myAction.do”,它将创建数据库连接,然后调用myAction.do方法。

我现在正在寻找的是一个拦截器或任何其他在页面执行后自动调用方法的方式,这将关闭数据库连接。

那可能吗?

4

2 回答 2

5

在拦截器中,您可以编写预处理和后处理逻辑。

预处理逻辑将在动作执行之前执行,后处理逻辑将在动作执行之后执行。

Struts2 提供了非常强大的使用拦截器控制请求的机制。拦截器负责大部分请求处理。它们在调用动作之前和之后由控制器调用,因此它们位于控制器和动作之间。拦截器执行诸如日志记录、验证、文件上传、双重提交保护等任务。

之后您将编写的任何内容都invocation.invoke();将在执行操作后执行

例如,请参见此处

于 2013-05-10T04:57:40.790 回答
1

在http://blog.agilelogicsolutions.com/2011/05/struts-2-interceptors-before-between.html中全面描述

你可以有拦截器:

  1. 行动前
  2. 行动与结果之间
  3. 视图渲染后

正如网站中提到的,这里是代码示例

拦截器之前

public class BeforeInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
      // do something before invoke
       doSomeLogic();
      // invocation continue    
      return invocation.invoke();
    }
  }
}

行动与结果之间

public class BetweenActionAndResultInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
      // Register a PreResultListener and implement the beforeReslut method
      invocation.addPreResultListener(new PreResultListener() { 
        @Override
        public void beforeResult(ActionInvocation invocation, String resultCode) {
          Object o = invocation.getAction();
          try{
            if(o instanceof MyAction){
              ((MyAction) o).someLogicAfterActionBeforeView();
            }
            //or someLogicBeforeView()
          }catch(Exception e){
            invocation.setResultCode("error");
          }
        }
      });

      // Invocation Continue
      return invocation.invoke();
    }
  }
}

视图渲染后

public class AfterViewRenderedInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
      // do something before invoke
      try{
        // invocation continue    
        return invocation.invoke();
      }catch(Exception e){
        // You cannot change the result code here though, such as:
        // return "error"; 
        // This line will not work because view is already generated  
        doSomeLogicAfterView();
      } 
    }
  }
}
于 2015-06-08T07:11:30.567 回答