2014-10-03 215 views
2

我正在創建一個基本服務器,它直接從瀏覽器接受HTTP協議。我想要做的就是使用DoGet方法來使用HTML頁面來響應GET請求。通常,您可以使用servlet完成相同的結果,但對於練習,我使用接口MyHttpRequest,MyHttpResponse,MyHttpHandler來執行與servlet相同的功能。這是我到目前爲止有:服務器對瀏覽器的響應:調用doGet方法Java

public class Server implements MyHttpRequest, MyHttpResponse, MyHttpHandler { 

private static final String CONTENT_TYPE = "text/html; charset=windows-1252"; 

public static void main(String[] args) throws IOException { 

    Server server = new Server(); 

    ServerSocket serversocket = new ServerSocket(8080);//localhost 
    Socket socket = serversocket.accept(); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    String line = bufferedReader.readLine(); 
    System.out.println(line); 

    if(line.equals("GET/HTTP/1.1")) 
    { 
     System.out.println("Request works. Responding now..."); 

     //PROBLEM CODE //--------------------------------------------// 
     doGet(problem_parameter1, problem_parameter2,); 
     //-----------------------------------------------------------// 
    } 

    OutputStream out = socket.getOutputStream(); 
    PrintWriter pw = new PrintWriter(out, true); 

    //finally { 
    out.flush(); 
    out.close(); 
    socket.close(); 
    serversocket.close(); 
    //} 
} 

我的doGet方法:

@Override 
public void doGet(MyHttpRequest request, MyHttpResponse response) 
{ 
    //response 
     response.getContentType(); 
     PrintWriter pw = response.getWriter(); 
     pw.println("<html><body>"); 
     pw.println("<h1>Welcome to our Site!</h1>"); 
     pw.println("<p>We hope you enjoy your stay.</p>"); 
     pw.println("</body></html>"); 
     pw.close(); 
} 

我的問題是,我很困惑,我所應該使用的主要doGet方法的參數。練習的要點是能夠使用doGet方法將HTML發送到本地主機:8080 - 但我不知道如果不使用JSP或Servlet,這是如何實現的。

有什麼我在這裏失蹤?我研究了使用doGet所能做的所有事情,但我一直覺得Servlet會在需要時自動調用doGet或doPost。如果我不使用servlet,應該如何調用doGet方法?

任何有用的建議表示讚賞。

回答

2

我認爲你會犯這個錯誤,使得課程實現MyHttpRequestMyHttpResponse。這兩個類應該是由服務器創建的對象,並且傳遞給doGet方法。

您應該使用更好的面向對象方法。例如,讓Server能夠註冊MyHandlers。類似於

public interface MyHandler { 
    void doGet(MyHttpRequest request, MyHttpResponse response); 
    void doPost(MyHttpRequest request, MyHttpResponse response); 
} 
public class MyHandlerImpl implements MyHandler { 
    @Override 
    public void doGet(MyHttpRequest request, MyHttpResponse response) {} 
    @Override 
    public void doPost(MyHttpRequest request, MyHttpResponse response) {} 
} 
public class Server { 
    private Map<String, MyHander> handlers = new HashMap<String, MyHandler>(); 
    public void registerHandler(String path, MyHandler handler) { 
     handler.put(path, handler); 
    } 
} 

您可以在Server類中處理所有操作。例如,當請求進入服務器時,您將解析請求並將其包裝到MyHttpRequest對象中。你首先解析它,然後添加它獲取的請求類型,以及哪個處理程序(「servlet」)將它發送給它(就像普通的servlet基於URL映射一樣)。根據請求的類型,您可以調用處理程序的doGetdoPost。因此,它可能是這個樣子

public class Server { 
    ... 
    public void handleServerRequest(InputStream is) { 
     // parse the input stream 
     String path = // get from stream 
     String requestType = // get from stream 
     MyHandler handler = handlers.get(path); 
     MyHttpRequest request = new MyHttpRequest(); 
     // set request properties. 
     MyHttpResponse response = new MyHttpResponse(); 
     if ("GET".equals(requestType)) { 
      handler.doGet(request, response); 
     } else if ("POST".equals(requestType)) { 
      handler.doPost(request, response); 
     } else { 
      throws new BadRequestException(..); 
     } 
    } 
} 

啓動打完你Server,爲每個進來的請求,剛剛過去的InputStreamServerhandleServerRequest方法,讓它做它的工作。像

public class ServerInstance { 
    public static void main(String[] args) { 
     Server server = new Server(); 
     server.registerHandler(new MyHandlerImpl()); 

     while (true) { 
      // if request comes get input stream 
      server.handlerServerRequest(intputStream); 
     } 
    } 
} 

的東西簡單的情況下只是使用一個MyHandlerServer類,所以你不必擔心它們映射,而是一個真正的servlet容器允許添加多於一個servlet和被映射到一個URL。根據預先配置的url映射,Servlet容器知道發送請求的servlet。

至於這個問題:

「但我的印象是在Servlet自動當它需要他們調用的doGet或doPost」

其實Servlet的不叫他們自己的方法。這些調用由servlet容器處理,與我的設計示例類似。如果您將MyHandler重命名爲MyServlet,並且Server會是Tomcat,則可能更有意義。 Server允許您註冊多個MyServlets,並處理傳入請求並將它們傳遞給servlet