javascript - 尝试将 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>
解决方案
推荐阅读
- reactjs - 如何使用 Strapi 在 React js 中管理动态菜单?
- sharepoint - 我们可以在不登录的情况下生成链接以在 SharePoint 中下载文档吗?
- axios - 使用 axios 配置 Rollup 的问题
- c - [代码演练]如何从C中的字符串中删除所有出现的给定字符?
- flutter - 如何防止 Flutter 小部件在键盘出现时调整大小?
- c# - Teams 中的任务模块无法在 IOS 中使用 Bot 框架
- python - pyautocad 示例未运行
- perl - 使用 WWW::Mechanize 的内存泄漏
- ubuntu - 问题:sudo:/usr/bin/sudo 必须由 uid 0 拥有并设置了 setuid 位
- python - Python 将 CSV 文件数据导入 PostgreSQL