package com.coderising.litestruts; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.xml.parsers.ParserConfigurationException; import org.xml.sax.SAXException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Struts { public static View runAction(String actionName, Map<String,String> parameters) { View view=new View(); String execute=null; //execute返回值。 String placeOfJsp=null; //JSP地址。 String classname=getClassName(actionName); Class<?> classAction = null; Object obj=null; try { classAction=Class.forName(classname); //根据类名反射实例化class类。 } catch (ClassNotFoundException e) { e.printStackTrace(); } //ClassAction类使用newInstance();方法调用LoginAction类的默认构造方法创建LoginAction类。 try { obj=classAction.newInstance(); //Object类型的对象。 } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } //调用对象的setter方法,设置用户名和密码,即把name和password的值设置到当前LoginAction的对象中。 try { setter(obj,"name",parameters.get("name"),String.class); setter(obj,"password",parameters.get("password"),String.class); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { e.printStackTrace(); } //调用对象的exectue方法。 try{ Method method=classAction.getMethod("execute"); execute=(String) method.invoke(obj); }catch(Exception e){ e.printStackTrace(); } //调用对象的所有getter方法,把值设置到view对象的parameters属性中。 Map<String, String> para=new HashMap<String, String>(); try{ para.put("name", getter(obj,"name")); para.put("password", getter(obj,"password")); para.put("message", getter(obj,"message")); }catch(Exception e){ e.printStackTrace(); } view.setParameters(para); //根据execute返回值和<result>配置,将JSP地址赋值给View对象的jsp成员中。 placeOfJsp=getResultName(actionName,execute); view.setJsp(placeOfJsp); //System.out.println(view.getJsp()+" "+view.getParameters()); return view; } /* * 第一个参数为操作对象,第二个参数为操作的数据的数据成员,第三个参数为set的值,第四个参数为参数的类型 */ private static void setter(Object obj, String att, Object value, Class<?> type) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { //实例化一个set方法 Method method=obj.getClass().getMethod("set"+initStr(att), type); method.invoke(obj, value); } /* * getter方法 */ private static String getter(Object obj,String att) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ Method method=obj.getClass().getMethod("get"+initStr(att)); method.invoke(obj); return (String) method.invoke(obj); } /* * 根据java的命名规则,数据成员的第一个单词都要小写,其他单词的首字母大写。 * 所以把set和get方法后面的单词的首字母大写,如setName中的N * 和getName中的N. */ private static String initStr(String old) { String str=old.substring(0,1).toUpperCase()+old.substring(1); //把首字母大写。 return str; } public static void main(String args[]){ String actionName = "login"; Map<String,String> params = new HashMap<String,String>(); params.put("name","test"); params.put("password","1234"); runAction(actionName,params); } //查找action类,查找result时,必须要通过查找action才行。 private static String getClassName(String actionName){ String className=getData(actionName).get(actionName); return className; } //查找result时,必须要通过查找action才行。 private static String getResultName(String actionName,String result){ String placeOfJsp=getData(actionName).get(result); return placeOfJsp; } //从配置信息中获取数据,获取 private static HashMap<String,String> getData(String actionName) { SAXGetInfo a=new SAXGetInfo(); ArrayList<HashMap<String, String>> x; HashMap<String,String> y=null; Object[] arr=new Object[10]; int size=0; try { x = a.getDate(); Iterator it=x.iterator(); while(it.hasNext()){ arr[size]=(Object)it.next(); size++; } } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } if(actionName.equals("login")){ y=(HashMap<String, String>) arr[0]; } if(actionName.equals("logout")){ y=(HashMap<String, String>) arr[1]; } return y; } }