温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java webserver-反射webxml

发布时间:2020-06-15 22:58:56 来源:网络 阅读:348 作者:wx5d21d5e6e5ab1 栏目:编程语言

思路:通过解析xml将各个类存入容器内,然后通过map存放各个标签的内容,通过
url-pattern的内容找到servlet-name,通过servlet-name的内容,找到对应的类servlet-class,然后通过servlet-class内的内容(包名.类名)反射得到对应的类,然后输出

web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>login</servlet-name> <servlet-class>hello.RegisterServlet</servlet-class> </servlet> <servlet> <servlet-name>reg</servlet-name> <servlet-class>hello.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> <url-pattern>/g</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>reg</servlet-name> <url-pattern>/reg</url-pattern> </servlet-mapping> </web-app>

xml:

public class xmll { public static void main(String[] args) throws Exception{ //SAX解析 //1、获取解析工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //2、从解析工厂获取解析器 SAXParser parse =factory.newSAXParser(); //3、编写处理器 //4、加载文档 Document 注册处理器 WebHandler handler=new WebHandler(); //5、解析 parse.parse(Thread.currentThread().getContextClassLoader() .getResourceAsStream("hello\\web.xml") ,handler); //获取数据 WebContext context=new WebContext(handler.getEntitys(),handler.getMappings()); //假设你输入了 /login String className=context.getClz("/login"); //反射 Class clz=Class.forName(className); //className返回的是servlet-class的内容,即包名.类名 Servlet servlet=(Servlet)clz.getConstructor().newInstance(); servlet.service(); } } class WebHandler extends DefaultHandler{ private List<Entity> entitys = new ArrayList<Entity>(); private List<Mapping> mappings = new ArrayList<Mapping>(); private Entity entity ; private Mapping mapping ; private String tag; //存储操作标签 private boolean isMapping = false; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(null!=qName) { tag = qName; //存储标签名 if(tag.equals("servlet")) { entity = new Entity(); isMapping = false; }else if(tag.equals("servlet-mapping")) { mapping = new Mapping(); isMapping = true; } } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String contents = new String(ch,start,length).trim(); if(null!=tag) { //处理了空 if(isMapping) { //操作servlet-mapping if(tag.equals("servlet-name")) { mapping.setName(contents); }else if(tag.equals("url-pattern")) { mapping.addPattern(contents); //添加的是url对应的内容,不是标签,并且内容不能相同 //因为一个类有多个url的内容,所以加入集合,要不然要两个变量来保存,且这两个url都是对应的一个name一个class } }else { //操作servlet if(tag.equals("servlet-name")) { entity.setName(contents); }else if(tag.equals("servlet-class")) { entity.setClz(contents); } } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(null!=qName) { if(qName.equals("servlet")) { entitys.add(entity); }else if(qName.equals("servlet-mapping")) { mappings.add(mapping); } } tag = null; //tag丢弃了 } public List<Entity> getEntitys() { return entitys; } public List<Mapping> getMappings() { return mappings; } }

webContext:

public class WebContext { private List<Entity> entitys=null; private List<Mapping> mappings=null; //key:servlet-name value:servlet-class private Map<String,String> entityMap=new HashMap<String,String>(); //key:url-pattern value :servlet-name private Map<String,String> mappingMap=new HashMap<String,String>(); public WebContext(List<Entity> entitys,List<Mapping> mappings) { this.entitys=entitys; this.mappings=mappings; for(Entity entity:entitys) { entityMap.put(entity.getName(), entity.getClz()); } for(Mapping mapping:mappings) { for(String pattern:mapping.getPatterns()) { mappingMap.put(pattern, mapping.getName()); } } } public String getClz(String pattern) { String name=mappingMap.get(pattern); return entityMap.get(name); } }

Servlet:

public interface Servlet { void service(); }

LoginServlet:

public class LoginServlet implements Servlet { public void service() { System.out.println("LoginServlet"); } }

RegisterServlet:

public class RegisterServlet implements Servlet { public void service() { System.out.println("RegisterServlet"); } }

Entity

public class Entity { private String name; private String clz; public Entity() { // TODO Auto-generated constructor stub } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClz() { return clz; } public void setClz(String clz) { this.clz = clz; } }

Mapping

public class Mapping { private String name; private Set<String> patterns ; public Mapping() { patterns = new HashSet<String>(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<String> getPatterns() { return patterns; } public void setPatterns(Set<String> patterns) { this.patterns = patterns; } public void addPattern(String pattern) { this.patterns.add(pattern); } }
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI