package cn.net.pikachu.litestruts;
import cn.net.pikachu.litestruts.xstream.Action;
import cn.net.pikachu.litestruts.xstream.Result;
import com.thoughtworks.xstream.XStream;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
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) {
/*
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字段中。
*/
try {
// 目标文件
// File file = new File("/home/pikachu/Documents/2017编程提高/coding2017/group13/2931408816/lesson2/src/main/java/cn/net/pikachu/litestruts/struts.xml");
File file = new File("D:\\src\\java\\coding2017\\group13\\2931408816\\lesson2\\src\\main\\java\\cn\\net\\pikachu\\litestruts\\struts.xml");
XStream xStream = new XStream();
// 扫描注解
xStream.processAnnotations(new Class[]{
cn.net.pikachu.litestruts.xstream.Struts.class,Result.class,Action.class
});
// struts.xml映射的类
cn.net.pikachu.litestruts.xstream.Struts struts = (cn.net.pikachu.litestruts.xstream.Struts) xStream.fromXML(file);
Class clazz = null;
Action action = null;
// 找到执行action的类
for (Action a :
struts.getActions()) {
if (a.getName().equals(actionName)){
System.out.println("执行 "+actionName);
clazz = Class.forName(a.getClazz());
action = a;
break;
}
}
if (clazz == null){
throw new ClassNotFoundException("执行action "+actionName+" 所对应的类");
}
// 参数注入
Object o = clazz.newInstance();
// java可怜的lambda表达式
final Class c = clazz;
parameters.forEach((k,v)->{
try {
String methodName = "set"+k.substring(0,1).toUpperCase()+k.substring(1);
System.out.println("调用"+methodName);
Method method = c.getMethod(methodName,String.class);
method.invoke(o,v);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
});
// 执行
Method method = clazz.getMethod("execute");
String name = (String) method.invoke(o);
// 可怜又可恶的Java lambda表达式
final String[] results = new String[]{null};
action.getResults().forEach(it -> {
if (it.getName().equals(name)){
results[0]=it.getResult();
}
});
if (results[0]==null){
throw new Exception("未找到与action匹配的结果");
}
// 获取最后的结果
View view = new View();
view.setJsp(results[0]);
/**
* 没有正确理解老师的意思
*/
/*
String message = (String) clazz.getMethod("getMessage").invoke(o);
parameters.put("message",message);
view.setParameters(parameters);
*/
Map<String,Object> map = new HashMap<String,Object>();
Method[] methods = clazz.getMethods();
for (Method m : methods) {
String methodName = m.getName();
if (methodName.startsWith("get")){
String attr = methodName.substring(3);
attr=attr.substring(0,1).toLowerCase()+attr.substring(1);
Object value = m.invoke(o);
map.put(attr,value);
}
}
view.setParameters(map);
return view;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}