java - 服务器对浏览器的响应 : calling the doGet Method Java

标签 java jakarta-ee servlets get httpresponse

我正在创建一个直接从浏览器接受 HTTP 协议(protocol)的基本服务器。我想要做的是使用 DoGet 方法能够使用 html 页面响应 GET 请求。通常,您可以使用 servlet 实现相同的结果,但在本练习中,我使用接口(interface) 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();
}

我的问题是我对 Main 中 doGet 方法的参数应该使用什么感到困惑。练习的重点是能够使用 doGet 方法将 HTML 发送到 Localhost:8080 ——但我不知道如何在不使用 JSP 或 Servlet 的情况下实现这一点。

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

如有任何有用的建议,我们将不胜感激。

最佳答案

我认为你的做法是错误的,让类实现 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 中处理您的所有操作类(class)。例如,当请求进入服务器时,您将解析该请求并将其包装到 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之后,对于每个传入的请求,就在InputStream之后到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对于Server类,因此您不必担心映射它们,但真正的 servlet 容器允许添加多个 servlet,并映射到一个 URL。 Servlet 容器根据预配置的 url 映射知道将请求发送到哪个 servlet。

就这个问题而言:

"but I was under the impression the Servlet automatically calls the doGet or doPost when it needs them"

实际上 servlet 并不调用它们自己的方法。这些调用由 servlet 容器处理,与我的设计示例的工作方式类似。如果您重命名 MyHandler 可能会更有意义至MyServlet ,以及Server汤姆猫说。 Server允许您注册多个MyServlets ,并处理传入的请求并将它们交给 servlet

关于java - 服务器对浏览器的响应 : calling the doGet Method Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26184285/

相关文章:

java - 未知命令-Spring MVC

java - HttpServlet为什么要实现Serializable?

java - 将 Realm 与 RxJava 2 结合使用

java - 尝试通过 glassfish(使用 Cargo 和 Maven)设置/使用 mysql 数据源。如何部署mysql连接器?

java - WebLogic 单例服务可以用于等待/通知吗?

java - J2EE struts应用程序中插入内存漏洞的最佳方法(无需付费:( )

java - JSP:转发页面时出错

java - 在 Java 中使用 PostgreSQL 域和结构类型

java - 在 Java 集合和类型转换中实现简单的类似函数式的范例

java.lang.错误: Unresolved compilation error occuring in JSP