要求编写单一的Servlet程序完成以下功能: 根据tn表名参数,使用request.getParameter('tn') 方法得到表名,根据表名使用connection.getMetaData()动态获取数据表字段结构,依字段名命名表单项,使用response.getWriter()方法输出网页表单,实现数据列表、添加和编辑功能。 表单提交后通过之前以字段名命名的网页表单项,使用Servlet提供的request.getParameter() 方法 接收客户端提交的数据,再使用jdbc技术实现数据列表和增、删、改、查等功能。
时间: 2023-12-14 16:39:12 浏览: 83
java request.getParameter中文乱码解决方法
以下是一个基本的Servlet程序,实现了上述要求的所有功能:
```java
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
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;
@WebServlet("/TableServlet")
public class TableServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "password";
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String tableName = request.getParameter("tn");
if (tableName == null || tableName.isEmpty()) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Table name parameter is missing");
return;
}
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
DatabaseMetaData metaData = conn.getMetaData();
ResultSet rs = metaData.getColumns(null, null, tableName, null);
List<String> columnNames = new ArrayList<>();
while (rs.next()) {
String columnName = rs.getString("COLUMN_NAME");
columnNames.add(columnName);
}
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>" + tableName + " Table</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>" + tableName + " Table</h1>");
out.println("<table border=\"1\">");
out.println("<tr>");
for (String columnName : columnNames) {
out.println("<th>" + columnName + "</th>");
}
out.println("<th>Action</th>");
out.println("</tr>");
String sql = "SELECT * FROM " + tableName;
rs = conn.createStatement().executeQuery(sql);
while (rs.next()) {
out.println("<tr>");
for (String columnName : columnNames) {
out.println("<td>" + rs.getString(columnName) + "</td>");
}
out.println("<td><a href=\"edit.jsp?id=" + rs.getInt("id") + "\">Edit</a> | "
+ "<a href=\"delete.jsp?id=" + rs.getInt("id") + "\">Delete</a></td>");
out.println("</tr>");
}
out.println("</table>");
out.println("<br>");
out.println("<h2>Add New " + tableName + "</h2>");
out.println("<form method=\"post\" action=\"TableServlet\">");
for (String columnName : columnNames) {
out.println(columnName + ": <input type=\"text\" name=\"" + columnName + "\"><br>");
}
out.println("<input type=\"hidden\" name=\"action\" value=\"add\">");
out.println("<input type=\"submit\" value=\"Add\">");
out.println("</form>");
out.println("</body>");
out.println("</html>");
} catch (SQLException e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Database error");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
if ("add".equals(action)) {
String tableName = request.getParameter("tn");
if (tableName == null || tableName.isEmpty()) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Table name parameter is missing");
return;
}
List<String> columnNames = new ArrayList<>();
List<String> values = new ArrayList<>();
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String parameterName = parameterNames.nextElement();
if (!"tn".equals(parameterName) && !"action".equals(parameterName)) {
columnNames.add(parameterName);
values.add(request.getParameter(parameterName));
}
}
String sql = "INSERT INTO " + tableName + "(" + String.join(",", columnNames) + ")"
+ " VALUES ('" + String.join("','", values) + "')";
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
conn.createStatement().executeUpdate(sql);
response.sendRedirect("TableServlet?tn=" + tableName);
} catch (SQLException e) {
e.printStackTrace();
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Database error");
}
}
}
}
```
这个Servlet程序的基本思路是:
1. 从请求参数中获取数据表名
2. 使用JDBC连接到数据库,获取数据表的字段名
3. 输出一个HTML表单,其中包含所有字段名作为表单项
4. 从POST请求中获取表单数据,并将其插入到数据表中
5. 重新加载网页,以显示最新的数据列表
在这个程序中,我们使用了Java Servlet API和JDBC API来完成这些任务。在 doGet() 方法中,我们首先获取表名,并从数据库元数据中获取列名列表。然后,我们输出一个HTML表格,其中每一行代表一个表中的数据行,并在表格底部添加一个表单,以添加新的数据行。在 doPost() 方法中,我们从表单中获取数据,并将其插入到数据表中。最后,我们重定向到GET请求,以重新加载网页并显示最新的数据列表。
注意,这个程序只是一个简单的例子,它没有考虑安全性和错误处理。在实际的应用程序中,您需要对用户输入进行验证,并处理可能发生的错误,以确保程序的正确性和安全性。
阅读全文