服务器对浏览器的响应:调用doGet方法Java

时间:2014-10-03 18:03:39

标签: java java-ee servlets get httpresponse

我正在创建一个直接从浏览器接受HTTP协议的基本服务器。我想要做的是使用DoGet方法能够使用html页面响应GET请求。通常,您将使用servlet完成相同的结果,但是对于练习,我使用接口MyHttpRequest,MyHttpResponse,MyHttpHandler来执行与servlet相同的功能。这就是我到目前为止所做的:

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发送到Localhost:8080 - 但我不知道如何在不使用JSP或Servlet的情况下实现这一点。

我在这里缺少什么吗?我已经研究过使用doGet的所有内容,但我觉得Servlet在需要时会自动调用doGet或doPost。如果我没有使用servlet,我应该如何调用doGet方法?

任何有用的建议都表示赞赏。

1 个答案:

答案 0 :(得分:2)

我认为您正在解决这个错误,使类实现MyHttpRequestMyHttpResponse。这两个类应该是服务器创建的对象,传递doGet方法。

您应该使用更好的OOP方法。例如,让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对象中。您将首先解析它添加获取它是什么类型的请求,以及将它发送到哪个处理程序(&#34; servlet&#34; )(就像普通的servlet一样) ,基于网址映射)。根据请求的类型,您可以调用处理程序的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之后,对于每个请求,只需经过InputStream的{​​{1}}到handleServerRequest方法并让它完成工作。像

这样的东西
Server

更简单的情况就是为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); } } } 类使用一个MyHandler,因此您不必担心映射它们,但是真正的servlet容器允许多个servlet添加,并映射到URL。 Servlet容器根据预配置的url映射知道将请求发送到哪个servlet。

就这个问题而言:

  

&#34;但我觉得Servlet在需要时自动调用doGet或doPost&#34;

实际上,servlet不会调用自己的方法。这些调用由servlet容器处理,与我的设计示例的工作方式类似。如果你将Server重命名为MyHandler,而将MyServlet重命名为Tomcat,则可能会更有意义。 Server允许您注册多个Server,并处理传入的请求并将其移交给servlet