【问题标题】:Servlet is not getting data from front-end [duplicate]Servlet 未从前端获取数据 [重复]
【发布时间】:2017-04-15 04:47:37
【问题描述】:

我正在尝试使用 $.post 方法从 html 文件提交表单数据。但是,在服务器端,servlet 变得空了。没有字段为空且为空。谁能告诉我是什么问题?谢谢。顺便说一句,我在这里只显示一个字段,但实际上我在表单中有几个字段。这是我的代码:

html

        <form id="reservationsForm" name="reservationsForm" method="post" action="Reservations" 
            class="well form-horizontal" align="left" style="width:865px;border:2px solid #000000;margin:auto;"> 
        <br>
        <div >                              
        <div align="left" class="form-group">
          <label class="col-md-2 control-label" style="font-family:sans-serif;color:black"><B>Pickup Date:</B></label>  
          <div class="col-md-4 inputGroupContainer">
          <div class="input-group">
          <input placeholder="Please select a date" class="form-control"  type="text" id="datepicker" style="width: 
        238px;">
          </div>
          </div>
        </div>                  
        <br> 
<td><label align="center" style="font-family:sans-serif;color:black"># of Stops</label></td>
<select class="form-control selectpicker" id="stops" name="stops" size="1" tabindex="14" width="150px">

        <option value="0">No Stop</option>

        <option value="1">1</option>

        <option value="2">2</option>

        <option value="3">3</option>
   </select>
    <div align="center">
            <input onclick="send()" type="submit" name="submit" value="Send" style="font-weight:600" class="btn btn-primary">
    </div>  
     </form>

JS

var send = function() {

         var pickUpDate = document.getElementById('datepicker').value;
         var totalStops = document.getElementById('stops').value;

         var inputData = {"pickUpDate":pickUpDate,
                           "totalStops":totalStops }
         $.post('http://localhost:8080/WelcomeLimoUsa/Reservations', inputData, myData, "json");

        function myData(data) {

            }
     };

servlet

@WebServlet("/Reservations")
public class Reservations extends HttpServlet {
    private static final long serialVersionUID = 1L;

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

        try {
            if( request != null) {
        System.out.println("PickUp Date is: " + 
request.getParameter("pickUpDate"));
     System.out.println("total Stops is: " + request.getParameter("totalStops"));


     String pickUpDate = request.getParameter("pickUpDate");
     Integer totalStops = Integer.parseInt(request.getParameter("totalStops"));

            }else{
                System.out.println("#############Request is null#########");
            }
        }
        catch (Exception e){
            e.printStackTrace();
            System.out.println("Exception occured");
        }
    }

}

服务器端出错

java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:542)
    at java.lang.Integer.parseInt(Integer.java:615)
    at com.welcomelimo.controller.Reservations.doPost(Reservations.java:50)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
java.lang.NumberFormatException: null
    at java.lang.Integer.parseInt(Integer.java:542)
    at java.lang.Integer.parseInt(Integer.java:615)
    at com.welcomelimo.controller.Reservations.doPost(Reservations.java:50)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508)
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Exception occured
PickUp Date is: null

【问题讨论】:

  • 您的异常与您的代码不匹配。 java servlet 中没有Integer.parseInt。而您正试图访问名为“pickUpDate”的 GET 或 POST 变量,但没有这样的东西。您发布的是 json 结构,而不是键/值对。
  • @f1sh,我更新了帖子。 Servlet 正在从我使用 $.post() 从前端发送的查询参数中获取“pickUpDate”,其中我在 JSON 对象中包含了“pickUpDate”。
  • 那么值到达servlet会有什么问题?
  • @ f1sh,我没有在服务器端得到我应该得到的值,而是在发送值时得到了 null。

标签: java jquery web-services rest servlets


【解决方案1】:

尝试在客户端进行调试。在 Javascript 中:

var totalStops = document.getElementById('stops').value;

// look if totalStops contains the expected value
console.log(totalStops);

var inputData = {"pickUpDate":pickUpDate,
                           "totalStops":totalStops }

EDIT1:确认预期值后。
使用以下命令检查所有 servlet 的请求参数:

Enumeration<String> names = request.getParameterNames();
        while(names.hasMoreElements()) {
            String name = names.nextElement();
            response.getWriter().append(name + "=" + request.getParameter(name) + "<br>");
        }

EDIT2:看到服务器没有收到参数后。

正如我所建议的,您可以显示您在 servlet 中收到的所有参数。我用你的代码尝试了这个并得到:stops=2&lt;br&gt;submit=Send&lt;br&gt;

所以表单已提交,但没有 ajax。
ajax 代码不会停止默认提交事件。

您删除 onclick="send()" 并让该行成为:

 <input type="submit" name="submit" value="Send" style="font-weight:600" class="btn btn-primary">

您可以通过这种方式将表单提交与javascript绑定:

// when the html document is ready / parsed from browser
     $( document ).ready(function() {
         // Bind an event handler to the "submit" JavaScript event
         $("#reservationsForm").submit(send)
     });

为了防止默认提交事件,请在 Javasript 中的 send() 函数末尾添加 return false;

 var send = function(event) {

     var pickUpDate = document.getElementById('datepicker').value;
     var totalStops = document.getElementById('stops').value;

     var inputData = {"pickUpDate":pickUpDate,
                       "totalStops":totalStops }
     $.post('http://localhost:8080/jee6/FormTestServlet', inputData, myData, "json");

    function myData(data) {

        }

    // add return false to prevent the default sumbit
    return false;
};   

可以在jQuery.submit()的文档中看到

...我们可以通过调用 .preventDefault() 取消提交操作 事件对象或从我们的处理程序返回 false。

【讨论】:

  • 是的,totalStops 包含预期值
  • 我加了你的代码,还是不行,得到空值
  • System.out.println()替换response.getWriter().append()
  • 你的意思是你得到这个空值:System.out.println("#############Request is null#########");
  • 已替换,但控制台中没有打印任何内容。但是,从 System.out.println("PickUp Date is: " + request.getParameter("pickUpDate")) 获取空值; System.out.println("总站数为:" + request.getParameter("totalStops"));请看 servlet 代码。
猜你喜欢
  • 2016-05-30
  • 1970-01-01
  • 2022-11-23
  • 2021-12-16
  • 2017-05-19
  • 1970-01-01
  • 2017-01-01
  • 2014-09-08
  • 1970-01-01
相关资源
最近更新 更多