0

我必须通过网站的控制面板提交一些链接,它们应该会自动出现在 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

豆类

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 中的数据是如何丢失的?

4

3 回答 3

0

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

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

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

于 2012-08-24T10:10:23.463 回答
0

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

于 2012-08-20T17:46:03.607 回答
0

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

于 2012-08-20T18:05:54.537 回答