我有一个jsp页面和一个servlet,在jsp页面中我有两个表单,每个都选择输入类型,即选择类和选择学生。当我从选择下拉菜单中选择类时,通过onchange事件,它会转到abcServlet,从servlet检索类,并将其转发到jsp页面,转到jsp页面中的下一个表单,即,选择学生,它再次提交到相同的servlet,从他们的servlet转发到相同的jsp页面,学生从servlet中检索,学生根据所选的类正确显示在选择学生下拉列表中,但我的问题是当我在选择学生下拉列表中选择学生时,类值更改为空(我认为第一次servlet转发到jsp页面时,类从abcServlet中正确检索,当我从下拉菜单中选择学生时,第二次整个jsp被转发,所以类值第二次变为null)我希望我的类保持不变,当我选择类后从学生下拉菜单中选择学生时,我该如何实现这一点?
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>
听起来这一切都隐含着一个会话。您有两个操作,您希望第二个操作记住第一个操作的结果。
可以在会话中维护相关的值。如果没有找到,则意味着查询从未运行过。如果有,返回并显示。
我注意到的第一件事是两个select
字段的id
值相同。为什么?对于每个select
, id
和name
最好使用不同的值,并且使用相同的值。
第二个问题是,您使用两种不同的表单来处理状态。如果提交一个表单,则POST操作只包含该表单输入字段的参数。例如,如果你提交表单sname
,那么POST请求只包含参数student
而不包含参数class
。
必须以某种方式维护先前选择的状态。有几种方法可以实现此目的。
- 您可以在会话中存储之前的选择。在JSP中,您可以首先尝试从会话中恢复选择。如果会话中没有存储值,则显示默认值。在这种情况下,您可以在以后的请求中访问先前选择的状态。
- 如果两个输入字段只使用一个表单,那么每个提交的表单将包含两个参数
student
和class
。在这种情况下,你的servlet总是得到之前的选择,你不必使用服务器端状态与会话。 - 如果您仍然希望使用两个不同的表单,那么在第二个表单中放置一个隐藏字段
class
,并将其值初始化为前一个选择。如果用户提交第二个表单,servlet将获得第二个场景中的附加参数class
。
2。和3。这是2。用户可以同时更改这两个选择。
如果您了解如何以传统方式管理这种状态,您可以继续使用AJAX,您不提交和重新加载整个页面,而只是其中的一小部分。