package com.github.lqingchenl.coding2017.litestruts;
import org.jsoup.Jsoup;
import org.jsoup.helper.StringUtil;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.beans.PropertyDescriptor;
import java.io.File;
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) {
try {
Document d = Jsoup.parse(new File("src/com/github/lqingchenl/coding2017/litestruts/struts.xml"), "UTF-8"); //读取配置文件
String classStr = null;
Map<String, String> resultMap = new HashMap<>();
for (Element element : d.select("action")) {
if (element.attr("name").equals(actionName)) {
classStr = element.attr("class");
for (Element element1 : element.select("result")) {
resultMap.put(element1.attr("name"), element1.text());
}
}
}
if (StringUtil.isBlank(classStr)) {
return null;
}
Class<?> c = Class.forName(classStr);
Object object = c.newInstance(); //创建对象
//写数据 setName和setPassword方法
for (Map.Entry<String, String> entry : parameters.entrySet()) {
PropertyDescriptor pd = new PropertyDescriptor(entry.getKey(), c);//使用java.beans.PropertyDescriptor获取Method进行方法调用
Method method = pd.getWriteMethod();//获得写方法
method.invoke(object, entry.getValue());
}
//通过反射,执行execute方法
Method method = c.getDeclaredMethod("execute", null);
String result = (String) method.invoke(object);
// 通过反射找到对象的所有getter方法(例如 getMessage),通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} ,
// 放到View对象的parameters
Map<String, String> map = new HashMap<>();
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), c); // message没有set方法,报错
Method getMethod = pd.getReadMethod();
String str = (String) getMethod.invoke(object);
map.put(field.getName(), str);
}
// 根据struts.xml中的 <result> 配置,以及execute的返回值, 确定哪一个jsp,放到View对象的jsp字段中。
View view = new View();
view.setParameters(map);
String jsp = resultMap.get(result);
view.setJsp(jsp);
return view;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}