Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
服务器对浏览器的响应:调用doGet方法Java_Java_Jakarta Ee_Servlets_Get_Httpresponse - Fatal编程技术网

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

服务器对浏览器的响应:调用doGet方法Java,java,jakarta-ee,servlets,get,httpresponse,Java,Jakarta Ee,Servlets,Get,Httpresponse,我正在创建一个直接从浏览器接受HTTP协议的基本服务器。我想做的是使用DoGet方法能够用一个html页面响应GET请求。通常,使用servlet可以获得相同的结果,但在本练习中,我使用接口MyHttpRequest、MyHttpResponse和MyHttpHandler来执行与servlet相同的功能。这就是我到目前为止所做的: public class Server implements MyHttpRequest, MyHttpResponse, MyHttpHandler { pri

我正在创建一个直接从浏览器接受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();
}
@覆盖
公共无效数据集(MyHttpRequest请求、MyHttpResponse响应)
{
//回应
response.getContentType();
PrintWriter pw=response.getWriter();
pw.println(“”);
println(“欢迎来到我们的网站!”);
pw.println(“希望您在这里过得愉快。

”; pw.println(“”); 关闭(); }
我的问题是,我搞不清楚我主要应该用什么作为doGet方法的参数。这个练习的重点是能够使用doGet方法将HTML发送到Localhost:8080——但是我不知道如果不使用JSP或servlet,这怎么可能

这里有我遗漏的东西吗?我已经尽我所能研究了使用doGet的一切,但我的印象是Servlet会在需要时自动调用doGet或doPost。如果我没有使用servlet,我应该如何调用doGet方法


任何有用的建议都将不胜感激。

我认为您的做法是错误的,让类实现了
MyHttpRequest
MyHttpResponse
。这两个类应该是服务器创建的对象,并传递给
doGet
方法

您应该使用更好的OOP方法。例如,让
服务器
能够注册
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);
    }
}
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);
        }
    }
}
因此,在启动
服务器之后,对于传入的每个请求,都要将
InputStream
发送到
服务器的
handleServerRequest
方法,并让它完成它的工作。差不多

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);
    }
}
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

关于这一问题:

“但我觉得Servlet在需要时会自动调用doGet或doPost”

实际上,servlet不调用自己的方法。这些调用由servlet容器处理,与我的设计示例的工作方式类似。如果您将
MyHandler
重命名为
MyServlet
,并且
服务器将是,比如Tomcat,那么这可能更有意义
Server
允许您注册多个
myservlet
,并处理传入的请求并将它们交给servlet