package com.coderising.litestruts;
import java.io.File;
import java.util.Iterator;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import com.coderising.litestruts.exception.StrutsException;
import com.coderising.litestruts.util.FileUtils;
import com.coding.basic.impl.ArrayList;
import com.sun.org.apache.xml.internal.security.encryption.XMLEncryptionException;
public class Struts {
public static final String DETAULT_XML = "struts.xml";
public static final String ACTION_TAGNAME = "action";
public static final String RESULT_TAGNAME = "result";
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字段中。
*/
return null;
}
/**
* 获取struts中配置的所有action
* 通过dom4j实现读xml文件
* Struts action元素的是2层结构,故,这里只解析2层
* @param path
* @return
* @return:ArrayList
*/
private static ArrayList getActionBeans(String dir,String fileName){
if(!FileUtils.createDir(dir)){
throw new IllegalArgumentException("文件路径不存在:"+dir);
}
File f = new File(dir);
if(null == fileName || "".endsWith(fileName)){
fileName = DETAULT_XML;
}
SAXReader saxReader = new SAXReader();
try {
f = new File(f.getPath()+"\\"+fileName);
Document document = saxReader.read(f);
Element element = document.getRootElement();
ArrayList actions = new ArrayList();
Iterator iterator = element.elementIterator(ACTION_TAGNAME);
// 遍历每一个action
while(iterator.hasNext()){
Element actionEle = (Element) iterator.next();
ActionBean bean = new ActionBean();
bean.setName(actionEle.attributeValue("name"));
bean.setClazz(actionEle.attributeValue("class"));
Iterator it = actionEle.elementIterator(RESULT_TAGNAME);
ArrayList results = new ArrayList();
// 遍历每一个result
while(it.hasNext()){
Element resultEle = (Element) it.next();
Result result = new Result();
result.setName(resultEle.attributeValue("name"));
result.setValue(resultEle.getText());
results.add(result);
System.out.println(result);
}
bean.setResults(results);
System.out.println(bean);
actions.add(bean);
}
System.out.println();
} catch (DocumentException e) {
e.printStackTrace();
throw new StrutsException("xml文件解析失败:,dir="+dir+",fileName="+fileName,e);
}
return null;
}
private static class ActionBean{
String name;
String clazz;
ArrayList results;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public ArrayList getResults() {
return results;
}
public void setResults(ArrayList results) {
this.results = results;
}
@Override
public String toString() {
return "ActionBean [name=" + name + ", clazz=" + clazz
+ ", results=" + results + "]";
}
}
private static class Result{
String name;
String value;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "Result [name=" + name + ", value=" + value + "]";
}
}
public static void main(String[] args) {
Struts.getActionBeans("src/com/coderising/litestruts/","");
}
}