2010-05-17 30 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