web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>webServer.servlet.LoginServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>reg</servlet-name>
<servlet-class>webServer.servlet.RegisterServlet</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>
Entity
package webServer.servlet;
/**
* <servlet-name>login</servlet-name>
* <servlet-class>webServer.servlet</servlet-class>
* @author pmc
*
*/
public class Entity {
private String name;//servlet-name
private String clz;//servlet-class
public Entity() {
}
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
package webServer.servlet;
import java.util.HashSet;
import java.util.Set;
/**
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
<url-pattern>/g</url-pattern>
</servlet-mapping>
* @author pmc
*
*/
public class Mapping {
private String name;
private Set<String> patterns;
public Mapping() {
super();
this.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 pattren){
this.patterns.add(pattren);
}
}
Servlet接口
package webServer.servlet;
public interface Servlet {
void service();
}
LoginServlet实现接口Servlet
package webServer.servlet;
//LoginServlet
public class LoginServlet implements Servlet {
@Override
public void service() {
System.out.println("LoginServlet");
}
}
RegisterServlet实现接口Servlet
package webServer.servlet;
public class RegisterServlet implements Servlet {
@Override
public void service() {
System.out.println("RegisterServlet");
}
}
entity,mapping List转Map,pattern set
package webServer.servlet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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-class
private Map<String,String> mappingMap=new HashMap<String,String>();
public WebContext(List<Entity> entitys, List<Mapping> mappings) {
super();
this.entitys = entitys;
this.mappings = mappings;
//将entity的List转成了对应map
for(Entity entity:entitys){
entityMap.put(entity.getName(), entity.getClz());
}
//将mapping的List转成了对应map
for (Mapping mapping: mappings) {
for(String pattern:mapping.getPatterns()){
mappingMap.put(pattern,mapping.getName());
}
}
}
/*
* 通过URL的路径找到了对应Class
*/
public String getClz(String pattern){
String name=mappingMap.get(pattern);//返回value
return entityMap.get(name);
}
}
4
package webServer.servlet;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* XML解析
* XML:Extensible Markup Language 可扩展标记语言,作为数据的一种存储格式或
* 用于存储软件的参数,程序解析此配置文件,就可以达到不修改代码就能更改程序的目的.
*
* 熟悉SAX解析流程
* @author pmc
*
*/
public class xmlTest2 {
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("webServer/servlet/web.xml"), handler);
//获取数据
WebContext context=new WebContext(handler.getEntitys(),handler.getMappings());
//输入/login
String name=context.getClz("/g");
Class clz=Class.forName(name);
Servlet servlet=(Servlet)clz.getConstructor().newInstance();
System.out.println(servlet);
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 {
// System.out.println("开始解析:"+qName);
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();// 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);
}
}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 {
// System.out.println("结束解析:"+qName);//分析tag
if(null!=qName){//存储数据
if(qName.equals("servlet")){
entitys.add(entity);
} else
if(qName.equals("servlet-mapping")){
mappings.add(mapping);
}
}
tag=null;
}
public List<Entity> getEntitys() {
return entitys;
}
public List<Mapping> getMappings() {
return mappings;
}
}