我刷新页面一两次后没有看到提交的数据:ArrayList如何自己变空?

时间:2012-08-20 17:41:25

标签: java jsp arraylist

我必须通过网站的控制面板提交一些链接,它们应该自动出现在jsp页面中,下次用户刷新它。为此,我在粘贴链接后点击提交按钮,发布请求生成并且servlet通过从自身调用bean的函数来处理链接,并将链接存储在ArrayList中。

来自servlet的

片段

   protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
   String link = request.getParameter("song link");
   StoreSongLink store = new StoreSongLink(); // A Bean class
   int ret = store.storeSongLink(link); // calls the bean method
   // if ret is 0,return to the cpanel home page

Bean类

public class StoreSongLink {
public static ArrayList<String> linkList = new ArrayList<String>();

 public int storeSongLink(String link) {
    linkList.add(link);
    return 0;
 }   
}

在此之后,我尝试以(在jsp页面中)获取提交的链接:

        <%! ArrayList<String> songList = new ArrayList<String>(); %>

       <%
           songList = StoreSongLink.linkList;
       %> 

       <% for (String links : songList){ %>
             <li><%= links%></li>
       <%}%>

我看到链接提交了一两次,然后刷新同一页面后消失了,我看到的消息还没有提交任何链接!为什么会这样?我知道这可能不是最好的方法,但我仍然想这样做。

为什么我刷新页面后看不到提交的链接?如何从ArrayList中丢失数据?

3 个答案:

答案 0 :(得分:0)

您在servlet中创建的StoreSongLink对象的范围仅限于该特定调用。您在哪里存储此对象或其内容?您需要将它放在会话中或数据库中,具体取决于您期望的功能。

答案 1 :(得分:0)

看起来您希望每个会话实例化一次SongStoreLink。在创建对象之前,您应该从会话中检索它,如果找到一个,则使用它,否则创建对象并将其保存在会话中。

答案 2 :(得分:0)

从会话或类似的东西中获取StoreSongLink实例。

StoreSongLink store = (StoreSongLink)request.getSession().getAttribute("storeSongLink");
if (store == null)
{
   store = new StoreSongLink();
   request.getSession().setAttribute("storeSongLink", store);
}

或者,您可以使用单例模式来创建/获取StoreSongLink实例。 此外,重要的是重构storeSongLink方法并避免JSP中的scriptlet。有很多框架可以分离代码和布局。