4

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

4

1 回答 1

1

我不做 Velocity,所以这里有一个针对 JSP/Servlet 的答案。我想你也在使用 Servlet,因为 Velocity 实际上是一个模板引擎,对控制/预处理/后处理请求没有任何作用。

所以你想在后续请求中保留某些数据?基本上有两种方法可以实现这一点。

  1. 将后续请求的值保留在隐藏的输入元素中。例如

    <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?” 当用户在同一个会话中打开多个窗口并在两个窗口中选择不同的 itemcount 时的体验。窗口 A 中最后选择的值将反映到窗口 B 中!

我认为很明显,您应该将请求范围内的数据保留在请求范围内,因此方式 1 更可取。将会话用于会话范围的数据。

于 2010-01-22T11:20:14.520 回答