1.WebApp

解析web.xml文件,并通过路径获取servlet

  1. public class WebApp {
  2. private static WebContext webContext;
  3. //解析xml文件
  4. static {
  5. try {
  6. SAXParserFactory factory = SAXParserFactory.newInstance();
  7. SAXParser parse = factory.newSAXParser();
  8. WebHandler handler = new WebHandler();
  9. parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("web.xml"), handler);
  10. List<Entity> entitys = handler.getEntitys();
  11. List<Mapping> mappings = handler.getMappings();
  12. webContext = new WebContext(entitys, mappings);
  13. }catch(Exception e) {
  14. System.out.println("解析配置文件错误");
  15. }
  16. }
  17. public static Servlet getServletFromUrl(String url){
  18. String name = webContext.getClz("/" + url);
  19. Class clz;
  20. try {
  21. clz = Class.forName(name);
  22. Servlet servlet = (Servlet)clz.getConstructor().newInstance();
  23. return servlet;
  24. } catch (Exception e) {
  25. // TODO Auto-generated catch block
  26. e.printStackTrace();
  27. }
  28. return null;
  29. }
  30. }

2.handler处理器

  1. public class WebHandler extends DefaultHandler{
  2. private List<Entity> entitys;
  3. private List<Mapping> mappings;
  4. private Entity entity;
  5. private Mapping mapping;
  6. //存储当前标签名
  7. private String tag;
  8. //判断当前标签是否为servlet-mapping
  9. private boolean isMapping;
  10. @Override
  11. public void startDocument() throws SAXException {
  12. entitys = new ArrayList<Entity>();
  13. mappings = new ArrayList<Mapping>();
  14. }
  15. @Override
  16. public void endDocument() throws SAXException { }
  17. @Override
  18. public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
  19. if(null != qName) {
  20. tag = qName;
  21. if(qName.equals("servlet")) {
  22. entity = new Entity();
  23. isMapping = false;
  24. }
  25. else if(qName.equals("servlet-mapping")) {
  26. mapping = new Mapping();
  27. isMapping = true;
  28. }
  29. }
  30. }
  31. @Override
  32. public void endElement(String uri, String localName, String qName) throws SAXException {
  33. if(qName != null) {
  34. if(qName.equals("servlet")) {
  35. entitys.add(entity);
  36. }
  37. else if(qName.equals("servlet-mapping")) {
  38. mappings.add(mapping);
  39. }
  40. }
  41. //避免结束标签与另外的开始标签之间的空内容覆盖标签内容
  42. tag = null;
  43. }
  44. @Override
  45. //读取标签之间的内容,不管标签是否一一对应
  46. public void characters(char[] ch, int start, int length) throws SAXException {
  47. String msg = new String(ch, start, length).trim();
  48. if(tag != null) {
  49. if(isMapping) {//操作servlet-mapping
  50. if(tag.equals("servlet-name")) {
  51. mapping.setName(msg);
  52. }
  53. if(tag.equals("url-pattern")) {
  54. mapping.add(msg);
  55. }
  56. }else {//操作servlet
  57. if(tag.equals("servlet-name")) {
  58. entity.setName(msg);
  59. }
  60. if(tag.equals("servlet-class")) {
  61. entity.setClz(msg);
  62. }
  63. }
  64. }
  65. }
  66. public List<Entity> getEntitys() {
  67. return entitys;
  68. }
  69. public List<Mapping> getMappings() {
  70. return mappings;
  71. }
  72. }

3.修改receive代码
image.png