0

我有一个jsp 页面和一个servlet,在JSP 页面中我有两种形式,每一种选择输入类型,即选择班级和选择学生。当我从选择下拉列表中选择类时,通过 onchange 事件它转到 abcServlet,从 servlet 检索类并转发到 jsp 页面转到 jsp 页面中的下一个表单,即选择学生,它再次提交到同一个 servlet,从他们的servlet转发到同一个jsp页面,从servlet中检索学生,学生根据所选班级正确显示在选择学生下拉列表中,但我的问题是当我在选择学生下拉列表中选择一个学生时,班级值正在更改为null (我认为当第一次 servlet 转发到 jsp 页面时,从 abcServlet 中正确检索到类,当我从下一个下拉列表中选择学生时,第二次转发整个 jsp,

StudentFee.java

        String sname[]={};
        ResultSet rs;
        int no_stdnts=0,admfee=0;
        String clas;
        clas=request.getParameter("class");
        Class.forName("com.mysql.jdbc.Driver");
        Connection con=DriverManager.getConnection("jdbc:mysql://localhost/XYZ","XYZ","XYZ");
        Statement st;
        st=(Statement)con.createStatement();
        rs=st.executeQuery("select count(sid) from students where class='"+clas+"'");
        while(rs.next())
        {
            no_stdnts=rs.getInt(1);
        }
        String snames[]=new String[no_stdnts];
        String stdnt=request.getParameter("student");

        request.setAttribute("snames", snames);
        request.setAttribute("no_stdnts", no_stdnts);
        request.setAttribute("cls", clas);

        RequestDispatcher rd=request.getRequestDispatcher("studentfee.jsp");
        rd.forward(request,response);

学生费.jsp

<form  name="sclass" id="sclass" action="StudentFee" method="post">
            <br><br>
            <label style="font-size: 20px; word-spacing: 4px;"><b>Select Class : </b></label>
            <select name="class" id="clas" onchange="Javascript:sclass.submit()">
                        <option value="Select" style="visibility:hidden;"><% String cls=(String)request.getAttribute("cls");if(cls!=null)out.print(cls);else out.print("Select");%></option>
                        <option value="Nursery">Nursery</option>
                        <option value="LKG">LKG</option>
                        <option value="UKG">UKG</option>
                        <option value="I">I</option>
                        <option value="II">II</option>
                        <option value="III">III</option>
                        <option value="IV">IV</option>
                        <option value="V" >V</option>
                        <option value="VI">VI</option>
                        <option value="VII">VII</option>
                        <option value="VIII">VIII</option>
                        <option value="IX">IX</option>
                        <option value="X">X</option>
            </select>                
        </form>
        </td></tr>
        <tr><td>
        <form  name="sname" id="sname" action="StudentFee" method="post">
            <br><br>
            <label style="font-size: 20px; word-spacing: 4px;"><b>Select Student : </b></label>
            <select name="student" id="clas" onchange="Javascript:sname.submit()">

                        <%

                        try
                        {
                            response.setContentType("text/html");
                            int no_stdnts=(Integer)request.getAttribute("no_stdnts");
                            String snames[]=new String[no_stdnts];
                            snames=(String[])request.getAttribute("snames");
                            for(int i=0;i<no_stdnts;i++)
                            { %>
                            <option>
                            <% out.print(snames[i]);
                            }   
                        }
                        catch(Exception e)
                        {
                            e.getMessage();
                        }
                        %>
                        </option>
            </select>                
        </form>
4

2 回答 2

0

我注意到的第一件事是两个字段的id值相同。select为什么?最好使用不同的值idname为 each使用相同的值select

第二个问题是,您使用两种不同的形式而不处理状态。如果您提交一个表单,那么 POST 操作仅包含此表单输入字段的参数。例如,如果您提交表单sname,则 POST 请求仅包含参数student而没有参数class

您必须以某种方式保持先前选择的状态。有几种方法可以实现这一点。

  1. 您可以在会话中存储以前的选择。在您的 JSP 中,您可以首先尝试从会话中恢复选择。如果会话中没有存储值,则显示默认值。在这种情况下,您可以在以后的请求中访问先前选择的状态。
  2. 如果您对两个输入字段仅使用一个表单,则每个表单提交都将包含参数studentclass. 在这种情况下,您的 servlet 始终会获得先前的选择,并且您不必在会话中使用服务器端状态。
  3. 如果您仍想使用两种不同的表单,则class在第二个表单中放置一个隐藏字段并将其值初始化为先前的选择。如果用户提交第二个表单,您的 servlet 将获得class第二个场景中的附加参数。

2. 和 3. 之间的区别在于,在 2. 中,用户可以同时更改两个选择。

如果您了解如何以传统方式管理此类状态,则可以继续使用 AJAX,您无需提交和重新加载整个页面,而只是其中的一小部分。那里有几个教程,只需一个 Google 搜索即可。

于 2013-04-26T21:47:39.397 回答
0

听起来这一切都隐含着一个会话。您有两个操作,并且您希望第二个操作记住第一个操作的结果。

您可以在会话中维护相关值。如果您没有找到,则表示该查询从未运行过。如果这样做,请将其退回并显示。

于 2013-04-26T17:09:42.943 回答