package com.coderising.litestruts;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
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();
try {
SAXReader reader=new SAXReader();
Document doc=reader.read("./src/com/coderising/litestruts/struts.xml");
Element root=doc.getRootElement();
List<Element> list=root.elements();//将所有元素放到集合中
List<Map<String,String>> listMap=getElements(list);
int size=listmap.size();
listMap.remove(size-1);
System.out.println(listMap.toString());
String pathName="";
int index=0;
String name=parameters.get("name");
String password=parameters.get("password");
Map<String,Object> parameter=new HashMap<>();
for(int i=0;i<size;i++){
pathName=listMap.get(i).get(actionName);
if(pathName!=null){
index=i;
break;
}
}
Class clz=Class.forName(pathName);
Object obj=clz.newInstance();
Method setName=clz.getDeclaredMethod("setName", String.class);
Method setPassword=clz.getDeclaredMethod("setPassword", String.class);
Method execute=clz.getDeclaredMethod("execute");
Method getMessage=clz.getDeclaredMethod("getMessage");
setName.invoke(obj, name);
setPassword.invoke(obj, password);
Object result=execute.invoke(obj);
Object message=getMessage.invoke(obj);
parameter.put("message", message);
view.setParameters(parameter);
String jsp=listMap.get(index).get(result);
view.setJsp(jsp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return view;
}
private static List<Map<String,String>> listmap = new ArrayList<Map<String,String>>();
private static Map<String,String> map=new LinkedHashMap<String,String>();
private static List<Map<String,String>> getElements(List<Element> list){
for(Iterator<Element> itera1=list.iterator();itera1.hasNext();){
String key="";
String value="";
//获取action、result
Element element=itera1.next();
if(element.getName()=="action"){
map = new LinkedHashMap<String,String>();
}
if(element.getText().trim()!=null){
value=element.getText();
}
List<Attribute> attributes=element.attributes();
//获取action、result里的属性名和值
for(Iterator<Attribute> itera2=attributes.iterator();itera2.hasNext();){
Attribute attr=itera2.next();
if(attr.getName().equals("name")){
key=attr.getValue();
}
if(attr.getName().equals("class")){
value=attr.getValue();
}
if(!key.trim().isEmpty()&&!value.trim().isEmpty()){
map.put(key, value);
}
}
List<Element> subList=element.elements();
//递归action的的子元素们
if(subList.size()!=0){
getElements(subList);
}
}
listmap.add(map);
return listmap;
}
}