문제

I print a list directly in the servlet using the print writer and the list prints.

When I try to put in the jsp however the list doesn't print whether I use JSTL or scriptlets.

I tried to test in JSTL and scriptlet if the object is null and turns out that it is!

Why does this happen and how can I fix this?

Servlet code that works

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

Servlet code that puts object in the request

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

scriptlet code that suddenly finds the object null

<% 

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

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

Even the jstl code seems to agree

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

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

For my app I am using weblogic, spring 2.5.6 and ibatis.

도움이 되었습니까?

해결책 3

I just discovered inadvertently while trying to fix my directory structure in WebContent/

My previous directory structure was

WEB-CONTENT/
    - META-INF/
    - WEB-INF/
    index.jsp

Then I tried to create a folder jsp in WEB-CONTENT and placed index.jsp there. It works!

My current directory structure now is

WEB-CONTENT/
    - META-INF/
    - WEB-INF/
    - jsp/
        -index.jsp

I don't know why it works but it did.

Anyone here with any idea why?

다른 팁

I think it depends on the web server. But without changing your previous directory structure,

try putting the list in session like this

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

and in your jsp,

write

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

I think my approach will work for all web servers.

Maybe the app server is resetting your request object. You can work around this by creating a new request object, that wraps your original request, and pass that to the reqest dispatcher.

e.g. MyHttpRequest myRequest = new MyHttpRequest(req); myRequest.setAttribute(...); req.getRequestDispatcher("index.jsp").forward(myRequest, resp);

And the MyHttpReqest code:

   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 
   }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top