servlet 无法保存到数据库
servlet unable to save to database
我正在编写一个简单的 servlet 程序,我试图在其中将 Web 表单数据 (jsp) 保存到 mySQL 数据库。我收到 HTTP 状态 404。
这是我的代码
我的 FirstServlet.java 文件是
package first;
import java.io.IOException;
import java.io.PrintWriter;
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 java.sql.*;
public class FirstServlet 扩展了 HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FirstServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Employee Management form";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0c0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>First Name</b>: "
+ request.getParameter("first_name") + "\n" +
" <li><b>Last Name</b>: "
+ request.getParameter("last_name") + "\n" +
"</ul>\n" +
"</body></html>");
try {
Connection myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root" , "password");
System.out.println("Loading driver...");
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Driver loaded!");
Statement myStmt = myConn.createStatement();
//ResultSet myRs = myStmt.executeQuery("select * from countrylanguage");
String sql = "insert into countrylanguage"
+ " (CountryCode, Language, IsOfficial, Percentage)"
+ " VALUES ('dvi', 'engli', 'T', '9.3')";
myStmt.executeUpdate(sql);
}
catch (Exception exc) {
exc.printStackTrace();
}
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
index.jsp 文件是
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<H1>Welcome to Employee Management Project</H1>
<form action="FirstServlet" method="GET">
First Name: <input type="text" name="first_name"> <br />
Last Name: <input type="text" name="last_name" /> <br /> <br />
<input type="checkbox" name="add" /> Add <input type="checkbox" name="search" /> Search <input
type="checkbox" name="delete" /> Delete <input type="checkbox"
name="update" /> Update <br /> <br />
<input type="submit" value="Submit" />
</form>
</body>
</html>
web.xml 文件是
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>HelloServlet2</display-name>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>first.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
</web-app>
以下是文件夹的层次结构
HelloSevrvlet2
Java Resources
src
first
FirstServlet.java
Libraries
Apache Tomcat v7.0
EAR Libraries
JRE System Library
Web App Libraries
WebContent
WEB-INF
Lib
web.xml
index.jsp
在web.xml中,下一行必须是这样的:
<servlet-class>first.FirstServlet</servlet-class>
并且在 jsp 文件中,您的操作必须是:
action="/FirstServlet"
您在 jsp 文件的表单语句中有错字。
你有:
"HelloServlet2" 被错误拼写为 HelloSevrvlet2。更正此问题后,您的代码应该可以正常工作。我已经使用 Glassfish 服务器亲自测试了您的代码。
以下是从 JSP 获取值并存储在数据库中的方法 table:
1. 在数据库
中创建table
create table emp(
emp_id Integer primary key,
first_name varchar(25),
last_name varchar(25)
)
上面提到的 'create table' 语句是针对 JavaDB 数据库的,它与 Glassfish 服务器捆绑在一起。但是您可以调整创建语句,使其可以 运行 在您选择的数据库上。
Java Servlet 代码(我刚刚包含了数据库的 try/catch 块
相互作用。 servlet 代码的其他部分与您之前发布的相同。)
// You do not need to load the driver class as JDBC now
// loads the required driver class automatically based on the
// connect string you specify in the getConnection() method.
Connection myConn = null;
try {
int emp_id = Integer.parseInt(request.getParameter("emp_id"));
String first_name = (String) request.getParameter("first_name");
String last_name = (String) request.getParameter("last_name");
myConn = DriverManager.getConnection
("jdbc:derby://localhost:1527/sun-appserv-samples", "app", "app");
String sql = "INSERT INTO emp"
+ " (emp_id, first_name, last_name)"
+ " VALUES (?,?,?)";
PreparedStatement myStmt = myConn.prepareStatement(sql);
myStmt.setInt(1, emp_id);
myStmt.setString(2, first_name);
myStmt.setString(3, last_name);
int status = myStmt.executeUpdate();
out.println(status + " rows inserted");
myConn.commit();
myConn.close();
} catch (Exception exc) {
exc.printStackTrace();
out.println(exc.getMessage());
}
一旦您了解了 Hibernate/JPA/JTA/JPQL 等技术,您会发现这些 API 提供了非常强大的与数据库交互的功能。使用这些技术,您将不必直接与 JDBC 交互。目前,我上面给出的解决方案应该足够了。
我正在编写一个简单的 servlet 程序,我试图在其中将 Web 表单数据 (jsp) 保存到 mySQL 数据库。我收到 HTTP 状态 404。 这是我的代码
我的 FirstServlet.java 文件是
package first;
import java.io.IOException;
import java.io.PrintWriter;
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 java.sql.*;
public class FirstServlet 扩展了 HttpServlet { private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public FirstServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Employee Management form";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0c0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>First Name</b>: "
+ request.getParameter("first_name") + "\n" +
" <li><b>Last Name</b>: "
+ request.getParameter("last_name") + "\n" +
"</ul>\n" +
"</body></html>");
try {
Connection myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root" , "password");
System.out.println("Loading driver...");
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Driver loaded!");
Statement myStmt = myConn.createStatement();
//ResultSet myRs = myStmt.executeQuery("select * from countrylanguage");
String sql = "insert into countrylanguage"
+ " (CountryCode, Language, IsOfficial, Percentage)"
+ " VALUES ('dvi', 'engli', 'T', '9.3')";
myStmt.executeUpdate(sql);
}
catch (Exception exc) {
exc.printStackTrace();
}
}
// Method to handle POST method request.
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
index.jsp 文件是
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<H1>Welcome to Employee Management Project</H1>
<form action="FirstServlet" method="GET">
First Name: <input type="text" name="first_name"> <br />
Last Name: <input type="text" name="last_name" /> <br /> <br />
<input type="checkbox" name="add" /> Add <input type="checkbox" name="search" /> Search <input
type="checkbox" name="delete" /> Delete <input type="checkbox"
name="update" /> Update <br /> <br />
<input type="submit" value="Submit" />
</form>
</body>
</html>
web.xml 文件是
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>HelloServlet2</display-name>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>first.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
</servlet-mapping>
</web-app>
以下是文件夹的层次结构
HelloSevrvlet2
Java Resources
src
first
FirstServlet.java
Libraries
Apache Tomcat v7.0
EAR Libraries
JRE System Library
Web App Libraries
WebContent
WEB-INF
Lib
web.xml
index.jsp
在web.xml中,下一行必须是这样的:
<servlet-class>first.FirstServlet</servlet-class>
并且在 jsp 文件中,您的操作必须是:
action="/FirstServlet"
您在 jsp 文件的表单语句中有错字。 你有: "HelloServlet2" 被错误拼写为 HelloSevrvlet2。更正此问题后,您的代码应该可以正常工作。我已经使用 Glassfish 服务器亲自测试了您的代码。
以下是从 JSP 获取值并存储在数据库中的方法 table:
1. 在数据库
create table emp(
emp_id Integer primary key,
first_name varchar(25),
last_name varchar(25)
)
上面提到的 'create table' 语句是针对 JavaDB 数据库的,它与 Glassfish 服务器捆绑在一起。但是您可以调整创建语句,使其可以 运行 在您选择的数据库上。
Java Servlet 代码(我刚刚包含了数据库的 try/catch 块 相互作用。 servlet 代码的其他部分与您之前发布的相同。)
// You do not need to load the driver class as JDBC now // loads the required driver class automatically based on the // connect string you specify in the getConnection() method. Connection myConn = null; try { int emp_id = Integer.parseInt(request.getParameter("emp_id")); String first_name = (String) request.getParameter("first_name"); String last_name = (String) request.getParameter("last_name"); myConn = DriverManager.getConnection ("jdbc:derby://localhost:1527/sun-appserv-samples", "app", "app"); String sql = "INSERT INTO emp" + " (emp_id, first_name, last_name)" + " VALUES (?,?,?)"; PreparedStatement myStmt = myConn.prepareStatement(sql); myStmt.setInt(1, emp_id); myStmt.setString(2, first_name); myStmt.setString(3, last_name); int status = myStmt.executeUpdate(); out.println(status + " rows inserted"); myConn.commit(); myConn.close(); } catch (Exception exc) { exc.printStackTrace(); out.println(exc.getMessage()); }
一旦您了解了 Hibernate/JPA/JTA/JPQL 等技术,您会发现这些 API 提供了非常强大的与数据库交互的功能。使用这些技术,您将不必直接与 JDBC 交互。目前,我上面给出的解决方案应该足够了。