500错误所需的疑难解答帮助(Java)
我正在上一门java课程,我遇到了麻烦。在执行这段代码之前,我创建了一个cookie,它将发货号存储为cookie名称,发货日期存储为cookie值 然后,表单要求用户输入一个确认号码。以下代码应: 将键入的字符串转换为整数 检索保存的Cookie并将名称转换为整数 将键入的号码与保存的cookie号码进行比较 如果键入的数字和保存的数字相同,它将以字符串形式检索日期的cookie值 然后将cookie值转换为日历日期值 然后将日期值与今天的日期进行比较 如果发货编号有效且与存储的cookie匹配,并且日期比发货日期早5天以上,则用户将收到取消消息。如果没有,则用户将收到另一条消息。 还有一些事情可以避免显而易见的事情: -是的,我知道在现实生活中这会存储在数据库中。这是一个类分配,我们目前不使用数据库。 -我知道我没有考虑任何用户输入。我会在代码运行后再讨论这个问题 下面的代码抛出了一个500错误,我不知道为什么。它编译得很好:500错误所需的疑难解答帮助(Java),java,servlets,cookies,Java,Servlets,Cookies,我正在上一门java课程,我遇到了麻烦。在执行这段代码之前,我创建了一个cookie,它将发货号存储为cookie名称,发货日期存储为cookie值 然后,表单要求用户输入一个确认号码。以下代码应: 将键入的字符串转换为整数 检索保存的Cookie并将名称转换为整数 将键入的号码与保存的cookie号码进行比较 如果键入的数字和保存的数字相同,它将以字符串形式检索日期的cookie值 然后将cookie值转换为日历日期值 然后将日期值与今天的日期进行比较 如果发货编号有效且与存储的cookie匹
/*
* cancelOrder servlet looks for the cookies associated
* with the shopping cart confirmation page
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.text.*;
import java.util.concurrent.TimeUnit;
public class cancelOrder extends HttpServlet {
//sets initial values for what we will retrieve
//from the cookie
int confirmNumber = 0;
String shippingDate = "01/01/2000";
Date date;
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
public static long getDateDiffInDays(Date date1, Date date2) {
long diffInMillis = date2.getTime() - date1.getTime();
return TimeUnit.MILLISECONDS.toDays(diffInMillis);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
//gets the fields that the user filled
String enteredConfirmNumber = request.getParameter("ConfirmationNumber");
//converts confirmNumber from string
//to integer
int enteredConfirmNo = Integer.parseInt(enteredConfirmNumber);
//gets cookie value if it matches user input
Cookie[] cookies = request.getCookies();
Cookie cookie;
for(int i=0; i<cookies.length; i++) {
cookie = cookies[i];
String foundCookie = cookie.getName();
//converts cookie name from string
//to integer
int cookieNo = Integer.parseInt(foundCookie);
if(cookieNo == enteredConfirmNo) {
confirmNumber = cookieNo;
shippingDate = cookie.getValue();
}
}
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
try {
date = formatter.parse(shippingDate);
} catch (ParseException e) {
e.printStackTrace();
}
//converts shippingDate from string
//to calendar format
Calendar shipDate = Calendar.getInstance();
shipDate.setTime(date);
//gets today's date in calendar format
Calendar today = Calendar.getInstance();
//unsure if this will throw int or string
long daysTillShip = getDateDiffInDays(today.getTime(), shipDate.getTime());
if(confirmNumber != 0 &&
daysTillShip > 5) {
showPage(response, "Your order was successfully canceled.");
} else {
showPage(response, "Either it is less than 5 days before delivery " +
"or your confirmation number does not exist");
}
}
/**
* Actually shows the <code>HTML</code> result page
*/
protected void showPage(HttpServletResponse response, String message)
throws ServletException, java.io.IOException {
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Status of Your Order</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>" + message + "</h2>");
out.println("</body>");
out.println("</html>");
out.close();
}
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}
/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}
}
编辑:正如其他人所问,日志文件是这样说的:
May 03, 2014 12:20:02 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [cancelOrder] in context with path [/csj] threw exception
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:454)
at java.lang.Integer.parseInt(Integer.java:527)
at cancelOrder.processRequest(cancelOrder.java:37)
at cancelOrder.doPost(cancelOrder.java:118)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
May 03, 2014 12:20:45 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [cancelOrder] in context with path [/csj] threw exception
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:454)
at java.lang.Integer.parseInt(Integer.java:527)
at cancelOrder.processRequest(cancelOrder.java:37)
at cancelOrder.doGet(cancelOrder.java:109)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
我发现,正如stacktrace所示,问题与int有关。我最终选择了一个稍微不同的方向,但我希望这是一个更干净的方向:
/*
* cancelOrder servlet looks for the cookies associated
* with the shopping cart confirmation page
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.text.*;
import java.util.concurrent.TimeUnit;
public class cancelOrder extends HttpServlet {
//sets initial values for what we will retrieve
//from the cookie
String confirmNumber = "0";
String shippingDate = "01/01/2000";
Date date;
/** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
*/
public static long getDateDiffInDays(Date date1, Date date2) {
long diffInMillis = date2.getTime() - date1.getTime();
return TimeUnit.MILLISECONDS.toDays(diffInMillis);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
//gets the fields that the user filled
String enteredConfirmNumber = request.getParameter("ConfirmationNumber");
//gets cookie value if it matches user input
Cookie[] cookies = request.getCookies();
Cookie cookie;
for(int i=0; i<cookies.length; i++) {
cookie = cookies[i];
String foundCookie = cookie.getName();
//converts cookie name from string
//to integer
if(foundCookie.equals(enteredConfirmNumber)) {
confirmNumber = foundCookie;
shippingDate = cookie.getValue();
}
}
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
try {
date = formatter.parse(shippingDate);
} catch (ParseException e) {
e.printStackTrace();
}
//converts shippingDate from string
//to calendar format
Calendar shipDate = Calendar.getInstance();
shipDate.setTime(date);
//gets today's date in calendar format
Calendar today = Calendar.getInstance();
//unsure if this will throw int or string
long daysTillShip = getDateDiffInDays(today.getTime(), shipDate.getTime());
if(confirmNumber.equals(enteredConfirmNumber) &&
daysTillShip > 5) {
showPage(response, "Your order was successfully canceled.");
} else {
showPage(response, "Either it is less than 5 days before delivery " +
"or your confirmation number does not exist");
}
}
/**
* Actually shows the <code>HTML</code> result page
*/
protected void showPage(HttpServletResponse response, String message)
throws ServletException, java.io.IOException {
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Status of Your Order</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>" + message + "</h2>");
out.println("</body>");
out.println("</html>");
out.close();
}
/** Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}
/** Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
processRequest(request, response);
}
}
服务器日志中有stacktrace吗?如果没有更多信息,很难说出任何事情。通常会有一个stacktrace显示异常发生的确切位置。我现在添加了日志文件信息,因此我希望这有助于确定问题所在!