我在idea中写了一个jsp和servlet想实现随机分组功能,但结果显然不尽人意。



<%@ 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数据库否,在后端打印一下关键信息,

img

在这数据打印一下,看看到底有没有结果出来

根据您提供的代码,我注意到可能会导致问题的几个地方。

  1. 在JSP文件中,您使用了隐式对象request来访问groups属性。但在Servlet中,您没有设置groups属性。您需要在Servlet中添加如下代码来设置groups属性:
request.setAttribute("groups", groups);
  1. 在JSP文件中,检查groups是否为空时,您使用了两个相同的条件语句,这可能会导致逻辑上的问题。您可以删除其中一个条件语句:
<% if (groups != null && !groups.isEmpty()) { %>
    <!-- 显示分组结果的代码 -->
<% } else { %>
    No groups available.
<% } %>
  1. 在Servlet的init()方法中,您调用了getElementsFromDatabase()方法来获取数据库中的学生姓名列表,但您在SQL查询语句中使用的列名似乎有误。请将查询语句中的student name更正为student_name
String sql = "SELECT student_name FROM Student_table";

注意,这里的列名应与数据库中实际的列名一致。

  1. 在JSP文件中,您使用<%= 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";检查这个表名和字段是否正确