2010-05-17 130 views
4

我使用打印作者和列表打印直接在servlet中打印列表。突然從HttpServletRequest丟失的對象

當我嘗試放入jsp時,不管打印列表是否使用JSTL或scriptlet。

我試圖在JSTL和scriptlet中進行測試,如果對象爲空,結果是它!

爲什麼會發生這種情況,我該如何解決這個問題?

servlet代碼,工程

for (Artist artist:artists){ 
    resp.getWriter().println(artist.getName()); 
} 
是把對象請求

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws IOException {   

    ApplicationContext ctx = 
     new ClassPathXmlApplicationContext("com/helloworld/beans/helloworld-context.xml"); 

    ArtistDao artistDao = (ArtistDao) ctx.getBean("artistDao"); 
    List<Artist> artists = null; 
    try { 
     artists = artistDao.getAll(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

    req.setAttribute("artists", artists); 

    try { 
     req.getRequestDispatcher("index.jsp").forward(req, resp); 
    } catch (ServletException e) { 
     e.printStackTrace(); 
    } 

小腳本代碼,突然發現該物體空

<% 

    List<Artist> artists = (List<Artist>) request.getAttribute("artists"); 

    if (artists == null) { 
     out.println("artists null"); 
    } 
    else { 
     for (Artist artist: artists){ 
      out.println(artist.getName()); 
     } 
    } 
%> 

即使JSTL代碼似乎

servlet代碼同意

<c:if test="${artists eq null}"> 
    Artists are null 
</c:if> 

<c:forEach var="artist" items="${artists}"> 
${artist.name} 
</c:forEach> 

對於我的應用程序,我使用的是weblogic,spring 2.5.6和ibatis。

+0

你有機會嘗試不同的應用程序服務器嗎?我沒有看到代碼的任何問題 - setAttribute/requestDispatch是一種常見模式。 – mdma 2010-05-17 07:46:40

+0

我需要在工作中使用weblogic,但我會嘗試在tomcat中測試。和你一樣,我一直認爲這是應用服務器的問題。 – Jeune 2010-05-17 07:49:45

回答

0

我只是無意中發現,同時試圖修復中的WebContent我的目錄結構/

我以前的目錄結構爲

網絡內容/
        - META-INF/
        - WEB-INF/
       的index.jsp

然後我試圖創建網絡的內容的文件夾jsp和放置的index.jsp那裏。有用!

現在我的當前目錄結構是

網絡內容/
        - META-INF/
        - WEB-INF/
        - JSP/
                -index.jsp

我不知道爲什麼它的工作原理,但它沒有。

任何人在這裏與任何想法爲什麼?

+0

嗨,你應該把這個添加到你原來的問題中,而不是回答你自己的問題。 – mdma 2010-05-18 04:38:54

+0

或者,也許我應該發佈一個新的問題=)) – Jeune 2010-05-18 05:27:15

1

也許應用程序服務器正在重置您的請求對象。你可以通過創建一個新的請求對象來解決這個問題,該請求對象封裝了原始請求,並將其傳遞給請求調度器。

例如 MyHttpRequest myRequest = new MyHttpRequest(req); myRequest.setAttribute(...); req.getRequestDispatcher(「index.jsp」)。forward(myRequest,resp);

而且MyHttpReqest代碼:

class MyHttpRequest extends HttpServletRequestWrapper 
    { 
     Map attributes = new HashMap(); 
     MyHttpRequest(HttpRequest original) { 
     super(original); 
     } 
     @Override 
     public void setAttribute(Object key, Object value) { 
      attributes.put(key, value); 
     } 

     public Object getAttribute(Object key) { 
      Object value = attributes.get(key); 
      if (value==null) 
       value = super.getAttribute(key); 
      return value; 
     } 

     // similar for removeAttribute 
    } 
+0

如何不讓應用程序服務器重置我的請求對象? – Jeune 2010-05-17 08:37:44

+0

我不知道。這並不意味着,我只是猜測這是問題所在 - 我無法訪問要測試的weblogic實例。你可以試試我發佈的代碼嗎?然後,您可以調試並檢查您是否在JSP中獲得了相同的MyHttpRequest實例。 – mdma 2010-05-17 08:45:52

+0

嘗試了您的解決方法。輸出仍然是一樣的。 @ - ) – Jeune 2010-05-17 08:51:50

1

我認爲這取決於網絡服務器。但是,如果沒有改變你以前的目錄結構,

嘗試將列表中的會話這樣

req.getSession(false).setAttribute("artists", artists); 

,並在你的JSP,

List<Artist> artists = (List<Artist>) request.getSession(false).getAttribute("artists"); 

我覺得我的做法會工作適用於所有Web服務器。

+0

我也試過這個,但它沒有與上面的第一個目錄結構太。這真令人沮喪!現在你已經提到了會話,如果會話與上面的第二個目錄結構一起工作,我還沒有嘗試過。 問題與你masy問的目錄結構有什麼關係?相信我,我沒有看到相關性,但它的工作原理。 @ - ) – Jeune 2010-05-17 13:28:37