2014-09-26 149 views
0

使用隐藏表单我有一个输入表单(的index.jsp):持久化数据在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

问:
然而,当我按下“返回”,返回到index.jsp和开始其他事务,计数器总是被重置为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); 
    ..... 
} 
+0

嗨,只是后续,我什么时候使用getSession(true)vs. getSession()? – silver 2014-09-26 06:43:40

+0

好吧,它们之间没有任何区别。 getsession()是getSession的简短版本(true)。所以它归结为您的偏好.. :) – Sas 2014-09-26 16:08:28

+0

我读[这里](http://www.studytonight.com/servlet/httpsession.php)getSession(true)将始终返回一个新的会话,而getSession()将返回现有的会话,如果有的话,否则将返回一个新的会话,如果没有。 – silver 2014-10-02 18:15:26

0

如果你想统计系统使用次数,建议你应该使用静态变量。

private static int smartCtr = 0; 
private static int globeCtr = 0; 
private static int sunCtr = 0; 
+0

嗨,这工作,但我正在寻找一种方法,不使用Servlet本身的实例变量。 – silver 2014-09-26 02:41:47

+0

这意味着你不想将任何东西存储到服务器端,并且还使用不同的会话来计算使用系统的时间数量是否正确? – wittakarn 2014-09-26 03:01:19