1.WebApp
解析web.xml文件,并通过路径获取servlet
public class WebApp {
private static WebContext webContext;
//解析xml文件
static {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parse = factory.newSAXParser();
WebHandler handler = new WebHandler();
parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("web.xml"), handler);
List<Entity> entitys = handler.getEntitys();
List<Mapping> mappings = handler.getMappings();
webContext = new WebContext(entitys, mappings);
}catch(Exception e) {
System.out.println("解析配置文件错误");
}
}
public static Servlet getServletFromUrl(String url){
String name = webContext.getClz("/" + url);
Class clz;
try {
clz = Class.forName(name);
Servlet servlet = (Servlet)clz.getConstructor().newInstance();
return servlet;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
2.handler处理器
public class WebHandler extends DefaultHandler{
private List<Entity> entitys;
private List<Mapping> mappings;
private Entity entity;
private Mapping mapping;
//存储当前标签名
private String tag;
//判断当前标签是否为servlet-mapping
private boolean isMapping;
@Override
public void startDocument() throws SAXException {
entitys = new ArrayList<Entity>();
mappings = new ArrayList<Mapping>();
}
@Override
public void endDocument() throws SAXException { }
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(null != qName) {
tag = qName;
if(qName.equals("servlet")) {
entity = new Entity();
isMapping = false;
}
else if(qName.equals("servlet-mapping")) {
mapping = new Mapping();
isMapping = true;
}
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName != null) {
if(qName.equals("servlet")) {
entitys.add(entity);
}
else if(qName.equals("servlet-mapping")) {
mappings.add(mapping);
}
}
//避免结束标签与另外的开始标签之间的空内容覆盖标签内容
tag = null;
}
@Override
//读取标签之间的内容,不管标签是否一一对应
public void characters(char[] ch, int start, int length) throws SAXException {
String msg = new String(ch, start, length).trim();
if(tag != null) {
if(isMapping) {//操作servlet-mapping
if(tag.equals("servlet-name")) {
mapping.setName(msg);
}
if(tag.equals("url-pattern")) {
mapping.add(msg);
}
}else {//操作servlet
if(tag.equals("servlet-name")) {
entity.setName(msg);
}
if(tag.equals("servlet-class")) {
entity.setClz(msg);
}
}
}
}
public List<Entity> getEntitys() {
return entitys;
}
public List<Mapping> getMappings() {
return mappings;
}
}
3.修改receive代码