文档章节

Struts2框架心法--第1招--Aware接口的使用技巧

FansUnion
 FansUnion
发布于 2015/10/22 10:29
字数 852
阅读 8
收藏 0
Struts2框架中有很多值得学习的地方,本文讲述Aware接口的使用。
在Struts2和Spring框架中,为了在运行时获得某个对象,可以采用实现某个Aware接口的方式来获得。

例如,使用ServletRequestAware、ServletResponseAware等Aware 接口与外部环境交互。
   public class ServletConfigInterceptor extends AbstractInterceptor implements StrutsStatics {
 private static final long serialVersionUID = 605261777858676638L;
 
 public String intercept(ActionInvocation invocation) throws Exception {
  final Object action = invocation.getAction();
  final ActionContext context = invocation.getInvocationContext();
  /**
   * 8个可能实现的接口,8个if,而不是if else,因为可能需要同时接收8个参数
   */
  if (action instanceof ServletRequestAware) {
   HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);
   ((ServletRequestAware) action).setServletRequest(request);
  }
 
  if (action instanceof ServletResponseAware) {
   HttpServletResponse response = (HttpServletResponse) context.get(HTTP_RESPONSE);
   ((ServletResponseAware) action).setServletResponse(response);
  }
  //省略了很多代码
  return invocation.invoke();
 }
}
  逐次扫描Action是否实现了某个Aware接口,然后将Action强制转化成这个Aware接口并调用其方法完成交互对象的设置。实际上,ServletConfigInterceptor 这个拦截器为我们打造了一个对Action进行扩展的范例。
 
这个范例的打造分为三个过程:
  1.定义一个接口;
  2.让Action实现接口;
  3.在拦截器中将Action强制转化为接口,完成接口方法的调用逻辑。
 
  这三个过程的代码逻辑调用蕴含了两种不同的Action扩展结果:
其一,通过Action实现的接口,向Action传递外部信息;
其二,通过Action实现的接口,完成功能扩展。这里所采用的交互方式,其主要依据实际上是面向对象概念中类与接口之间的关系。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
  如果,我们将Action和拦截器换成自己代码中的定义或实现,就可以获得这种设计方法所带来的好处。
 下面是模仿ServletConfigInterceptor 改编而来的例子。
 
 package org.leiwen.struts2.aware;
public interface Application {
 String getName();
}
 
package org.leiwen.struts2.aware;
//ApplicationAware接口
public interface ApplicationAware {
 void setApplication(Application app);
}
 
package org.leiwen.struts2.aware;
//Session接口
public interface Session {
 Object getAttribute(String name);
 void setAttribute(String name, Object value);
}
 
package org.leiwen.struts2.aware;
//SessionAware接口
public interface SessionAware {
 void setSession(Session session);
}
package org.leiwen.struts2.aware;
//MyAction实现了ApplicationAware和SessionAware两个接口
public class MyAction implements ApplicationAware, SessionAware {
 private Application app;
 private Session session;
 @Override
 public void setApplication(Application app) {
  this.app = app;
 }
 @Override
 public void setSession(Session session) {
  this.session = session;
 }
 public String getName() {
  return app + " " + session + getClass();
 }
}
 
package org.leiwen.struts2.aware;
//action代理
public class MyActionProxy {
 private Object action;
 public Object getAction() {
  return action;
 }
 public void setAction(Object action) {
  this.action = action;
 }
}
 
package org.leiwen.struts2.aware;
import org.leiwen.struts2.aware.impl.DefaultApplication;
import org.leiwen.struts2.aware.impl.DefaultSession;

public class MyInterceptor {
 // 也可以在运行时注入
 Application app = new DefaultApplication();
 // 也可以在运行时注入
 Session session = new DefaultSession();
 public void intercept(MyActionProxy actionProxy) {
  Object action = actionProxy.getAction();
  // 如果传入的action实现了ApplicationAware接口,就向action中传入Application实例。
  if (action instanceof ApplicationAware) {
   ((ApplicationAware) action).setApplication(app);
  }
  // 如果传入的action实现了SessionAware接口,就向action中传入Session实例。
  if (action instanceof SessionAware) {
   ((SessionAware) action).setSession(session);
  }
 }
}
 
package org.leiwen.struts2.aware.impl;
import org.leiwen.struts2.aware.Application;
//Application接口的默认实现类
public class DefaultApplication implements Application {
 @Override
 public String getName() {
  return "DefaultApplication";
 }
 
}
package org.leiwen.struts2.aware.impl;
import java.util.HashMap;
import java.util.Map;
import org.leiwen.struts2.aware.Session;
//Session接口的默认实现类
public class DefaultSession implements Session {
 private Map<String, Object> context = new HashMap<String, Object>();
 @Override
 public Object getAttribute(String name) {
  return context.get(name);
 }
 @Override
 public void setAttribute(String name, Object value) {
  context.put(name, value);
 }
}
package org.leiwen.struts2.aware;
public class AwareTest {
 // 测试
 public static void main(String[] args) {
  //构造action和actionProxy
  MyAction action = new MyAction();
  MyActionProxy actionProxy = new MyActionProxy();
  actionProxy.setAction(action);
  //构造拦截器,调用拦截器的intercept方法
  MyInterceptor interceptor = new MyInterceptor();
  interceptor.intercept(actionProxy);
  System.out.println("MyAction的name:" + action.getName());
 }
}
 
  一共4个接口,6个类。

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
FansUnion
粉丝 57
博文 858
码字总数 825464
作品 0
丰台
高级程序员

暂无文章

elastic search+kibana 5.6.12安装指南

前提准备: 1,安装jdk, We recommend installing Java version 1.8.0_131 or later. 2, 设置文件最大打开数(使用命令ulimit -n查看) ulimit -n 65536 3, 创建用户elastic/用户组elastic gro...

PageYi
12分钟前
1
0
安装mongodb碰到error: unpacking of archive failed on file /etc/init.d/mongod;5bcec214: cpio: open如何解决

今用yum安装mongodb4.0.3发现一个错误,当用yum install 安装mongo-org 时除了mongodb-org-server 没有安装以外其他的都安装正确,重新安装mongodb-org-server 时报如下错误信息 在一篇老外 ...

chanking
13分钟前
1
0
O2OA:企业办公数字化转型的更佳选择

在全球都在积极探索由新一轮信息技术所引发的第四次工业革命时,一场激发企业内生动力的数字化运动在互联网企业和传统企业之间却呈现出两种截然不同的状态。   传统企业办公数字化不彻底仍...

超能之法师
16分钟前
1
0
基于SylixOS 对 Goahead 进行配置使用 OpenSSL

1. 编译并部署OpenSSL SylixOS支持OpenSSL,git地址为:http://git.sylixos.com/repo/openssl.git 获取OpenSSL工程源码后,导入RealEvo-IDE中编译,编译完成后生成动态库文件和openssl可执行...

Baiqq
19分钟前
1
0
nginx+tomcat均衡负载

一、安装好nginx环境,启动至少两个的tomcat服务; 此处tomcat访问地址为:http://192.168.106.128:1000/、http://192.168.106.128:1001/、http://192.168.106.128:1002/ 二、修改nginx配置文...

狼王黄师傅
20分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部