2010-05-17 7 views
4

Я печатаю список непосредственно в сервлете, используя печатающий аппарат и распечатывает список.Объект, внезапно отсутствующий в HttpServletRequest

Когда я пытаюсь поместить в jsp, однако список не печатает, использую ли я JSTL или скриптлеты.

Я попытался проверить в JSTL и скриптлет, если объект имеет значение null и получается, что он есть!

Почему это происходит и как я могу это исправить?

код

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

<% 

    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, весна 2.5.6 и ibatis.

+0

Есть ли у вас шанс попробовать другой сервер приложений? Я не вижу никаких проблем с кодом - setAttribute/requestDispatch - общий шаблон. – mdma

+0

Я должен использовать weblogic здесь на работе, но я попробую тестировать в tomcat. Как и вы, я думал, что это проблема с сервером приложений. – Jeune

ответ

0

Я только что обнаружил, неосторожно пытаясь исправить свою структуру каталогов в WebContent/

Моя предыдущая структура каталога была

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

Затем я попытался создать JSP папки в WEB-СОДЕРЖАНИЯ и поместили index.jsp там. Оно работает!

Моя текущая структура каталогов теперь

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

Я не знаю, почему это работает, но это сделал.

Любой, у кого есть идеи, почему?

+0

Привет, вам, вероятно, следует добавить это в свой первоначальный вопрос, вместо того, чтобы отвечать на свой вопрос. – mdma

+0

Или, может быть, я должен написать новый вопрос =)) – Jeune

1

Возможно, сервер приложений сбросит ваш объект запроса. Вы можете обойти это, создав новый объект запроса, который обертывает ваш первоначальный запрос и передает его диспетчеру reqest.

например. 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

+0

Не знаю. Это не значит, и я только предполагаю, что это проблема - у меня нет доступа к экземпляру веб-журнала для тестирования. Можете ли вы попробовать код, который я разместил? Затем вы можете отлаживать и проверять, что вы получаете тот же экземпляр MyHttpRequest в своем JSP. – mdma

+0

Пробовал обходное решение. Выходные данные все те же. @ -) – Jeune

1

Я думаю, что это зависит от веб-сервера. Но без изменения предыдущей структуры каталогов,

попытайтесь поместить список в сессии, как этот

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

и в вашем JSP,

записи

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

Я думаю, что мой подход будет работать для всех веб-серверов.

+0

Я тоже это пробовал, но он не работал с первой структурой каталогов выше. Это было очень неприятно!Теперь, когда вы упомянули сеанс, я не пробовал, если сеанс работает со второй структурой каталогов выше. В чем проблема, связанная с структурой каталогов, которую вы задаете? Поверьте, я тоже не вижу корреляции, но он работает. @ -) – Jeune