package com.github.wdn.coding2017.coderising.litestruts; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.io.File; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Struts { public static void main(String[] args) { Struts s = new Struts(); Map<String,Map<String,Object>> strutsMap = s.readStrutsXml(); System.out.println(strutsMap); } public static View runAction(String actionName, Map<String,String> parameters) { Map<String,Map<String,Object>> strutsMap = readStrutsXml(); View view = new View(); if(actionName.contains(actionName)){ Map<String,Object> actionMap = strutsMap.get(actionName); Map<String,String> resultMap = (Map<String, String>) actionMap.get("result"); String actionClassName = actionMap.get("class").toString(); System.out.println(actionClassName); try { Class c = Class.forName(actionClassName); // 创建实例 Object instance = c.newInstance(); // 根据parameters调用setter方法 for(Map.Entry<String,String> entry:parameters.entrySet()){ String key = entry.getKey(); String value = entry.getValue(); Method setter = c.getMethod("set"+key.substring(0, 1).toUpperCase() + key.substring(1),String.class); if(setter!=null){ setter.invoke(instance, value); } } Method executeMethod = c.getMethod("execute"); Object result = executeMethod.invoke(instance,null); view.setJsp(resultMap.get(result)); Map<String, String> paramters = new HashMap<String, String>(); Method[] methods = c.getMethods(); for (Method m:methods) { String methodName = m.getName(); if(methodName.startsWith("get")){ String key = methodName.replace("get","").toLowerCase(); paramters.put(key,m.invoke(instance,null).toString()); } } view.setParameters(paramters); } catch (Exception e) { e.printStackTrace(); } }else{ try { throw new ClassNotFoundException(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return view; } public static Map<String,Map<String,Object>> readStrutsXml(){ SAXReader reader = new SAXReader(); Map<String,Map<String,Object>> strutsMap = new HashMap<String, Map<String,Object>>(); try { String path = System.getProperty("user.dir"); Document document = reader.read(new File(path+"\\src\\main\\java\\com\\github\\wdn\\coding2017\\coderising\\litestruts\\struts.xml")); Element root = document.getRootElement(); for (Iterator i = root.elementIterator(); i.hasNext(); ) { Map<String,Object> actionMap = new HashMap<String, Object>(); Element actionElement = (Element) i.next(); if(actionElement.getName().equals("action")){ actionMap.put("name",actionElement.attributeValue("name")); actionMap.put("class",actionElement.attributeValue("class")); } Map<String,String> resultMap = new HashMap<String, String>(); for (Iterator j=actionElement.elementIterator();j.hasNext();){ Element resultElement = (Element)j.next(); resultMap.put(resultElement.attributeValue("name"), resultElement.getText()); actionMap.put("result", resultMap); } strutsMap.put(actionElement.attributeValue("name"),actionMap); } } catch (DocumentException e) { e.printStackTrace(); } return strutsMap; } }