模拟Struts读取XML,利用反射机制执行Action

Struts框架是著名的框架,今天我就简单谈一谈它,并在本地写一个小程序去模拟解析Struts.xml并尝试用反射机制去执行Action

通过如下模拟小程序,对Java的反射机制有了一定的了解

1.解析Struts.xml,如下XML文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <struts>
 3     <action name="login" class="com.coderising.litestruts.action.LoginAction">
 4         <result name="success">/jsp/homepage.jsp</result>
 5         <result name="fail">/jsp/showLogin.jsp</result>
 6     </action>
 7     <action name="logout" class="com.coderising.litestruts.action.LogoutAction">
 8         <result name="success">/jsp/welcome.jsp</result>
 9         <result name="error">/jsp/error.jsp</result>
10     </action>
11 </struts>

 1.1.根据action的name,得到对应的类名

  i.解析XML的技术

    有很多现存解析XML的库,dom4j等等,我个人用的JDK1.8自带的org.w3d.dom包里面提供的API

    1)根据相对路径拿到Struts XML对应的File对象

    private File lookupConfigFile(){
        URL url = getClass().getResource(CONFIG_PATH);
        return new File(url.getPath());
    }

    2)根据File对象,把它解析成一个Document对象

    private Document generateDoc(){
        DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
        Document doc = null;
        try {
            DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
            doc = docBuilder.parse (lookupConfigFile());
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return doc;
    }

     3)解析action节点,并根据传入的action,得到对应的类名

    public String invokedAction(String actionName){
        if(null != actionName && !"".equals(actionName)){
            Document doc = generateDoc();
            NodeList nodeList = doc.getElementsByTagName(CONFIG_NODE_ACTION);
            for (int i = 0; i < nodeList.getLength(); i++) {
                String actionNameConfiged = nodeList.item(i).getAttributes().getNamedItem(CONFIG_ATTR_NAME).getNodeValue();
                if(actionName.equals(actionNameConfiged)){
                    return nodeList.item(i).getAttributes().getNamedItem(CONFIG_ATTR_CLASS).getNodeValue();
                }
            }
        }
        throw new RuntimeException("actionName can't be found");
    }

 1.2.利用反射类名,执行传入参数的Setter方法

  反射能够得到一个类的相关信息

Class<?> actionClass = Class.forName(className);

  i.Method

  1)定义调用的方法

Method setNameMethod = actionClass.getMethod("setName", String.class);

  2)生成实体类

Object action = actionClass.newInstance();

  3)调用方法,并把实体类传入

 setNameMethod.invoke(action, name);
 setPasswordMethod.invoke(action, password);

 1.3.调用execute方法,并拿到要显示的Message

Method executeMethod = actionClass.getMethod("execute");
executeMethod.invoke(action).toString()

1.4.根据拿到的Message,封装一个简单对象返回

可以参考具体分享的代码

 

具体详细的代码可以参考如下地址:

 https://github.com/conf1102/coding2017/tree/master/group20/404130810/src/com/coderising/litestruts

posted @ 2017-03-05 17:45  AlvinWu1102  阅读(731)  评论(0编辑  收藏  举报