Formulário gravar dados em arraylist

Crie um formulario html5 em que uma pessoa possa digitar nome, telefone e e-mail. Faça-o chamar um servlet (via POST) para gravar os dados em memória. Guarde os registros em uma estrutura de dados Arraylist. Se o Servlet for chamado diretamento (via GET), deve exibir uma tabela com os dados.

Meus códigos:

<head>
    <title>Form</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <h1>Input your information:</h1>
  <form action="ProcessForm.do" method="POST">
      Name: <input type="text" name="name" size="20"><br>
      Email: <input type="text" name="email" size="20"><br>
      Phone <input type="text" name="phone" size="20"><br>

      <p><input type="submit" value="Send"></p>
  </form>

</body>

e

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProcessForm extends HttpServlet {

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {                    
            ServletOutputStream out = res.getOutputStream();
    res.setContentType("text/html");                  

    String name = req.getParameter("name");
    String email = req.getParameter("email");
    String phone = req.getParameter("phone");

    out.println("<html><head><title>Servlet answers</title></head>");
    out.println("<body>");
    out.println("Hello " + name);
    out.println("Your email is: " + email );
    out.println("Your phone number is: " + phone );

    out.println("</body></html>");
}

}

Que modificações eu deveria fazer?

1 - Criar uma classe Pessoa

public class Pessoa {
    String nome;
    String email;
    String pone;
}

2 - Criar um atributo static List pessoas = new ArrayList()/ na servilet
3 - Alterar o método doPost para que, a cada requisição, insira uma nova pessoa na lista pessoas
4 - Adicionar o método doGet, retornando a tabela com os itens que estão no array

Muito obrigada pela ajuda! Mas não sei fazer isso que você citou na 3 e 4.
3 - Alterar o método doPost para que, a cada requisição, insira uma nova pessoa na lista pessoas
4 - Adicionar o método doGet, retornando a tabela com os itens que estão no array
Algum tutorial ou código que poderia me ajudar?

vc disse que não sabe o item 3, é simples, faz como o @darlan_machado indicou. crie a classe Pessoa()
em vez de vc armazenar em uma string name, email e pone, vc deve instanciar um objeto tipo Pessoa():

Pessoa pessoa = new Pessoa();
pessoa.setName(name)...

só acho… não sei java EE

Vamos por partes.
Você conseguiu criar a classe Pessoa?
Conseguiu criar o atributo pessoas, como static (se não for static, cada vez que invocar a servlet, os dados anteriores são perdidos).

Eu coloquei esse dois trechos que você postou! Coloquei no servlet mas apareceu como errado!

public class Pessoa {
String nome;
String email;
String phone;

}
static List pessoas = new ArrayList();

Ao lado do static aparece:

Cannot find symbol
symbol class List
Location: class ProcessaFormulario

Cannot find symbol
symbol class Arraylist
Location: class ProcessaFormulario

Só colocando
import java.util.ArrayList;
import java.util.List;
que o erro some

Quanto você sabe de java? Já trabalhou com import?

@darlan_machado, Sei pouco infelizmente, só fiz coisas mais básicas. Pilha, fila mas já faz tempo :frowning: E nunca mexi com servlet!
Realmente preciso entender como funciona esse código!

O problema nem é a servlet em si, o problema está em não saber usar um import.

O java é construído sobre certos padrões. Um deles diz respeito à maneira como os arquivos (códigos fonte) são organizados. Esta organização é feita em pacotes (packages).
O objetivo de um package é agrupar classes que tenham relação entre si. Por exemplo, a classe String, do java, está no package java.lang. Assim como as classes Object, Integer e Float.
Tudo o que está no package java.lang não precisa ser importado. Estará disponível em todo e qualquer lugar que você queira utilizar os mesmos.
Porém, quando você precisa utilizar algo de um package que não é o java.lang, nem o package onde você está trabalhando atualmente.
Como a interface List e a classe ArrayList estão no package java.util, você precisa dizer ao java onde eles se encontram. Para isso, você usa a instrução import:

import java.util.List;

E esta linha deve, sempre, ficar antes da declaração

public class ProcessForm extends HttpServlet 

Como você pode ver no código que postou.

Agora, é de fundamental importância que você estude. Senão, vai sofrer bastante.

1 curtida

@darlan_machado Eu tenho certa noção de onde inserir o import mas nem sempre sei quando devo.

O código tá assim:

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProcessaFormulario extends HttpServlet {
public class Pessoas {
String nome;
String email;
String phone;
}
static List pessoas = new ArrayList();

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {
            
            ServletOutputStream out = res.getOutputStream();
  res.setContentType("text/html"); 
  
  String name = req.getParameter("name");
  String email = req.getParameter("email");
  String phone = req.getParameter("phone");
            
  out.println("<html><head><title>Resp do Servlet</title></head>");
  out.println("<body>");
  out.println("Hello " + name);
  out.println("Your email is: " + email );
  out.println("Your phone number is: " + phone );
  
  out.println("</body></html>");
}

}

