我对HTTP和编码一般都比较新,我遇到了以下问题。对于我在提出这个问题时所犯的任何错误,我事先道歉,但我感谢任何反馈。
我(让他们打电话给他)讲师在Eclipse中创建了一个Maven项目来演示servlet的行为方式。在src / main / java中我有以下类。
public class MyServlet extends HttpServlet {
@Override
public void init() {
System.out.println("My servlet initializing");
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
System.out.println("Request received");
super.service(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
System.out.println("Post received");
String parameter = request.getParameter("name");
System.out.println(parameter);
System.out.println(request.getReader().readLine());
// We call our service
response.getWriter().write("Hi there!");
response.getWriter().write("Hi there again!");
response.sendRedirect("http://google.com");
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
System.out.println("Get received");
}
在与此项目对应的web.xml文件中,我将servlet名称设置为myservlet。然后将url模式设置为/myservlet
。现在我一直在努力在理解HTTP如何工作方面取得进展。使用Postman,我得到了我正在使用的TOMCAT服务器,以满足GET和POST请求的预期行为。但是,问题出现在我创建的以下html文档中,称为form.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form method="post" action="./details">
<input name="name" type="text" placeholder="enter your name">
<input type="submit">
</form>
</body>
</html>
当我在Firefox中打开它时,表单加载正常。我输入一些随机的东西并提交查询。因为从我的理解这是一个POST请求,我认为action="./details"
位将引用我上面定义的servlet,特别是doPost()
方法,它应该反过来将我重定向到Google。但是,它给我一个错误,说“Firefox无法在...src/main/webapp/details
找到该文件。”有什么问题?
而且,在上面的doPost()
方法中,response.getWriter().write(...)
调用会发生什么?在我以form.html
文件的形式提交内容后,我没有看到任何地方。无论如何,我完全糊涂了。正确方向的一点将非常感激。如果需要任何其他信息,请告诉我。
在您的示例中,./details
被解释为相对于保存form.html
文档的位置。当你说你在Firefox中打开它时,我假设你的意思是你从本地文件夹中打开了HTML文件。您需要通过Tomcat导航到表单。如果表格保存在src/main/webapp/form.html
,那么很可能从http://localhost:8080/form.html
可见
另外,如果sevlet的url模式设置为/myservlet
,那么表单的动作也需要是/myservlet
来命中你的servlet方法。