2013-04-26 86 views
0

我有一个jsp页面和一个servlet,在JSP页面中我有两种形式,每种选择输入类型,即选择类和选择学生。当我从选择下拉列表中选择类时,通过onchange事件进入abcServlet,从servlet中检索类,并将其转发到jsp页面,转到jsp页面中的下一个表单,即选择student,然后再次提交给同一个servlet,从他们的servlet转发到相同的jsp页面,并从servlet中检索学生,并根据选择的类正确地在选择学生下拉列表中显示学生,但是我的问题是当我在选择学生下拉列表中选择学生时,Class值更改为null (我认为当第一次servlet转发到jsp页面时,类是从abcServlet中正确检索的,当我从下一个下拉菜单中选择学生时,第二次整个jsp被转发,所以class值第二次变为null)我想要我选择课后从学生下拉菜单中选择学生时,我的课程保持不变,我该如何实现这一目标?Jsp和Servlet处理

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); 

studentfee.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> 
+0

代码片段请 – 2013-04-26 17:11:03

+0

不要提交整个页面;使用Ajax。 – 2013-04-26 17:27:26

+0

其实我并不了解Ajax,因为我是JSP和servlet的新手。有没有其他方式可能没有ajax – user2147921 2013-04-26 17:34:26

回答

0

这听起来像有这一切隐含的会话。你有两个操作,而你想让第二个操作记住第一个操作的结果。

您可以在会话中维护相关值。如果你没有找到,那意味着查询从未运行过。如果你这样做,返回并显示它。

0

我注意到的第一件事情是两个select字段的id值相同。为什么?对于每个select,使用不同的值并对idname使用相同的值会更好。

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

你必须保持以前的某种选择的状态。有几个选择来实现这一点。

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

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

如果您了解如何以传统方式管理此类状态,则可以继续使用AJAX,如果您没有提交并重新加载整个页面,但只是其中的一小部分内容。有几个教程,只有一个谷歌搜索了。