package main.week02.litestruts;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class Struts {
public static View runAction(String actionName,
Map<String, String> parameters) throws Exception,
NoSuchFieldException {
/*
*
* 0. 读取配置文件struts.xml
*
* 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象)
* 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 ("name"="test" ,
* "password"="1234") , 那就应该调用 setName和setPassword方法
*
* 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success"
*
* 3. 通过反射找到对象的所有getter方法(例如 getMessage), 通过反射来调用, 把值和属性形成一个HashMap , 例如
* {"message": "登录成功"} , 放到View对象的parameters
*
* 4. 根据struts.xml中的 <result> 配置,以及execute的返回值, 确定哪一个jsp,
* 放到View对象的jsp字段中。
*/
XmlSaxUtil config = new XmlSaxUtil("struts.xml");
String classname = config.getClassName(actionName);
// 1 通过反射存入parameter
// 没有这个类名就报错
if (null == classname) {
throw new CustomException("没有这个action啊!");
}
// 通过反射获取实例
Class<?> controllerClass = Class.forName(classname);
// 创建实例
Object controller = controllerClass.newInstance();
// 获取类中声明的全部成员变量
Field[] fields = controllerClass.getDeclaredFields();
// 备用
Method m;
// 得到该action所有result的结果合集
// 为controller注入变量
for (String key : parameters.keySet()) {
for (Field f : fields) {
if (f.getName() == key) {
m = controllerClass.getMethod("set"
+ key.replace(key.substring(0, 1),key.substring(0, 1).toUpperCase()), String.class);
m.invoke(controller, parameters.get(key));
break;
}
}
}
// 2 通过反射调用excute 获取返回值
m = controllerClass.getMethod("execute");
String result = (String) m.invoke(controller);
// 3 把message放到View对象的parameters
View view = new View();
Map<String, String> viewParam = new HashMap<String, String>();
// 新建并传入View的viewParam属性值
m = controllerClass.getMethod("getMessage");
viewParam.put("message", (String) m.invoke(controller));
view.setParameters(viewParam);
// 传入jsp路径
view.setJsp(config.getResultView(actionName, result));
return view;
}
}