diff --git a/group12/382266293/.classpath b/group12/382266293/.classpath index 97b7b051d0..300ed0c62f 100644 --- a/group12/382266293/.classpath +++ b/group12/382266293/.classpath @@ -5,5 +5,6 @@ + diff --git a/group12/382266293/coding/basic/Collection/AbstractList.java b/group12/382266293/coding/basic/collection/AbstractList.java similarity index 97% rename from group12/382266293/coding/basic/Collection/AbstractList.java rename to group12/382266293/coding/basic/collection/AbstractList.java index a81e76b587..93da57e1bd 100644 --- a/group12/382266293/coding/basic/Collection/AbstractList.java +++ b/group12/382266293/coding/basic/collection/AbstractList.java @@ -1,4 +1,4 @@ -package Collection; +package collection; public abstract class AbstractList implements List { diff --git a/group12/382266293/coding/basic/Collection/Iterator.java b/group12/382266293/coding/basic/collection/Iterator.java similarity index 80% rename from group12/382266293/coding/basic/Collection/Iterator.java rename to group12/382266293/coding/basic/collection/Iterator.java index d51656a3a8..79955745cd 100644 --- a/group12/382266293/coding/basic/Collection/Iterator.java +++ b/group12/382266293/coding/basic/collection/Iterator.java @@ -1,4 +1,4 @@ -package Collection; +package collection; public interface Iterator { diff --git a/group12/382266293/coding/basic/Collection/List.java b/group12/382266293/coding/basic/collection/List.java similarity index 89% rename from group12/382266293/coding/basic/Collection/List.java rename to group12/382266293/coding/basic/collection/List.java index 7ddb685cac..5fdc0de9ab 100644 --- a/group12/382266293/coding/basic/Collection/List.java +++ b/group12/382266293/coding/basic/collection/List.java @@ -1,4 +1,4 @@ -package Collection; +package collection; public interface List { diff --git a/group12/382266293/coding/basic/Collection/Concrete/ArrayList.java b/group12/382266293/coding/basic/collection/concrete/ArrayList.java similarity index 96% rename from group12/382266293/coding/basic/Collection/Concrete/ArrayList.java rename to group12/382266293/coding/basic/collection/concrete/ArrayList.java index 3db5ab47e6..449cdf4e1a 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/ArrayList.java +++ b/group12/382266293/coding/basic/collection/concrete/ArrayList.java @@ -1,10 +1,10 @@ -package Collection.Concrete; +package collection.concrete; import java.util.Arrays; import java.util.NoSuchElementException; -import Collection.AbstractList; -import Collection.Iterator; +import collection.AbstractList; +import collection.Iterator; public class ArrayList extends AbstractList { diff --git a/group12/382266293/coding/basic/Collection/Concrete/BinaryTreeNode.java b/group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java similarity index 98% rename from group12/382266293/coding/basic/Collection/Concrete/BinaryTreeNode.java rename to group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java index 34a9d4253e..442b06b1c9 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/BinaryTreeNode.java +++ b/group12/382266293/coding/basic/collection/concrete/BinaryTreeNode.java @@ -1,4 +1,4 @@ -package Collection.Concrete; +package collection.concrete; public class BinaryTreeNode> { diff --git a/group12/382266293/coding/basic/Collection/Concrete/LinkedList.java b/group12/382266293/coding/basic/collection/concrete/LinkedList.java similarity index 86% rename from group12/382266293/coding/basic/Collection/Concrete/LinkedList.java rename to group12/382266293/coding/basic/collection/concrete/LinkedList.java index 66dbd9d8d0..cb3d87684d 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/LinkedList.java +++ b/group12/382266293/coding/basic/collection/concrete/LinkedList.java @@ -1,8 +1,9 @@ -package Collection.Concrete; +package collection.concrete; import java.util.NoSuchElementException; -import Collection.AbstractList; -import Collection.Iterator; + +import collection.AbstractList; +import collection.Iterator; public class LinkedList extends AbstractList { @@ -87,18 +88,28 @@ public E removeLast(){ return remove(size-1); } + @SuppressWarnings("unchecked") public E remove(int index) { checkIndex(index); - Node pNode = getNode(index); + Node pNode = null; + E data = null; if (index == 0) { + data = (E) head.data; head = head.next; - } else if (index == size-1 ) { - getNode(index-1).next = null; + } else if (index == size-1) { + pNode = getNode(index - 1); + data = (E) pNode.next.data; + pNode.next = null; } else { - getNode(index-1).next = getNode(index+1); + pNode = head; + for ( int i = 0; i < index - 1 ; i++) { + pNode = pNode.next; + } + data = (E) pNode.next.data; + pNode.next =pNode.next.next; } size--; - return pNode.data; + return data; } @Override diff --git a/group12/382266293/coding/basic/Collection/Concrete/Queue.java b/group12/382266293/coding/basic/collection/concrete/Queue.java similarity index 93% rename from group12/382266293/coding/basic/Collection/Concrete/Queue.java rename to group12/382266293/coding/basic/collection/concrete/Queue.java index 300fb633af..0875d8286a 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/Queue.java +++ b/group12/382266293/coding/basic/collection/concrete/Queue.java @@ -1,8 +1,8 @@ -package Collection.Concrete; +package collection.concrete; import java.util.NoSuchElementException; -import Collection.AbstractList; -import Collection.Iterator; +import collection.AbstractList; +import collection.Iterator; public class Queue extends AbstractList { diff --git a/group12/382266293/coding/basic/Collection/Concrete/Stack.java b/group12/382266293/coding/basic/collection/concrete/Stack.java similarity index 95% rename from group12/382266293/coding/basic/Collection/Concrete/Stack.java rename to group12/382266293/coding/basic/collection/concrete/Stack.java index 17ec4364fa..ecc0994273 100644 --- a/group12/382266293/coding/basic/Collection/Concrete/Stack.java +++ b/group12/382266293/coding/basic/collection/concrete/Stack.java @@ -1,10 +1,10 @@ -package Collection.Concrete; +package collection.concrete; import java.util.EmptyStackException; import java.util.NoSuchElementException; -import Collection.AbstractList; -import Collection.Iterator; +import collection.AbstractList; +import collection.Iterator; public class Stack extends AbstractList { diff --git a/group12/382266293/coding/basic/TestCollection/AllTests.java b/group12/382266293/coding/basic/test/collection/AllTests.java similarity index 91% rename from group12/382266293/coding/basic/TestCollection/AllTests.java rename to group12/382266293/coding/basic/test/collection/AllTests.java index cd4eeadb58..661d6c3722 100644 --- a/group12/382266293/coding/basic/TestCollection/AllTests.java +++ b/group12/382266293/coding/basic/test/collection/AllTests.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import org.junit.runner.RunWith; import org.junit.runners.Suite; diff --git a/group12/382266293/coding/basic/TestCollection/ArrayListTest.java b/group12/382266293/coding/basic/test/collection/ArrayListTest.java similarity index 96% rename from group12/382266293/coding/basic/TestCollection/ArrayListTest.java rename to group12/382266293/coding/basic/test/collection/ArrayListTest.java index f29580616f..74a3a14212 100644 --- a/group12/382266293/coding/basic/TestCollection/ArrayListTest.java +++ b/group12/382266293/coding/basic/test/collection/ArrayListTest.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import static util.Print.*; import static util.TestUtil.*; @@ -10,10 +10,9 @@ import org.junit.Before; import org.junit.Test; - -import Collection.Iterator; -import Collection.List; -import Collection.Concrete.ArrayList; +import collection.Iterator; +import collection.List; +import collection.concrete.ArrayList; import junit.framework.TestCase; public class ArrayListTest extends TestCase { diff --git a/group12/382266293/coding/basic/TestCollection/BinaryTreeNodeTest.java b/group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java similarity index 93% rename from group12/382266293/coding/basic/TestCollection/BinaryTreeNodeTest.java rename to group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java index 275ef59484..161d29298a 100644 --- a/group12/382266293/coding/basic/TestCollection/BinaryTreeNodeTest.java +++ b/group12/382266293/coding/basic/test/collection/BinaryTreeNodeTest.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import static util.Print.*; import java.util.Random; @@ -9,7 +9,7 @@ import org.junit.Before; import org.junit.Test; -import Collection.Concrete.BinaryTreeNode; +import collection.concrete.BinaryTreeNode; import junit.framework.TestCase; public class BinaryTreeNodeTest extends TestCase { diff --git a/group12/382266293/coding/basic/TestCollection/LinkedListTest.java b/group12/382266293/coding/basic/test/collection/LinkedListTest.java similarity index 96% rename from group12/382266293/coding/basic/TestCollection/LinkedListTest.java rename to group12/382266293/coding/basic/test/collection/LinkedListTest.java index 8b9fad15eb..5a2d7213af 100644 --- a/group12/382266293/coding/basic/TestCollection/LinkedListTest.java +++ b/group12/382266293/coding/basic/test/collection/LinkedListTest.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import static util.Print.*; import static util.TestUtil.*; @@ -8,9 +8,9 @@ import org.junit.Before; import org.junit.Test; -import Collection.Iterator; -import Collection.List; -import Collection.Concrete.LinkedList; +import collection.Iterator; +import collection.List; +import collection.concrete.LinkedList; import junit.framework.TestCase; @@ -182,7 +182,9 @@ public void testRemove() { assertEquals(i, myLL.size()); assertEquals(a,res); } + } + @Test public void testSize() { diff --git a/group12/382266293/coding/basic/TestCollection/QueueTest.java b/group12/382266293/coding/basic/test/collection/QueueTest.java similarity index 96% rename from group12/382266293/coding/basic/TestCollection/QueueTest.java rename to group12/382266293/coding/basic/test/collection/QueueTest.java index 01a9aa31f2..bbbd076f7d 100644 --- a/group12/382266293/coding/basic/TestCollection/QueueTest.java +++ b/group12/382266293/coding/basic/test/collection/QueueTest.java @@ -1,11 +1,14 @@ -package TestCollection; +package test.collection; import static util.Print.*; import org.junit.After; import org.junit.Before; import org.junit.Test; + +import collection.concrete.Queue; + import static util.TestUtil.*; -import Collection.Concrete.Queue; + import junit.framework.TestCase; public class QueueTest extends TestCase { diff --git a/group12/382266293/coding/basic/TestCollection/StackTest.java b/group12/382266293/coding/basic/test/collection/StackTest.java similarity index 97% rename from group12/382266293/coding/basic/TestCollection/StackTest.java rename to group12/382266293/coding/basic/test/collection/StackTest.java index 8d2f85e1bf..d64b3e60f3 100644 --- a/group12/382266293/coding/basic/TestCollection/StackTest.java +++ b/group12/382266293/coding/basic/test/collection/StackTest.java @@ -1,4 +1,4 @@ -package TestCollection; +package test.collection; import static util.Print.*; @@ -8,7 +8,7 @@ import org.junit.Before; import org.junit.Test; -import Collection.Concrete.Stack; +import collection.concrete.Stack; import junit.framework.TestCase; public class StackTest extends TestCase { diff --git a/group12/382266293/coding/basic/util/ActionXMLreader.java b/group12/382266293/coding/basic/util/ActionXMLreader.java new file mode 100644 index 0000000000..8f6e0eb497 --- /dev/null +++ b/group12/382266293/coding/basic/util/ActionXMLreader.java @@ -0,0 +1,53 @@ +package util; + +import java.util.List; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.SAXReader; + +import static util.Print.*; + +public class ActionXMLreader { + + public Node getRootNode(String add) { + SAXReader reader = new SAXReader(); + Document document = null; + Node root = null; + try { + document = reader.read(add); + root = document.getRootElement(); + } catch (DocumentException e) { + e.printStackTrace(); + } + return root; + } + + public String parseClass(Node root, String attr) { + + @SuppressWarnings("rawtypes") + List list = root.selectNodes("action[@name='" + attr + "']"); + String clazz = null; + for(Object o:list){ + Element e = (Element) o; + clazz = e.attributeValue("class"); + } + return clazz; + } + + public String parseResult(Node root, String attr, String result) { + + @SuppressWarnings("rawtypes") + List list = root.selectNodes("action[@name='" + attr + "']/result[@name='" + result + "']"); + + String jsp = null; + for(Object o:list){ + Element e = (Element) o; + jsp = e.getTextTrim(); + } + return jsp; + } + + +} diff --git a/group12/382266293/coding/basic/util/Print.java b/group12/382266293/coding/basic/util/Print.java index 81b5cf539e..403339f9aa 100644 --- a/group12/382266293/coding/basic/util/Print.java +++ b/group12/382266293/coding/basic/util/Print.java @@ -12,7 +12,7 @@ public static void println(Object o){ System.out.println(o); } - public static void printArr(int[] arr) { + public static void printArr(Object[] arr) { println(Arrays.toString(arr)); } diff --git a/group12/382266293/coding/basic/util/TestUtil.java b/group12/382266293/coding/basic/util/TestUtil.java index 0820e0e684..009e67ca26 100644 --- a/group12/382266293/coding/basic/util/TestUtil.java +++ b/group12/382266293/coding/basic/util/TestUtil.java @@ -3,10 +3,10 @@ import java.util.Arrays; import java.util.Random; -import Collection.List; -import Collection.Concrete.ArrayList; -import Collection.Concrete.LinkedList; -import Collection.Concrete.Queue; +import collection.List; +import collection.concrete.ArrayList; +import collection.concrete.LinkedList; +import collection.concrete.Queue; import junit.framework.TestCase; diff --git a/group12/382266293/lib/.gitignore b/group12/382266293/lib/.gitignore index 3d08860a86..edf7850106 100644 --- a/group12/382266293/lib/.gitignore +++ b/group12/382266293/lib/.gitignore @@ -1 +1,3 @@ /dom4j-1.6.1.zip +/jaxen-1.1-beta-6.jar +/dom4j-1.6.1.jar diff --git a/group12/382266293/src/TestDom4J.java b/group12/382266293/src/TestDom4J.java deleted file mode 100644 index b5dabfcc0c..0000000000 --- a/group12/382266293/src/TestDom4J.java +++ /dev/null @@ -1,59 +0,0 @@ -import java.net.URL; -import java.util.Iterator; -import java.util.List; - -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 static util.Print.*; - -public class TestDom4J { - - public Document parse(String add) throws DocumentException { - SAXReader reader = new SAXReader(); - Document document = reader.read(add); - return document; - } - - - - public void bar(Document document) { - List list = document.selectNodes( "/struts-config/action-mappings/action" ); - Node node = document.selectSingleNode( "/struts-config/action-mappings/action/forward" ); - - String name = node.valueOf( "@name" ); - println(name); - } - - public void listNodes(Element node){ - System.out.println("当前节点的名称:" + node.getName()); - //首先获取当前节点的所有属性节点 - List list = node.attributes(); - //遍历属性节点 - for(Attribute attribute : list){ - System.out.println("属性"+attribute.getName() +":" + attribute.getValue()); - } - //如果当前节点内容不为空,则输出 - if(!(node.getTextTrim().equals(""))){ - System.out.println( node.getName() + ":" + node.getText()); - } - //同时迭代当前节点下面的所有子节点 - //使用递归 - Iterator iterator = node.elementIterator(); - while(iterator.hasNext()){ - Element e = iterator.next(); - listNodes(e); - } - } - - public static void main(String args[]) throws DocumentException { - - - - } - -} diff --git a/group12/382266293/src/array/ArrayUtil.java b/group12/382266293/src/array/ArrayUtil.java index f33f64150b..85df44e987 100644 --- a/group12/382266293/src/array/ArrayUtil.java +++ b/group12/382266293/src/array/ArrayUtil.java @@ -3,8 +3,9 @@ import static util.Print.*; import java.util.Arrays; import java.util.BitSet; -import Collection.Iterator; -import Collection.Concrete.ArrayList; + +import collection.Iterator; +import collection.concrete.ArrayList; diff --git a/group12/382266293/src/litestruts/LoginAction.java b/group12/382266293/src/com/coderising/action/LoginAction.java similarity index 92% rename from group12/382266293/src/litestruts/LoginAction.java rename to group12/382266293/src/com/coderising/action/LoginAction.java index c37c250014..b1224eb80d 100644 --- a/group12/382266293/src/litestruts/LoginAction.java +++ b/group12/382266293/src/com/coderising/action/LoginAction.java @@ -1,4 +1,4 @@ -package litestruts; +package com.coderising.action; /** * 这是一个用来展示登录的业务类, 其中的用户名和密码都是硬编码的。 diff --git a/group12/382266293/src/litestruts/Struts.java b/group12/382266293/src/litestruts/Struts.java index f26fa8d8b7..cb7593c657 100644 --- a/group12/382266293/src/litestruts/Struts.java +++ b/group12/382266293/src/litestruts/Struts.java @@ -1,34 +1,116 @@ package litestruts; +import util.ActionXMLreader; +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.MethodDescriptor; +import java.beans.PropertyDescriptor; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; import java.util.Map; - - +import org.dom4j.Node; +import static util.Print.*; public class Struts { - public static View runAction(String actionName, Map parameters) { + private static Object actionObj = null; + private static String address = "src/litestruts/struts.xml"; + private static ActionXMLreader reader = new ActionXMLreader(); + + @SuppressWarnings("unchecked") + public static View runAction(String actionName, Map parameters){ - /* - - 0. 读取配置文件struts.xml - - 1. 根据actionName找到相对应的class , 例如LoginAction, 通过反射实例化(创建对象) - 据parameters中的数据,调用对象的setter方法, 例如parameters中的数据是 - ("name"="test" , "password"="1234") , - 那就应该调用 setName和setPassword方法 - - 2. 通过反射调用对象的exectue 方法, 并获得返回值,例如"success" + Node root = reader.getRootNode(address); + String clazz = reader.parseClass(root, actionName); + actionObj = getObj(clazz); + BeanInfo bi = getBeanInfo(actionObj); + PropertyDescriptor[] pd = bi.getPropertyDescriptors(); + + setParameters(actionObj, pd, parameters); + String executeResult = (String) getResult(actionObj, bi, "execute"); + String jsp = reader.parseResult(root, actionName, executeResult); + Map readParamters = getReadParameters(actionObj, pd); + + View view = new View(); + view.setJsp(jsp); + view.setParameters(readParamters); - 3. 通过反射找到对象的所有getter方法(例如 getMessage), - 通过反射来调用, 把值和属性形成一个HashMap , 例如 {"message": "登录成功"} , - 放到View对象的parameters + return view; + } + + + private static Object getObj(String clazz) { + @SuppressWarnings("rawtypes") + Class cls = null; + + try { + cls = Class.forName(clazz); + return cls.newInstance(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + }catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + return null; + } + + + private static BeanInfo getBeanInfo(Object obj) { - 4. 根据struts.xml中的 配置,以及execute的返回值, 确定哪一个jsp, - 放到View对象的jsp字段中。 - - */ + BeanInfo bi = null; + try { + bi = Introspector.getBeanInfo(obj.getClass(), Object.class); + } catch (IntrospectionException e) { + e.printStackTrace(); + } + return bi; + } + + private static void setParameters(Object obj, PropertyDescriptor[] pd ,Map parameters) { - return null; - } + for (int i = 0; i < pd.length; i++) { + String name = pd[i].getName(); + if(parameters.containsKey(name)) + try { + pd[i].getWriteMethod().invoke(obj,parameters.get(name)); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + } + + private static String getResult(Object obj, BeanInfo bi,String execute) { + MethodDescriptor[] methods = bi.getMethodDescriptors(); + for (int i = 0; i < methods.length; i++) { + String methodName = methods[i].getName(); + if(methodName.equals(execute)) + try { + return (String) methods[i].getMethod().invoke(actionObj); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + } + return null; + } + + @SuppressWarnings("rawtypes") + public static Map getReadParameters (Object obj, PropertyDescriptor[] pd) { + + Map viewParams = new HashMap(); + + for (int i = 0; i < pd.length; i++) { + String readMethod = pd[i].getReadMethod().getName().substring(3); + String value = null; + try { + value = (String) pd[i].getReadMethod().invoke(obj); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { + e.printStackTrace(); + } + viewParams.put(readMethod.toLowerCase(), value); + } + return viewParams; + } + } \ No newline at end of file diff --git a/group12/382266293/src/litestruts/StrutsTest.java b/group12/382266293/src/litestruts/StrutsTest.java index e08fab55c9..35686c8e30 100644 --- a/group12/382266293/src/litestruts/StrutsTest.java +++ b/group12/382266293/src/litestruts/StrutsTest.java @@ -1,19 +1,17 @@ package litestruts; +import java.beans.IntrospectionException; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; import org.junit.Assert; import org.junit.Test; - - - - public class StrutsTest { @Test - public void testLoginActionSuccess() { + public void testLoginActionSuccess() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException { String actionName = "login"; @@ -29,7 +27,7 @@ public void testLoginActionSuccess() { } @Test - public void testLoginActionFailed() { + public void testLoginActionFailed() throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException { String actionName = "login"; Map params = new HashMap(); params.put("name","test"); diff --git a/group12/382266293/src/litestruts/struts.xml b/group12/382266293/src/litestruts/struts.xml index 99063bcb0c..fb0c2be3de 100644 --- a/group12/382266293/src/litestruts/struts.xml +++ b/group12/382266293/src/litestruts/struts.xml @@ -5,7 +5,7 @@ /jsp/showLogin.jsp - /jsp/welcome.jsp - /jsp/error.jsp + /jsp/welcome.jsp + /jsp/error.jsp \ No newline at end of file