【发布时间】:2015-01-08 17:39:39
【问题描述】:
我有一个 servlet,它应该从我的数据库中更新一条记录。
我的代码一定有问题,因为 tomcat 显示错误:java.lang.NumberFormatException: null @package_ergasia.EditProtein.doPost(EditProtein.java:36) 这是这一行:int i = Integer.parseInt(request.getParameter("i"));
这是我的 Servlet:
package package_ergasia;
import java.sql.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class EditProtein extends HttpServlet
{
Connection connection;
Statement statement;
ResultSet resultset;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
Connection connection= null;
String url = "jdbc:mysql://localhost:3306/";
String dbName = "ergasia";
String user = "root";
String password = "password";
String id = request.getParameter("id");
String name = request.getParameter("pname");
String desc = request.getParameter("desc");
String seq = request.getParameter("seq");
int i = Integer.parseInt(request.getParameter("i"));
try {
connection = DriverManager.getConnection(url + dbName, user, password);
PreparedStatement ps = connection.prepareStatement("UPDATE protein SET pdb_id=?,proteinName=?,description=?,proteinSequence=? WHERE i=?");
ps.setString(1, id);
ps.setString(2, name);
ps.setString(3, desc);
ps.setString(4, seq);
ps.setInt(5, i);
ps.executeUpdate();
RequestDispatcher view = request.getRequestDispatcher("/InsertProtein");
view.forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这是带有表单的jsp,用户可以在其中更新数据:
<%@page import="java.util.Iterator"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" import="java.sql.*"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../CSS/mystyle.css">
</head>
<body>
<h1>Welcome</h1>
<form method="post" action="/EditProtein">
<fieldset style="width: 100px">
<legend>Update protein table</legend>
<table border="1">
<%
int count = 0;
if (session.getAttribute("EditData") != null) {
ArrayList al1 = (ArrayList) session.getAttribute("EditData");
Iterator itr = al1.iterator();
while (itr.hasNext()) {
count++;
ArrayList pList = (ArrayList) itr.next();
%>
<tr>
<td>pdb_id</td>
<td><input type="text" disabled="disabled" font="Verdana" name="id" value="<%=pList.get(0)%>"</td>
</tr>
<tr>
<td>Protein Name</td>
<td><input type="text" font="Verdana" name="pname" value="<%=pList.get(1)%>"</td>
</tr>
<tr>
<td>Description</td>
<td><input type="text" font="Verdana" name="desc" value="<%=pList.get(2)%>"</td>
</tr>
<tr>
<td>Sequence</td>
<td><input type="text" font="Verdana" name="seq" value="<%=pList.get(3)%>"</td>
</tr>
<tr>
<td>i</td>
<td><input type="number" disabled="disabled" font="Verdana" name="i" value="<%=pList.get(4)%>"</td>
</tr>
<tr>
<td><input type="submit" value="Update"></td>
<td><input type="reset" value="Reset"></td>
</tr>
<% }} %>
</table>
</fieldset>
</form>
</body>
</html>
非常感谢您的帮助!
【问题讨论】:
-
java.lang.NumberFormatException: nullon this lineInteger.parseInt(request.getParameter("i"));表示由于某些不清楚的原因,无法从问题中提供的代码中想象到来自传入请求的名称为i的请求参数。你如何传递这个请求参数?您可能忘记传递此参数或命名不同的名称。请尝试查看另一侧。 -
附带说明:您不能将
Connection、Statement(或PreparedStatement)和ResultSet声明为类成员。它们应该在尽可能短的范围内精确地使用和关闭,这通常是使用它们的方法(Servlet 是线程不安全的资源,并且具有应用程序范围的范围。它们都将在所有请求中重用/共享)。 -
看起来我不能传递任何参数。我添加了 jsp,其中包含用户编辑数据的表单。到目前为止,它工作正常,因为表单成功加载了数据。
-
您尚未关闭任何
<input type="text"/>元素。这是一个无效的 HTML 标记。例如,<input type="text" font="Verdana" name="pname" value="<%=pList.get(1)%>"应更改为<input type="text" font="Verdana" name="pname" value="<%=pList.get(1)%>"/>。仔细查看标签的最后。还可以尝试在您喜欢的浏览器上查看生成的 HTML,以查看 HTML 代码是否正确呈现,您将能够找出代码中的错误。 -
附带说明:您不应该依赖客户端的 disabled/readonly 属性,因为这样的事情很容易被用户绕过(这很容易,即使是孩子也可以这样做:))。您应该准确地在服务器端以及在您的实际应用程序中进行验证(除了客户端验证,如果有的话)。
标签: database jsp servlets edit record