首页 > 解决方案 > 尝试将 POST 请求从前端正确传递到 java servlet 后端

问题描述

我正在使用 servlet api 构建一个简单的 crud 应用程序。我不想使用 JAX-RS 或 Spring。该应用程序仅处理具有开始时间和活动类型的时间段对象。

我在下面遇到的错误

java.lang.NumberFormatException: null

错误来自 doPost 方法的以下代码。

int startTimeInt = Integer.parseInt(startTime);

当我注释掉所有给我错误的东西时,我尝试下面的代码。它显示为空。

System.out.println(request.getParameter("timePeriodId")); --->null
System.out.println(request.getParameter("activityType")); --->null

为什么请求中无法访问 POST 信息。

我已经研究了 CORS 预检请求,但还没有弄清楚任何事情。

我的后端如下。

package com.jeffstrunk.TimeTrackerWServlets;


import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;

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

    private String url = "jdbc:mysql://localhost/jeffstrunkcom?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
    private String userName = "root";
    private String pass = "pass";

    private TimePeriodDAO timePeriodDAO = new TimePeriodDAO(url, userName, pass);

    Gson gson = new Gson();

    public TimePeriodController() {
        super();
    }

    private void sendAsJson(HttpServletResponse response, Object obj) throws IOException {
        response.setContentType("application/json");
        String res = gson.toJson(obj);     
        PrintWriter out = response.getWriter();
        out.print(res);
        out.flush();
    }

    @Override
    protected void doOptions(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        setAccessControlHeaders(resp);
        resp.setStatus(HttpServletResponse.SC_OK);
    }

    private void setAccessControlHeaders(HttpServletResponse resp) {
        resp.setHeader("Access-Control-Allow-Origin", "*");
        resp.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS, HEAD, PUT, POST, DELETE");
        resp.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doGet reached");

        setAccessControlHeaders(response);
        String pathInfo = request.getPathInfo();
        String uri = request.getRequestURI();
        List<TimePeriod> timePeriods = new ArrayList();

        try {
            timePeriods = timePeriodDAO.getAllTimePeriods();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        if(pathInfo == null || pathInfo.equals("/")){       
            System.out.println("path info is null");
            System.out.println("uri: " + uri);
            System.out.println("pathInfo: " + pathInfo);

            try {
                timePeriodDAO.connect();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            sendAsJson(response, timePeriods);
        }

        String[] splits = pathInfo.split("/");


        if(splits.length == 2){ 
            TimePeriod timePeriod = new TimePeriod();
            try {       
                String stringId = splits[1];
                int id = Integer.parseInt(stringId);
                System.out.println("Id = " + id);

                timePeriod = timePeriodDAO.getTimePeriod(id);

                sendAsJson(response, timePeriod);
            } catch (SQLException e) {
                e.printStackTrace();
            }   

        }
    }

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

        System.out.println("doPost reached");
        setAccessControlHeaders(response);

        String pathInfo = request.getPathInfo();
        System.out.println("pathInfo: " + pathInfo);


        String startTime = request.getParameter("timePeriodId");
        int startTimeInt = Integer.parseInt(startTime);
        String activity = request.getParameter("activityType"); 
        System.out.println("startTime: " + startTime);
        System.out.println("activity: " + request.getParameter("activityType"));

        if(pathInfo == null || pathInfo.equals("/")){

            TimePeriod timePeriod = new TimePeriod();
            ActivityType activityEnum = Enum.valueOf(ActivityType.class, activity);
            timePeriod.setActivity(activityEnum);
            timePeriod.setStartTime(startTimeInt);
            try {
                timePeriodDAO.insertTimePeriod(timePeriod);
            } catch (SQLException e) {
                e.printStackTrace();
            }   
        }
            else {
                response.sendError(HttpServletResponse.SC_BAD_REQUEST);
                return;
        }
    }
}

下面是我的前端。

function post(){
    console.log("post file reached")

    const url = 'http://localhost:8080/TimeTrackerWServlets/TimePeriodController/'
    const Data = {
        timePeriodId: "999",
        activityType: "ANIME"
    };

    const otherPram = {
        headers: {
            "content-type" : "application/json; charset=UTF - 8"
        },
        body : Data,   //JSON.stringify(Data)
        method: "POST",
    };
    fetch(url, otherPram)
    .then(data=>{return data.json})
    .then(res=>console.log(res))
    .catch(error=>console.log(error))
}

下面的 HTML。

<button onclick="post()">Post</button>

标签: javascriptjavapostservletsfetch

解决方案


推荐阅读