2014-05-10 21 views
0

我是Jsp的新成員,並使用Servlet和Listener開始一些測試。 我的問題是爲什麼當我啓動ListenTest.do時,我得到一個HTTP狀態404 - /DynamicExample/ListenTest.do?ServletContentListener中的ArrayList

我想要做的是聲明多個狗對象,並把它放在一個ArrayList中。當所有對象都存儲到ArrayList中時,那麼「MyServletContextListener.java」會設置屬性「dog」。完成之後,我會將屬性發送到我的index.jsp頁面,但是我得到的404文件不是fount。

ListenTester.java

package com.app.control; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import com.app.model.Dog; 

public class ListenerTester extends HttpServlet { 

    public void doGet (HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { 
     Dog dog = (Dog) getServletContext().getAttribute("dog"); 
     RequestDispatcher forwardToLoginPage = req.getRequestDispatcher("index.jsp"); 
     forwardToLoginPage.forward(req, resp); 
    } 
} 

MyServletContextListener.java

package com.app.listener; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 

import com.app.model.Dog; 

public class MyServletContextListener implements ServletContextListener { 

    ArrayList<Dog> allDogs; 

    public void contextInitialized(ServletContextEvent event) { 
     if (allDogs == null) { allDogs = new ArrayList<Dog>(); } 
     allDogs = (ArrayList<Dog>) event.getServletContext().getAttribute("dog"); 

     Dog d1 = new Dog("SomeThing"); 
     Dog d2 = new Dog("someThing"); 
     allDogs.add(d1); 
     allDogs.add(d2); 
     event.getServletContext().setAttribute("dog", allDogs); 
    } 

    public void contextDestroyed(ServletContextEvent event) { 
     // nothing to do here 
    } 
} 
+0

你可以發佈你的錯誤頁面截圖和你的web.xml – cafebabe1991

回答

2

ArrayList<Dog>不能轉換到Dog


你設置它ServletContext如下圖所示

allDogs = new ArrayList<Dog>(); 
... 
event.getServletContext().setAttribute("dog", allDogs); 

現在你取回如下圖所示

Dog dog = (Dog) getServletContext().getAttribute("dog");//the problem is here 

應該

ArrayList<Dog> dogs = (ArrayList<Dog>) getServletContext().getAttribute("dog"); 

做它用這種方式來避免NullPointerException

public void contextInitialized(ServletContextEvent event) { 
    //if (allDogs == null) { allDogs = new ArrayList<Dog>(); } //move this line below 
    allDogs = (ArrayList<Dog>) event.getServletContext().getAttribute("dog"); 
    if (allDogs == null) { allDogs = new ArrayList<Dog>(); } 
    ... 
} 

不需要在請求中設置「dog」屬性,因爲它已被添加爲會話屬性。 index.jsp的

示例代碼:

<%@ page import="java.util.ArrayList,com.x.y.z.Dog" %> 
<% 
    ArrayList<Dog> dogs = (ArrayList<Dog>) session.getAttribute("dog"); 
    for(Dog dog:dogs){ 
     out.println(dog.getName()); 
    } 
%> 

注:使用JavaServer Pages Standard Tag Library代替Scriplets

+0

Okey,現在我的404文件找不到錯誤消失了,但是當我將索引頁面中的這個屬性取出信息時,它將是「null」。 <%String message =(String)request.getAttribute(「dog」); %> <%= message%> – CodeWhisperer

+0

因爲您沒有在請求屬性中設置。你剛剛進入了'doGet()',但卻無所作爲。 – Braj

+0

請你能告訴我。你想在你的jsp上展示多少條狗? – Braj