As informações já estão no arraylist? Como eu disse anteriormente, essas duas coisa não sei como começar…

Mas uma vez, obrigada pela ajuda! Estou assistindo alguns tutoriais mas nenhum tá servindo pra esse caso específico, tô quase desistindo!

Vamos lá.
Você está usando alguma IDE (eclipse ou netbeans)?
Se sim, sempre que você tiver dúvidas se deve ou não importar, a IDE notifica, sublinhando em vermelho que alguma coisa está errada.
Se estiver em dúvida, cada IDE possui teclas de atalho para, automaticamente, adicionar os imports necessários.
No caso do Eclipse, é CTRL + O. O netbeans, se não mudou, é CTRL + i

Se você fez os passos 1 e 2, fica fácil:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {                    
        ServletOutputStream out = res.getOutputStream();
    res.setContentType("text/html");                  
    String name = req.getParameter("name");
    String email = req.getParameter("email");
    String phone = req.getParameter("phone");

    //Este trecho deve ser adicionado
    Pessoa p = new Pessoa(); //Instancia pessoa
    p.nome = name; //Se souber usar getters/setters, pode substituir essa linha por p.setNome(name);
    p.email = email;
    p.phone = phone;
    pessoas.add(p); //Inserindo o objeto na lista
}

E o método doGet fica, mais ou menos, assim:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    StringBuffer saida = new StringBuffer();
    saida.append("<html>");
    saida.append("<head>");
    saida.append("</head>");
    saida.append("<body>");
    saida.append("<table>");
	saida.append("<thead>");
	saida.append("<tr>");
	saida.append("<th>Nome</th>");
	saida.append("<th>Email</th>");
	saida.append("<th>Phone</th>");
	saida.append("<tr>");
	saida.append("</thead>");
	saida.append("<tbody>");
    for(Pessoa p : pessoas) {
	    saida.append("<tr>");
		saida.append("<td>" + p.nome + "</td>");
		saida.append("<td>" + p.email + "</td>");
		saida.append("<td>" + p.phone + "</td>");
		saida.append("</tr>");
	}
	saida.append("</tbody>");
	saida.append("</table>");
	saida.append("</body>");
	saida.append("</html>");
    out.println(saida.toString());
    out.close();
}
1 curtida

Releia a minha resposta anterior.

Eu esqueci de dizer, estou usando o netbeans!
Meu código ficou assim:

import static java.lang.System.out;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProcessaFormulario extends HttpServlet {
public class Pessoas {
String name;
String email;
String phone;
}
static List <pessoas> = new ArrayList();

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {
            
            ServletOutputStream out = res.getOutputStream();
  res.setContentType("text/html"); 
  
  String name = req.getParameter("name");
  String email = req.getParameter("email");
  String phone = req.getParameter("phone");
 
     
    Pessoas p = new Pessoas(); 
    p.name = name; 
    p.email = email;
    p.phone = phone;
    pessoas.add(p); 
  
}

   
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    StringBuffer saida = new StringBuffer();
    saida.append("<html>");
    saida.append("<head>");
    saida.append("</head>");
    saida.append("<body>");
    saida.append("<table>");
	saida.append("<thead>");
	saida.append("<tr>");
	saida.append("<th>Nome</th>");
	saida.append("<th>Email</th>");
	saida.append("<th>Phone</th>");
	saida.append("<tr>");
	saida.append("</thead>");
	saida.append("<tbody>");
    for(Pessoas p : pessoas) {
	    saida.append("<tr>");
		saida.append("<td>" + p.name + "</td>");
		saida.append("<td>" + p.email + "</td>");
		saida.append("<td>" + p.phone + "</td>");
		saida.append("</tr>");
	}
	saida.append("</tbody>");
	saida.append("</table>");
	saida.append("</body>");
	saida.append("</html>");
    out.println(saida.toString());
    out.close();
}
}

O único problema que aparece aqui agora é que quando eu coloco o programa pra executar, preencho o cadastro e clico enviar não aparece nada, fica uma página em branco.

Não é por nada não, mas você deveria estudar o java basico antes de ir para web

Infelizmente não tenho tempo no momento e preciso entender web agora! Mas definitivamente vou voltar e estudar o básico do java.

Sem o básico não irá conseguir progredir na web

A questão com desenvolvimento web é que a estrutura apenas engloba algumas coisas específicas (como requisição e resposta, por exemplo). No mais, é puro java (ou a linguagem que você for utilizar) básico 100%.
Salvo se você opta por um framework, que irá abstrair algumas coisas e deixá-las ocultas.
Mas, como o @Mike disse, é preciso entender o básico, senão você não consegue evoluir.