我正在创建一个直接从浏览器接受 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 方法?
如有任何有用的建议,我们将不胜感激。
最佳答案
我认为你的做法是错误的,让类实现 MyHttpRequest
和MyHttpResponse
。这两个类应该是由服务器创建的对象,并传递到 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 映射) 。根据请求的类型,您可以调用 doGet
或doPost
处理程序的。所以它可能看起来像这样
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/