2014-03-25 30 views
-2

我想從html頁面發送請求到servlet然後在java servlet中創建一個列表然後我想把這個列表返回到同一個html頁面。有沒有辦法從servlet返回一個列表到html頁面

+2

**不要把HTML Java代碼。不要將Java代碼放入HTML中。** –

+1

不要在Servlet中處理狀態,否則會導致線程安全問題。 –

+0

@SotiriosDelimanolis我不會說你永遠不必把HTML代碼放到你的servlet中。相反,我不會說從servlet端處理整個HTML頁面。 –

回答

1

的問題是,你永遠不會初始化HttpSession s變量:

@WebServlet(urlPatterns = {"/ShowPersonServlet"}) 
public class ShowPersonServlet extends HttpServlet { 

    HttpSession s; //null by default 
    //... 

    protected void processRequest(...) { 
     //... 
     //since never initialized, s is null 
     user.add((Person) s.getAttribute("person")); 
    } 

    @Override 
    protected void doGet(...) { 
     //... 
     //since never initialized, s is null 
     s.setAttribute("person",person); 
    } 
} 

化妝它工作解決方案:設置s

s = request.getSession(); 

現實世界解決方案的價值:

  • 刪除 Servlet中的所有字段,從不嘗試處理servlet中的狀態,除非它們是由容器(如EJB)管理的資源。
  • 將您的HttpSession s的範圍更改爲每個方法的本地範圍。另外,將其名稱從s更改爲session或更有用的東西。
  • 將您的HTML代碼移動到處理查看詳細信息(如JSP)的組件,然後執行轉發視圖。

所以,你的代碼應該是這樣的:

@WebServlet(urlPatterns = {"/ShowPersonServlet"}) 
public class ShowPersonServlet extends HttpServlet { 
    /* 
    HttpSession s ; //moved as local variable 
    Person person = new Person(); //moved as local variable 
    private List<Person> user = new ArrayList<Person>(); //not sure where you want to store this 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     HttpSession session = request.getSession(); 
     List<Person> personList = (List<Person>) session.getAttribute("personList"); 
     if (personList == null) { 
      personList = new ArrayList<>(); 
      session.setAttribute("personList", personList); 
     } 
     personList.add((Person) session.getAttribute("person")); 
     /* 
     try (PrintWriter out = response.getWriter()) { 
      //removed to shorten this answer 
     } 
     */ 
     request.getRequestDispatcher("/showPerson.jsp").forward(request, response); 
    } 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     Person person = new Person(); 
     person.setKey(request.getParameter("txt_Key")); 
     person.setFirstName(request.getParameter("txt_firstName")); 
     person.setLastName(request.getParameter("txt_lastName")); 
     processRequest(request, response); 
     HttpSession session = request.getSession(); 
     session.setAttribute("person",person); 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     processRequest(request, response); 
    } 
} 

更多信息:

+0

但如何返回一個列表到HTML頁面打印它?我應該在同一個html頁面中打印所有添加的用戶。 – user3459148

+0

我在這裏得到一個錯誤:if(personList == null){personname = new List <>(); ** session.setAttribute(「personList」,personList);列表是抽象的,不能被實例化。 – user3459148

+0

另外我仍然有錯誤:** NullPointerException()** – user3459148

0

你需要得到來自會話request,你c annot只是期望得到它與HttpSession s ; - 有snull

// Something like this (in processRequest), although I 
// would prefer a local session variable. 
s = request.getSession(); 
0

您需要提供異常的堆棧跟蹤。但它看起來可能在兩個地方:

  1. s.setAttribute(「person」,person); s從未設置;
  2. out.println(「」+ p.getKey()+「」);其中屬性「人」從未設置;

祝你好運。

0

var s的值未定義。它是空的,所以使用s.getAttribute("str")將會拋出異常。

HttpSession s ;

s = request.getSession(false); 
相關問題