<%@ page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<% List<List<String>> groups = (List<List<String>>) request.getAttribute("groups");%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Random Grouping</title>
<script>
function validateInput() {
var groupSize = document.getElementById("groupSizeInput").value;
var isValid = /^\d+$/.test(groupSize);
if (!isValid) {
alert("请输入一个有效的整数!");
return false; }
return true; }
</script>
<style> table {
border-collapse: collapse; }
th, td { border: 1px solid black; padding: 5px; }
</style>
</head>
<body>
<h1>Random Grouping Result</h1>
<form action="<%= request.getRequestURI() %>" method="get" onsubmit="return validateInput()"> <label for="groupSizeInput">每组人数要求:</label>
<input type="text" id="groupSizeInput" name="groupSize" required>
<input type="submit" value="分组">
</form>
<%
if (groups != null && !groups.isEmpty()) {%>
<table>
<thead>
<tr>
<th>Group</th>
<th>Members</th>
</tr>
</thead>
<tbody>
<%
for (int i = 0; i < groups.size(); i++) { List<String> group = groups.get(i); %>
<tr> <td>Group <%= i + 1 %></td>
<td> <% for (String member : group) { %>
<%= member %><br>
<% }
%>
</td>
</tr>
<% } %>
</tbody></table><%} else {%>
<% if (groups != null && !groups.isEmpty()) { out.println("Groups: " + groups); } else { out.println("No groups available."); }%><% }%></body>
</html>
servlet
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;import java.sql.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@WebServlet(name="RandomGroupServlet" , value = "/RandomGroupServlet")
public class RandomGroupServlet extends HttpServlet {
private static final long serialVersionUID = 1L; private List<String> elements;
@Override
public void init() throws ServletException { super.init();
elements = getElementsFromDatabase(); }
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 获取每组个数
int groupSize = Integer.parseInt(request.getParameter("groupSize"));
// 计算分组数和余数
int groupCount = elements.size() / groupSize; int remainCount = elements.size() % groupSize; // 打乱元素顺序
Collections.shuffle(elements);
// 分组
List<List<String>> groups = new ArrayList<>();
int startIndex = 0;
for (int i = 0; i < groupCount; i++) {
List<String> group = elements.subList(startIndex, startIndex + groupSize);
groups.add(group);
startIndex += groupSize; }
if (remainCount > 0) {
List<String> group = elements.subList(startIndex, startIndex + remainCount);
groups.add(group); }
// 将分组结果存储到request对象中,以便在JSP中显示
request.setAttribute("groups", groups);
// 转发到JSP页面
request.getRequestDispatcher("randomgroup.jsp").forward(request, response); }
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response); /* out.println(request);*/ }
private List<String> getElementsFromDatabase() {
List<String> elements = new ArrayList<>();
// 加载JDBC驱动程序 try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); }
catch (ClassNotFoundException e) {
e.printStackTrace(); }
// 连接到数据库
String url = "jdbc:sqlserver://rm-2vc29v604h63b672yeo.mssql.cn-chengdu.rds.aliyuncs.com:3433;databaseName=testdb;useUnicode=true&characterEncoding=UTF-8&trustServerCertificate=true";
String user = "testuser";
String password = "Test_pw123";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 从数据库中查询姓名列表
String sql = "SELECT student name FROM Student_table";
// 查询语句
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) {
String name = rs.getString("student_name");
elements.add(name);
}
}
} } catch (SQLException e) {
e.printStackTrace(); }
return elements;
}
}
这是全部代码,但是运行的时候前端始终显示no groups available,我实在不明白该怎么修改,非常感谢您的指导,谢谢。
我希望实现连接数据库中的表格,然后对学生进行随机分组,每组人数由用户自行指定,并在前端页面显示分组结果,请注意余数的处理,再次感谢。
后端有报错信息否,能确保连上sqlserver数据库否,在后端打印一下关键信息,
在这数据打印一下,看看到底有没有结果出来
根据您提供的代码,我注意到可能会导致问题的几个地方。
request
来访问groups
属性。但在Servlet中,您没有设置groups
属性。您需要在Servlet中添加如下代码来设置groups
属性:request.setAttribute("groups", groups);
groups
是否为空时,您使用了两个相同的条件语句,这可能会导致逻辑上的问题。您可以删除其中一个条件语句:<% if (groups != null && !groups.isEmpty()) { %>
<!-- 显示分组结果的代码 -->
<% } else { %>
No groups available.
<% } %>
init()
方法中,您调用了getElementsFromDatabase()
方法来获取数据库中的学生姓名列表,但您在SQL查询语句中使用的列名似乎有误。请将查询语句中的student name
更正为student_name
:String sql = "SELECT student_name FROM Student_table";
注意,这里的列名应与数据库中实际的列名一致。
<%= request.getRequestURI() %>
来设置表单的action属性,但您的Servlet的注解中指定的是/RandomGroupServlet
作为Servlet的URL映射值。请确保这两者是一致的。基于new bing部分指引作答:
从您提供的代码中,我注意到了几个问题可能导致您遇到的困扰:
1、数据库连接问题:您的代码中使用的是Microsoft SQL Server数据库,但您导入的是Jakarta EE的Servlet API(javax.servlet)。请确保您的项目中已正确导入并使用正确的数据库驱动程序。
2、SQL查询语句问题:您在查询语句中使用了不正确的列名。您将"student name"写为"student name",但应该是"student_name"。请检查数据库表中实际的列名并相应地更新查询语句。
3、JSP页面中的条件判断问题:在您的JSP页面中,有一个条件判断块,它检查变量"groups"是否为空并显示相应的消息。但是,您在两个地方重复使用了相同的条件判断,这可能导致逻辑问题。您可以删除第二个条件判断块,只保留第一个,以正确处理组的情况。
4、JSP页面的脚本代码问题:您在JSP页面中使用了Scriptlet(<% %>),这种写法已经不被推荐使用。建议使用EL表达式和JSTL标签库来替代Scriptlet,以提高代码的可读性和可维护性。
根据您的需求,这是修改后的JSP和Servlet代码:
<%@ page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Random Grouping</title>
<script>
function validateInput() {
var groupSize = document.getElementById("groupSizeInput").value;
var isValid = /^\d+$/.test(groupSize);
if (!isValid) {
alert("请输入一个有效的整数!");
return false;
}
return true;
}
</script>
<style>
table {
border-collapse: collapse;
}
th, td {
border: 1px solid black;
padding: 5px;
}
</style>
</head>
<body>
<h1>Random Grouping Result</h1>
<form action="${pageContext.request.contextPath}/RandomGroupServlet" method="get" onsubmit="return validateInput()">
<label for="groupSizeInput">每组人数要求:</label>
<input type="text" id="groupSizeInput" name="groupSize" required>
<input type="submit" value="分组">
</form>
<c:if test="${not empty groups}">
<table>
<thead>
<tr>
<th>Group</th>
<th>Members</th>
</tr>
</thead>
<tbody>
<c:forEach items="${groups}" var="group" varStatus="status">
<tr>
<td>Group ${status.index + 1}</td>
<td>
<c:forEach items="${group}" var="member">
${member}<br>
</c:forEach>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</c:if>
<c:if test="${empty groups}">
<c:if test="${not empty groups}">
Groups: ${groups}
</c:if>
<c:if test="${empty groups}">
No groups available.
</c:if>
</c:if>
</body>
</html>
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@WebServlet(name = "RandomGroupServlet", value = "/RandomGroupServlet")
public class RandomGroupServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private List<String> elements;
@Override
public void init() throws ServletException {
super.init();
elements = getElementsFromDatabase();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int groupSize = Integer.parseInt(request.getParameter("groupSize"));
int groupCount = elements.size() / groupSize;
int remainCount = elements.size() % groupSize;
Collections.shuffle(elements);
List<List<String>> groups = new ArrayList<>();
int startIndex = 0;
for (int i = 0; i < groupCount; i++) {
List<String> group = elements.subList(startIndex, startIndex + groupSize);
groups.add(group);
startIndex += groupSize;
}
if (remainCount > 0) {
List<String> group = elements.subList(startIndex, startIndex + remainCount);
groups.add(group);
}
request.setAttribute("groups", groups);
request.getRequestDispatcher("randomgroup.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
private List<String> getElementsFromDatabase() {
List<String> elements = new ArrayList<>();
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String url = "jdbc:sqlserver://rm-2vc29v604h63b672yeo.mssql.cn-chengdu.rds.aliyuncs.com:3433;databaseName=testdb;useUnicode=true&characterEncoding=UTF-8&trustServerCertificate=true";
String user = "testuser";
String password = "Test_pw123";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
String sql = "SELECT student_name FROM Student_table";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
try (ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
String name = rs.getString("student_name");
elements.add(name);
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return elements;
}
}
请注意,为了使代码更加简洁和可读,我在JSP代码中使用了JSTL(JavaServer Pages Standard Tag Library)来处理条件判断和循环。您需要确保您的项目中已正确导入JSTL库,并在JSP页面的顶部添加以下指令:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
请确保在部署和配置数据库连接时,使用正确的URL、用户名和密码。
"SELECT student_name FROM Student_table";检查这个表名和字段是否正确