您的位置:首页 > 编程语言 > Java开发

struts2中RequestAware通过反射简单原理实现

2017-04-27 01:53 239 查看
我们知道,在struts2中,只要实现RequestAware,SessionAware,ApplicationAware等接口就可以使用这些对象了,达到和原本对象一样的效果,这里简单实现下,不一定完全按照我的套路

大概可以分为三个步骤:

1,获取对象,判断是否实现了此接口.如果是,传一个初始化的map给他.

2.调用主业务方法

3.从request中取出key和value,然后放入真正的request对象中

是不是很简单呢

下面给出实现:

package testRequestAware;/*4/27/2017*/

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
//模拟接口
interface RequestAware{
void setRequest(Map<String,Object> request);
}
//模拟jsp中内置对象request
class Request{
Map<String,Object> request=new HashMap<>();

public Map<String, Object> getRequest() {
return request;
}
public void  setAttribute(String key,Object value){
request.put(key,value);
}
public Object getAttribute(String key){
return request.get(key);
}
}

public class Test implements RequestAware
{
private Map<String,Object> request;
@Override
public void setRequest(Map<String, Object> request) {
this.request=request;
}

public String execute(){
request.put("name","wyh");
return "success";
}
@SuppressWarnings("unchecked")
public static void main(String[] args)throws Exception{

//一,先通过配置文件读到这个action,省略解析xml
String actionStr="testRequestAware.Test";
//后面工作相当于通过拦截器进行
//获取class对象
Class actionCls=Class.forName(actionStr);
//获取实例
Object actionInstance=actionCls.newInstance();
//判断是否实现了接口,此步骤仅仅传一个HashMap
if(actionInstance instanceof RequestAware){
Method setRequest=actionCls.getDeclaredMethod("setRequest", Map.class);
//调用,传入一个空的hashMap即可
setRequest.invoke(actionInstance,new HashMap<String,Object>());
}

//二,然后调用这个类的业务方法execute,注意,要先调用,保证用户使用完request后,再从里面取值.同样通过xml解析,那么真实数据就被put到request map中了
String methodName="execute";
Method mainMethod=actionCls.getDeclaredMethod(methodName);
mainMethod.invoke(actionInstance);

//三,把内容取出来,放到真正的request中,这里用自建的一个request模拟
//先获取成员变量,这里注意,不一定是这么实现的,因为这个成员名他没限制你,这里只是假想下
Field requestField=actionCls.getDeclaredField("request");
//设置访问私有变量权限,因为是同一个类下,不设置可以访问,但是在其他类中就不行了
requestField.setAccessible(true);
//这里注意,需要传入这个类的对象才可以获取他字段的对象
Map<String,Object>  fieldValue=(Map<String,Object>)requestField.get(actionInstance);

//实例化假想的request
Request request=new Request();
//把用户自己的map放到这个request中
for(Object key:fieldValue.keySet()){
request.setAttribute((String)key,fieldValue.get(key));
}

//四,那么,你的数据就被放入"request"中,就可以在前台调用了.最后输出结果验证

System.out.println(request.getAttribute("name"));

//五,输出"wyh"
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: