HttpServletRequest突然丢失了对象

时间:2010-05-17 07:29:37

标签: java java-ee weblogic java-ee-5

我使用print writer直接在servlet中打印一个列表并打印列表。

当我尝试输入jsp时,列表不会打印我是否使用JSTL或scriptlet。

我尝试在JSTL和scriptlet中测试该对象是否为空,结果证明它是!

为什么会发生这种情况,我该如何解决这个问题?

可行的Servlet代码

for (Artist artist:artists){
    resp.getWriter().println(artist.getName());
}

将对象放入请求的Servlet代码

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();
    }

突然发现对象为null的scriptlet代码

<% 

    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代码也似乎同意

<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。

3 个答案:

答案 0 :(得分:1)

也许应用服务器正在重置您的请求对象。您可以通过创建一个包含原始请求的新请求对象来解决此问题,并将其传递给reqest调度程序。

e.g。     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 
   }

答案 1 :(得分:1)

我认为这取决于网络服务器。但是,如果不改变以前的目录结构,

尝试将列表放在会话中

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

并在你的jsp中,

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

我认为我的方法适用于所有网络服务器。

答案 2 :(得分:0)

我在尝试修复WebContent /

中的目录结构时无意中发现了

我之前的目录结构是

网络内容/
- META-INF /
- WEB-INF /
index.jsp

然后我尝试在WEB-CONTENT中创建一个文件夹jsp并将index.jsp放在那里。它有效!

我现在的目录结构是

网络内容/
- META-INF /
- WEB-INF /
- jsp /
-index.jsp

我不知道它为什么会起作用,但确实如此。

任何人都知道为什么?