我有一个输入表单(index.jsp):
<form action="process-mobile-number.jsp" method="post">
<table>
<tr>
<td>Enter a mobile number:</td>
<td>
<input type="number" name="telco" maxlength="4" style="width: 20%" required title="Please enter your 4-digit prefix."/>
-
<input type="text" name="mobile" maxlength="7" style="width: 70%" required title="Please enter your 7-digit number."/>
</td>
</tr>
<tr><td><input type="submit" value="Submit" style="width: 50%"/></td></tr>
</table>
</form>
这是一个servlet,它可以计算系统的使用次数:
@WebServlet("/process-mobile-number.jsp")
...
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
// initialize counters
int smartCtr = 0;
int globeCtr = 0;
int sunCtr = 0;
...
switch(telcoProvider) {
case "SMART":
smartCtr++;
break;
case "GLOBE":
globeCtr++;
break;
case "SUN":
sunCtr++;
break;
}
...
// assemble counter bean
Counter counter = CounterAssembler.getInstance(smartCtr, globeCtr, sunCtr);
// create session
HttpSession session = request.getSession();
// bind objects to session
session.setAttribute("smartCtr", counter.getSmartCtr());
session.setAttribute("globeCtr", counter.getGlobeCtr());
session.setAttribute("sunCtr", counter.getSunCtr());
// redirect to results jsp
response.sendRedirect("mobile-number-result.jsp");
}
这是输出JSP:
<form action="index.jsp" method="post">
<table>
...
<tr><td style="font-weight: bold">Your number of successful attempts are:</td></tr>
<tr><td>SMART: <%=session.getAttribute("smartCtr") %></td></tr>
<tr><td>GLOBE: <%=session.getAttribute("globeCtr") %></td> </tr>
<tr><td>SUN: <%=session.getAttribute("sunCtr") %></td></tr>
<tr>
<td>
<input type="hidden" name="smartctr" value="<%=session.getAttribute("smartCtr") %>"/>
<input type="hidden" name="globectr" value="<%=session.getAttribute("globeCtr") %>"/>
<input type="hidden" name="sunctr" value="<%=session.getAttribute("sunCtr") %>"/>
<input type="submit" value="Go Back" style="width: 18%"/>
</td>
</tr>
</table>
</form>
的问题:
但是,当我按“Go Back”返回index.jsp并开始另一个事务时,计数器总是重置为0
如何使它们与隐藏的表单字段保持一致?
谢谢。
答案 0 :(得分:2)
因为每次调用dopost方法时,您都会使用值0初始化变量。相反,您只需检查会话属性是否存在,否则设置属性。
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = req.getSession(true);
// get counter variables
Integer smartCtr = session.getAttribute("smart") == null? 0: session.getAttribute("smart");
Integer globeCtr = session.getAttribute("globe") == null? 0: session.getAttribute("globe");
Integer sunCtr = session.getAttribute("sun") == null? 0: session.getAttribute("globe");
//your logic
....
//set incremented values back
session.setAttribute("smart", smartCtr);
.....
}
答案 1 :(得分:0)
如果你想计算系统使用次数,我建议你应该使用静态变量。
private static int smartCtr = 0;
private static int globeCtr = 0;
private static int sunCtr = 0;