【问题标题】:HTML form method POST calls java servlet doGet methodHTML 表单方法 POST 调用 java servlet doGet 方法
【发布时间】:2012-01-31 12:29:22
【问题描述】:

我有一个这样的 HTML 表单:

form.html:

<html>
<body>

 your name is :<br><br>

<form ACTION="../post2" METHOD="POST">
<input name="name" type="text" id="name"/>
<input name="send"  type="submit"  value="send"/>
</form>

</body>
<html>

为这个请求提供服务的 servlet:

post2.class:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.*;

    public class post2 extends HttpServlet
    {

protected void doDo(HttpServletRequest request,HttpServletResponse response) 
 throws IOException{

String name = request.getParameter("name");

response.setContentType("text/html");
PrintWriter out = response.getWriter();

out.println("<HTML><BODY>");
out.println("<H2>hello "+name+"</H2>");
out.println("<BR><BR>");
out.println("info:");
out.println("<BR><BR>");
out.println("<H2>metoda GET</H2>");
out.println("<BR><BR>");
out.println("SERVER_NAME="+request.getServerName()+"<BR>");
out.println("REQUEST_METHOD="+request.getMethod()+"<BR>");
out.println("QUERY_STRING="+request.getQueryString()+"<BR>");
out.println("REMOTE_HOST="+request.getRemoteHost()+"<BR>");
out.println("REMOTE_ADDR="+request.getRemoteAddr());
out.println("</BODY></HTML>"); 
}


@Override
public void doGet(HttpServletRequest request,HttpServletResponse response) 
throws IOException {      
 doDo(request,response);
}

@Override
public void doPost(HttpServletRequest request,HttpServletResponse response) 
throws IOException {
 doDo(request,response);
}

}

结果是:

hello null


info:

SERVER_NAME=localhost
REQUEST_METHOD=GET
QUERY_STRING=null
REMOTE_HOST=127.0.0.1
REMOTE_ADDR=127.0.0.1 

怎么了?对我来说,servlet 似乎没有从表单中看到 post 方法。请帮忙,我完全不知道为什么它不能正常工作......

wireshark 的结果:

648 126.229267 87.105.184.89 192.168.1.100 HTTP 557 POST /post2 HTTP/1.1 (application/x-www-form-urlencoded)

953 379.456916 192.168.1.100 87.105.184.89 HTTP 239 HTTP/1.1 302 已移动 暂时

955 379.462518 192.168.1.100 87.105.184.89 HTTP 470 GET /post2/ HTTP/1.1

957 379.463979 192.168.1.100 87.105.184.89 HTTP 431 HTTP/1.1 200 正常 (文本/html)

路由逻辑:

tomcat\webapps\ROOT\form.html --> \tomcat\webapps\post2\WEB-INF\classes\post2.class

【问题讨论】:

  • 首先,您忘记了&lt;/form&gt; 标签。
  • 使用 Wireshark 或其他工具确保您确实收到了 POST。
  • 您真的在提交表单吗?对于name 为空,该字段不能提交;如果输入元素中没有值,它将是一个空字符串。
  • 你是如何映射 servlet 的?您在 webapp 中是否同时拥有 post2 servlet 和 post2 目录?
  • 向我们展示 web.xml 中 servlet 的映射。我的猜测是您将它映射到 / 或 /*,然后使用 webapp 的上下文路径调用它。尝试将表单的操作更改为“../post2/”而不是“../post2”

标签: java html jakarta-ee servlets post


【解决方案1】:

这可能是由于重定向造成的吗?如果“/post2”重定向到“/post2/”,您的 POST 请求将被转换为 GET,从而丢失所有发布数据。

尝试直接在浏览器中访问“/post2”,看看会发生什么。

【讨论】:

  • 相同.. 我认为 - REQUEST_METHOD=GET
  • 编辑您的问题并添加路由逻辑,您的框架如何将特定 url 路由到您的 doDo 视图。
  • 看来你是对的 - 当我将重定向从 /post2 更改为 /post2/ post 方法时效果很好。谢谢你:)
【解决方案2】:

需要在输入标签中添加value属性:

<input name="name" type="text" id="name" value=""/>

并在其中输入(通过键入输入)一个值 - 默认情况下不提交空白字段。

为简单起见,试试这个,它预设了值:

<input name="name" type="text" id="name" value="john"/>

【讨论】:

  • 我添加了你所说的值,但这没有帮助..顺便说一句,当我在表单中使用 GET 方法时,servlet 正确显示名称
【解决方案3】:

出现null 问题是因为您没有将表单提交到服务器。

【讨论】:

    【解决方案4】:

    这解决了你的问题:

    String name = request.getParameter("name").toString();
    

    【讨论】:

    • 您能否详细说明它如何/为什么解决了这个问题?最好提供洞察力,而不仅仅是答案。
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2011-08-18
    • 2012-07-16
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多