package com.sanmubird.litestruts;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.ParserConfigurationException;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.xml.sax.SAXException;
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字段中。
*/
View view = new View();
String actionClassPath = null ;
Class actionClass;
String resultName = null;
List<Element> actionElement = parseXML();
try {
for(Element e : actionElement){
if("action".equals(e.getName())){
if(e.attributeValue("name").equals(actionName)){
actionClassPath = e.attributeValue("class");
actionClass = Class.forName(actionClassPath);
Object actionClassInstance = actionClass.newInstance(); //通过反射 得到类的对象
if(parameters != null){
for(Map.Entry<String, String> entry : parameters.entrySet()){
String filedName = entry.getKey();
String methodName = "set"+toUpperFirstLetter(filedName);
Class<?> filedType = actionClass.getDeclaredField(filedName).getType();
Method method = actionClass.getDeclaredMethod(methodName, filedType);
method.invoke(actionClassInstance, entry.getValue());//对当前对象的实例化;
}
}
Method execute = actionClass.getDeclaredMethod("execute");
String result = (String) execute.invoke(actionClassInstance); //得到execute执行的结果
Method[] methods = actionClass.getDeclaredMethods();
Map<String,Object> param = new HashMap<String,Object>();
for(Method method : methods){
String methodName = method.getName();
if(method.getName().startsWith("get")){
String filedName = methodName.substring(3,4).toLowerCase()+methodName.substring(4);
Object filedValue = method.invoke(actionClassInstance);
param.put(filedName, filedValue);
}
}
view.setParameters(param);
List<Element> resultElement = e.elements();
for(Element e1 : resultElement ){
if("result".equals(e1.getName())){
resultName = e1.attributeValue("name");
if(resultName.equals(result)){
view.setJsp(e1.getText());
break;
}
}
}
}
}
}
}catch (Exception e1) {
e1.printStackTrace();
}
return view ;
}
public static List<Element> parseXML(){
SAXReader reader = new SAXReader();
List<Element> firstList = null;
try {
InputStream in = Struts.class.getClassLoader().getResourceAsStream("com/sanmubird/litestruts/struts.xml");// 要加载的文件和.class文件在同一个目录下;
// Class.getClassLoader.getResourceAsStream(String path); 默认是从ClassPath根下获取的;
// Class.getResourceAsStream(String path) path(/dirName/fileName)是从ClassPath根下获取的,没有/则是从本.class文件同目录中获取的;
Document doc = reader.read(in);
Element root = doc.getRootElement();
firstList = root.elements();
} catch (Exception e) {
e.printStackTrace();
}
return firstList;
}
public static String toUpperFirstLetter(String s){
if(s != "" ){
String s1 = s.substring(0,1).toUpperCase();
String other = s.substring(1);
return s1+other;
}else{
throw new RuntimeException("传入的参数不能是空 或 '' ");
}
}
}