在JSP中使用隐藏表单保留数据

时间:2014-09-26 02:23:05

标签: java jsp session servlets hidden-field

我有一个输入表单(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>

enter image description here

问题:
但是,当我按“Go Back”返回index.jsp并开始另一个事务时,计数器总是重置为0 如何使它们与隐藏的表单字段保持一致?

谢谢。

2 个答案:

答案 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;