【问题标题】:Persisting Data Using Hidden Forms in JSP在 JSP 中使用隐藏表单持久化数据
【发布时间】:2014-11-20 23:10:18
【问题描述】:

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



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

谢谢。

【问题讨论】:

    标签: java jsp session servlets hidden-field


    【解决方案1】:

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

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

    【讨论】:

    • 您好,这可行,但我正在寻找一种不在 Servlet 本身中使用实例变量的方法。
    • 这意味着你不想在服务器端存储任何东西,并且还使用不同的会话来计算使用你的系统的次数对吗?
    【解决方案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);
      .....
    }
    

    【讨论】:

    • 您好,只是跟进一下,我什么时候使用 getSession(true) 与 getSession()?
    • 嗯,它们之间没有任何区别。 getsession() 是 getSession(true) 的简短版本。所以这取决于你的喜好.. :)
    • 我读到here getSession(true) 将始终返回一个新会话,而 getSession() 将返回现有会话(如果有),否则将返回一个新会话(如果没有)。
    • 根据 HTTREQUEST java doc,它说它返回关联的会话,如果没有则创建新的:docs.oracle.com/javaee/6/api/javax/servlet/http/…
    • 当您有疑问时,最好将您的参考资料与 Java 文档进行交叉检查... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多