使用$ request.session.setAttribute存储下拉列表的设置

时间:2010-01-22 02:03:24

标签: jsp velocity

我正在尝试存储一个下拉菜单设置,该设置控制在名单中显示的项目数量。我该怎么做呢?下拉列表使用onChange对名单的结果进行排序。

1 个答案:

答案 0 :(得分:1)

我不做Velocity,所以这是一个以JSP / Servlet为目标的答案。我想你也在使用Servlets,因为Velocity实际上是一个模板引擎,并且无法控制/预处理/后处理请求。

所以你想在后续请求中保留某些数据?基本上有两种方法可以达到这个目的。

  1. 在隐藏的输入元素中保留后续请求的值。 E.g。

    <form action="servlet" method="post">
        <select name="itemcount" onchange="submit()">
            <option>1</option><option>2</option><option>3</option>
        </select>
    </form>
    

    然后以下一个请求的形式:

    <form action="servlet" method="post">
        <select name="sortfield" onchange="submit()">
            <option>col1</option><option>col2</option><option>col3</option>
        </select>
        <input type="hidden" name="itemcount" value="${param.itemcount}">
    </form>
    

    ${param.itemcount}基本上会返回request.getParameter("itemcount")。当存储在隐藏的输入元素中时,您什么也看不到,但在下一个请求中request.getParameter("itemcount")也可以使用它。

  2. 将值存储在会话中。例如。在servlet中:

    Integer itemcount = Integer.valueOf(request.getParameter("itemcount"));
    request.getSession().setAttribute("itemcount", itemcount);
    

    以便您可以在需要时在同一会话中运行的任何servlet中访问它:

    Integer itemcount = (Integer) request.getSession().getAttribute("itemcount");
    

    但这有一个重要的警告:这可能导致“wtf?”当用户在同一会话中打开多个窗口并在两个窗口中选择不同的项目数时的体验。窗口A中最后选择的值将反映到窗口B中!

  3. 我认为很明显你应该在请求范围内保留请求范围的数据,所以更喜欢方式1。仅使用会话 作为会话范围数据。