我必须通过网站的控制面板提交一些链接,它们应该自动出现在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中丢失数据?
答案 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。有很多框架可以分离代码和布局。