import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServletServer { private ServerSocket serverSocket; private int port; private boolean shutDown; public ServletServer(int port) { this.port = port; } public void startServer() { try { serverSocket = new ServerSocket(port); } catch (IOException e) { System.out.println("監聽"+port+"失敗"); System.exit(0); } while (!shutDown) { //等待客戶端鏈接 try { Socket socket = serverSocket.accept(); DispatchSocket dispatchSocket = new DispatchSocket(socket); new Thread(dispatchSocket).start(); } catch (IOException e) { System.out.println("客戶端出問題了"); } //建立一個線程處理客戶端鏈接進來的請求 } } public static void main(String[] args) { ServletServer server = new ServletServer(8080); server.startServer(); } public boolean isShutDown() { return shutDown; } public void setShutDown(boolean shutDown) { this.shutDown = shutDown; } }
import java.io.IOException; import java.net.Socket; public class DispatchSocket implements Runnable { private Socket socket; public DispatchSocket(Socket socket) { this.socket = socket; } public void run() { try { System.out.println("客戶端是:" + socket.getRemoteSocketAddress()); // 獲取客戶端發送給服務器的數據的輸入流 Request request = new Request(socket.getInputStream(), 8080); Response response = new Response(socket.getOutputStream()); WebApp webApp = WebApp.getWebApp(); String urlPattern = request.getUrlPattern(); ServletMapping mapping = webApp.getServletMappings().get(urlPattern); if (mapping != null) { String servletName = mapping.getServletName(); Servlet servlet = webApp.getServletContext().getServlet(servletName); if (servlet != null) { servlet.service(request, response); } else { response.println("沒有得到Servlet"); } } else { response.print("你請求的url錯誤,該url不正確。沒有找到相應的頁面!"); } } catch (IOException e) { }finally{ closeSocket(socket); } } private void closeSocket(Socket socket) { if (socket != null) { try { socket.getOutputStream().flush(); socket.close(); } catch (IOException e) { } } } }
import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; /** * 瀏覽器請求服務器 */ public class Request { private int port; //服務器端口號 private String host; //請求服務器的地址 private String urlPattern; //請求的url相對路徑 private Map map = new HashMap(); //請求中的數據 private String method; //請求的方式 private String headInfo; //請求頭信息 private InputStream inStream; protected Request(InputStream inStream,int port){ this.inStream = inStream; this.port = port; parseRequestHead(); //解析請求頭信息 } private void parseRequestHead() { byte[] buf = new byte[1024]; try { inStream.read(buf); headInfo = new String(buf); System.out.println(headInfo); method = headInfo.substring(0,headInfo.indexOf("/")).trim(); System.out.println("請求方式:"+method); host = headInfo.substring(headInfo.indexOf("Host:")+5,headInfo.indexOf(":"+port)).trim(); System.out.println("請求地址:"+host); if (method.equalsIgnoreCase("get")) { parseGetString(); } else if (method.equalsIgnoreCase("post")) { parsePostString(); } } catch (IOException e) { } } /** * post請求解析方法 */ private void parsePostString() { urlPattern = headInfo.substring(5,headInfo.indexOf("HTTP/")).trim(); String dataString = headInfo.substring(headInfo.indexOf("\r\n")).trim(); StringTokenizer st = new StringTokenizer(dataString,"&"); while (st.hasMoreElements()) { String[] ss = st.nextToken().split("="); map.put(ss[0], ss[1]); } } /** * get請求解析方法 */ private void parseGetString() { String url = headInfo.substring(4,headInfo.indexOf("HTTP/")); if (url.indexOf("?")==-1) { urlPattern = url.trim(); } else { urlPattern = url.substring(0,url.indexOf("?")).trim(); String dataString = url.substring(url.indexOf("?")+1).trim(); StringTokenizer st = new StringTokenizer(dataString,"&"); while (st.hasMoreElements()) { String[] ss = st.nextToken().split("="); map.put(ss[0], ss[1]); } } } /** * 根據名字得到參數 */ public String getParameter(String name){ if (map!=null&&map.size()>0) { return (String) map.get(name); } return null; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getUrlPattern() { return urlPattern; } public void setUrlPattern(String urlPattern) { this.urlPattern = urlPattern; } public String getMethod() { return method; } public void setMethod(String method) { this.method = method; } public String getHeadInfo() { return headInfo; } public void setHeadInfo(String headInfo) { this.headInfo = headInfo; } }
import java.io.IOException; import java.io.OutputStream; /** * 服務器響應瀏覽器 */ public class Response { private OutputStream outStream; protected Response(OutputStream outStream){ this.outStream = outStream; } public void print(String info) { try { outStream.write(info.getBytes()); } catch (IOException e) { } } public void println(String info) { try { outStream.write((info+"\r\n").getBytes()); } catch (IOException e) { } } }
import java.util.HashMap; import java.util.Map; public class ServletContext { //容器,裝載項目中全部的Servlet,key爲servlet-name,value爲Servlet實例 private Map<String, Servlet> context = new HashMap<String, Servlet>(); public Map<String , Servlet> getContext() { return context; } public void setContext(Map<String , Servlet> context){ this.context = context; } //根據Servlet名字得到Servlet public Servlet getServlet(String servletName) { if (context != null) { return context.get(servletName); } return null; } }
import java.util.HashMap; import java.util.Map; public class ServletContext { //容器,裝載項目中全部的Servlet,key爲servlet-name,value爲Servlet實例 private Map<String, Servlet> context = new HashMap<String, Servlet>(); public Map<String , Servlet> getContext() { return context; } public void setContext(Map<String , Servlet> context){ this.context = context; } //根據Servlet名字得到Servlet public Servlet getServlet(String servletName) { if (context != null) { return context.get(servletName); } return null; } }
public class ServletMapping { private String servletName; private String urlPattern; public ServletMapping(String servletName, String urlPattern) { this.servletName = servletName; this.urlPattern = urlPattern; } public String getServletName() { return servletName; } public void setServletName(String servletName) { this.servletName = servletName; } public String getUrlPattern() { return urlPattern; } public void setUrlPattern(String urlPattern) { this.urlPattern = urlPattern; } }
import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.jdom.xpath.XPath; public class WebApp { private static WebApp webApp = new WebApp(); //根目錄 private static String WEB_ROOT = "D:\\share\\JavaProjects\\servletWorkspace\\lss03\\WebRoot\\"; private ServletContext servletContext; //key表示urlPattern,value表示ServletMapping private Map<String, ServletMapping> servletMappings = new HashMap<String, ServletMapping>(); private WebApp(){ parseWebXml(); } public static WebApp getWebApp(){ return webApp; } private void parseWebXml() { SAXBuilder builder = new SAXBuilder(); try { Document doc = builder.build(new File(WEB_ROOT+"WEB=INF/web.xml")); XPath xPath = XPath.newInstance("//servlet"); servletContext = new ServletContext(); List list = xPath.selectNodes(doc.getRootElement()); for (Iterator i = list.iterator();i.hasNext();) { Element e = (Element) i.next(); String servletName = e.getChildText("servlet-name"); String servletClass = e.getChildText("servlet-class"); Servlet servlet = (Servlet) Class.forName(servletClass).newInstance(); servletContext.getContext().put(servletName,servlet); } xPath = XPath.newInstance("//servlet-mapping"); List mappings = xPath.selectNodes(doc.getRootElement()); for (Iterator i = mappings.iterator(); i.hasNext();) { Element e = (Element) i.next(); String servletName = e.getChildText("servlet-name"); String urlPattern = e.getChildText("url-pattern"); ServletMapping mapping = new ServletMapping(servletName, urlPattern); servletMappings.put(urlPattern, mapping); } } catch (Exception e) { } } public ServletContext getServletContext() { return servletContext; } public void setServletContext(ServletContext servletContext) { this.servletContext = servletContext; } public Map<String, ServletMapping> getServletMappings() { return servletMappings; } public void setServletMappings(Map<String, ServletMapping> servletMappings) { this.servletMappings = servletMappings; } }
public abstract class Servlet { //處理請求 public abstract void service(Request request,Response response); }
import java.text.SimpleDateFormat; import java.util.Date; public class TestServlet extends Servlet { private static SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public void service(Request request, Response response) { String html = "<html><head><meta http-equiv=\"Content-Type\"content=\"text/html;charset=gbk\"/>" + "</head><body><h2>通訊服務測試信息</h2><h2>服務器當前時間是:" + SDF.format(new Date()) + "</h2></body></html>"; response.print(html); } }