手写一个服务器
搭建服务器整体结构和接口-编写XML文件
格式如下:
创建一个xml文件:web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app>
<servlet>
<servlet-name>login</servlet-name><!-- 我们自己起的小名 -->
<servlet-class>bjsxt.servlet.LoginServlet</servlet-class> <!--根据上面的小名可以获取到的包下的类-->
</servlet>
<servlet-mapping> <!--映射 在浏览器地址栏输入不同的路径去访问共享资源-->
<servlet-name>login</servlet-name> <!--和上面自己起的小名相同-->
<url-pattern>/login</url-pattern> <!--谁可以访问-->
<url-pattern>/log</url-pattern>
</servlet-mapping>
</web-app>
创建一个解析XML文件的类:
package bjsxt.server;
/**
* 用于解析xml文件
*/
public class WebDom4j {
}
package bjsxt.server;
/**
* 这是一个路径请求一个资源的实体类
* servlet-name和一个servlet-name对应的实体类
*
* <servlet>
* <servlet-name>login</servlet-name>
* <servlet-class>bjsxt.servlet.LoginServlet</servlet-class>
* </servlet>
*/
public class Entity {
}
package bjsxt.server;
/**
/**
* 这是多个路径请求一个资源的实体类
* 是映射关系,多个路径访问共享资源
*
* <servlet-mapping>
* <servlet-name>login</servlet-name>
* <url-pattern>/login</url-pattern>
* <url-pattern>/log</url-pattern>
* </servlet-mapping>
*/
*/
public class Mapping {
}
package bjsxt.server;
/**
* 请求
*/
public class Request {
}
package bjsxt.server;
/**
* 响应
*/
public class Response {
}
package bjsxt.server;
/**
* 用于启动和停止服务
*/
public class Server {
}
package bjsxt.server;
/**
* 描述的是 Entity和Mapping的映射关系
*/
public class ServletContext {
}
package bjsxt.server;
/**
* 应用程序
*/
public class WebApp {
}
package bjsxt.servlet;
/**
* 是所有请求的Servlet的父类
*/
public class Servlet {
}
package bjsxt.servlet;
/**
* 创建一个请求的servlet类
*/
public class LoginServlet extends Servlet{
}
package bjsxt.util;
import java.io.Closeable;
import java.io.IOException;
/**
* 用于关闭流
*/
public class IOCloseUtil {
public static void closeAll(Closeable...close){
for (Closeable closeable:close){
if (closeable!=null){
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
以上,是搭建一个服务器的前期框架
DOM4J解析XML配置文件
我们先对XML文件的内容进行一些添加
<?xml version="1.0" encoding="UTF-8" ?>
<web-app>
<servlet>
<servlet-name>login</servlet-name><!-- 我们自己起的小名 -->
<servlet-class>bjsxt.servlet.LoginServlet</servlet-class> <!--根据上面的小名可以获取到的包下的类-->
</servlet>
<servlet-mapping> <!--映射 在浏览器地址栏输入不同的路径去访问共享资源-->
<servlet-name>login</servlet-name> <!--和上面自己起的小名相同-->
<url-pattern>/login</url-pattern> <!--谁可以访问-->
<url-pattern>/log</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>register</servlet-name>
<servlet-class>bjsxt.servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>register</servlet-name>
<url-pattern>/reg</url-pattern>
<url-pattern>/register</url-pattern>
<url-pattern>/regis</url-pattern>
</servlet-mapping>
</web-app>
使用WebDom4j.java文件解析XML文件
package bjsxt.server;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 用于解析xml文件
*/
public class WebDom4j {
private List<Entity> entityList;//用于存储是N多Entity,而每一个Entity都是servlet-name与servlet-class
private List<Mapping> mappingList;//用于存储N多Mapping,而每一个Mapping都是一个servlet-name与N多个url-pattern
public WebDom4j() {
entityList = new ArrayList<Entity>();
mappingList = new ArrayList<Mapping>();
}
public WebDom4j(List<Entity> entityList, List<Mapping> mappingList) {
this.entityList = entityList;
this.mappingList = mappingList;
}
@Override
public String toString() {
return "WebDom4j{" +
"entityList=" + entityList +
", mappingList=" + mappingList +
'}';
}
public void setEntityList(List<Entity> entityList) {
this.entityList = entityList;
}
public List<Entity> getEntityList() {
return entityList;
}
public List<Mapping> getMappingList() {
return mappingList;
}
public void setMappingList(List<Mapping> mappingList) {
this.mappingList = mappingList;
}
//解析XML,获取Document对象的方法
public Document getDocument(){
//1.创建SAXReader对象
SAXReader reader = new SAXReader();
//2.调用read方法
try {
return reader.read(new File("src/WEB_INFO/web.xml"));
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
public void parse(Document doc){
//1.获取根元素
Element root = doc.getRootElement(); //可以获取到根元素web-app
//2.获取servlet子元素
for (Iterator<Element> ite=root.elementIterator("servlet");ite.hasNext();){
Element subElement = ite.next(); //得到每一个servlet
//创建一个实体类
Entity ent = new Entity(); //用于存储servlet-name与servlet-class
//因为servlet下有许多子元素,再次使用一个for循环
for (Iterator<Element> subIte=subElement.elementIterator();subIte.hasNext();){
Element ele = subIte.next();//可能是servlet-name,也可以能是servlet-class
if ("servlet-name".equals(ele.getName())){
//如果获得的元素节点的名称为servlet-name
ent.setName(ele.getText());//那么就对实体类的name赋值
}else if("servlet-class".equals(ele.getName())){
ent.setClazz(ele.getText());
}
}
//将Entity放置到集合内
entityList.add(ent);
}
//测试
System.out.println("开始测试XML是否工作正常");
for (Entity entity : entityList) {
System.out.println(entity.getName()+"\t"+entity.getClazz());
}
System.out.println("=======================+");
//解析servlet-mapping
for(Iterator<Element> ite=root.elementIterator("servlet-mapping");ite.hasNext();){
Element subEle=ite.next();//得到每一个servlet-mapping
//创建一个Mapping类的对象
Mapping map=new Mapping();
//解析servlet-mapping下的子元素
for (Iterator<Element> subIte=subEle.elementIterator(); subIte.hasNext();){
Element ele = subIte.next();//servlet-name,也有可能是url-pattern
if ("servlet-name".equals(ele.getName())){
map