Объект внезапно отсутствует в HttpServletRequest - PullRequest
4 голосов
/ 17 мая 2010

Я печатаю список прямо в сервлете, используя программу печати, и список печатается.

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

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

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

Код сервлета, который работает

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

код скриптлета, который неожиданно находит объект 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.

Ответы [ 3 ]

1 голос
/ 17 мая 2010

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

попробуйте поместить список в сессию, как это

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

и в вашем jsp

написать

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

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

1 голос
/ 17 мая 2010

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

например. MyHttpRequest myRequest = new MyHttpRequest (req); myRequest.setAttribute (...); req.getRequestDispatcher ("index.jsp"). forward (myRequest, соответственно);

И код 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 голосов
/ 17 мая 2010

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

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

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

Затем я попытался создать папку jsp в WEB-CONTENT и поместил туда index.jsp. Это работает!

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

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

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

Кто-нибудь здесь с какой-либо идеей, почему?

...