其基础是要了解http协议请求的报文格式和响应的报文格式,这里就不做详细介绍了。
首先是XML工具类
``
public class XMLUtil {
static Stack stack=new Stack<>();
private String result=null;
private String servletClass=null;
public void addServlet(){
SAXReader reader=new SAXReader();
try {
Document document=reader.read(new FileInputStream(“source/web1.xml”));
Element root=document.getRootElement();
Element element=root.addElement("servlet");
element.addElement("servlet-name").setText("servlet1");;
element.addElement("servlet-class").setText("com.yc.test");;
FileOutputStream out =new FileOutputStream("source/web1.xml");
// 指定文本的写出的格式:
OutputFormat format=OutputFormat.createPrettyPrint(); //漂亮格式:有空格换行
format.setEncoding("UTF-8");
//1.创建写出对象
XMLWriter writer=new XMLWriter(out,format);
//2.写出Document对象
writer.write(root);
//3.关闭流
writer.close();
System.out.println(element);
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
}
//获取servlet的权限定类名
public void getServlet(String servletName){
System.out.println("servletName===================="+servletName);
SAXReader reader=new SAXReader();
try {
Document document=reader.read(new FileInputStream("source/web1.xml"));
Element rootElement=document.getRootElement();
List<Element> list=rootElement.elements("servlet");
for(int i=0;i<list.size();i++){
String name=list.get(i).element("servlet-name").getText();
System.out.println("name======"+name);
if(servletName.equals(name)){
servletClass=list.get(i).element("servlet-class").getText();
break;
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取response的contentType
public void getContentType(String uri){
SAXReader reader=new SAXReader();
try {
Document document=reader.read(new FileInputStream("source/web.xml"));
Element rootElement=document.getRootElement();
printChild(rootElement, uri);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void printChild(Element rootElement,String choose) {
for(Iterator it=rootElement.elementIterator();it.hasNext();){
Element e=(Element) it.next();
Pattern p=Pattern.compile("\\w+");
Matcher m=p.matcher(e.getText());
boolean flag=m.find();
if(stack!=null && (!stack.empty()) && choose.equals(stack.pop()) && flag){
result=e.getText();
return ;
}
if(choose.equals(e.getText())){
stack.push(e.getText());
}
for(Iterator i=e.attributeIterator();i.hasNext();){
Attribute attr=(Attribute) i.next();
String name=attr.getName();
/**
* <extension>js</extension>
<mime-type>application/javascript</mime-type>
*/
String value=attr.getText();
}
printChild(e,choose);
}
/*return stack.pop();*/
}
public static Stack<String> getStack() {
return stack;
}
public String getResult() {
if(result==null){
return "text/html";
}
return result;
}
//通过反射返回相应的servlet对象
public HttpServlet getServlet(){
System.out.println("serletClass=================="+servletClass+"=======");
if(servletClass==null)
return null;
try {
System.out.println("serletClass=================="+(HttpServlet) Class.forName(servletClass).newInstance());
return (HttpServlet) Class.forName(servletClass).newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
Process类
public class Process implements Runnable {
private Socket socket;
private Server server;
public Process(Socket socket, Server server) {
this.socket = socket;
this.server = server;
}
@Override
public void run() {
try {
HttpServletRequest request = new HttpServletRequest(socket.getInputStream());
System.out.println(request);
String uri = request.getRquestURI();
String diskPath = server.getRootPath() + uri;
System.out.println(diskPath);
File f = new File(diskPath);
File f1 = new File(server.getRootPath() + uri.split("[?]")[0]);
HttpServletResponse response = null;
if ((f.exists() && f.isFile()) || (f1.exists() && f1.isFile())) {
/*
* new HttpServletResponse(socket.getOutputStream(),
* server.getRootPath(), uri).response();
*/
if (f.exists() && f.isFile()) {
response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(), uri);
response.response();
} else {
response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(),
uri.split("[?]")[0]);
response.response();
}
} else {
System.out.println("==="+uri);
HttpServlet servlet = server.getServlet(uri);
System.out.println("=====" + servlet);
if (servlet == null) {
response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(),
"/photo/404.html");
response.responseMessage(404, "Not Found");
} else {
if(servlet instanceof ForwardServlet){
servlet.service(request, response);
response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(), request.getRquestURI());
}else if(servlet instanceof RedirectServlet || servlet instanceof LoginServlet){
response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(), request.getRquestURI());
servlet.service(request, response);
}
else{
response = new HttpServletResponse(socket.getOutputStream(), server.getRootPath(), request.getRquestURI());
servlet.service(request, response);
}
response.response();
}
}
/*
* String uri=request.getRquestURI(); if("/".equals(uri)){
* uri="/index.html"; }
* getContentType(uri.substring(uri.lastIndexOf('.')+1) ); String
* contentType=result;
*/
} catch (Exception e) {
/* e.printStackTrace();*/
} finally {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}