Introdução
Você deve usar doGet()
quando quiser interceptar em solicitações HTTP GET . Você deve usar doPost()
quando quiser interceptar em solicitações HTTP POST . Isso é tudo. Não transfira um para o outro ou vice-versa (como no processRequest()
método infeliz de geração automática do Netbeans ). Isso não faz muito sentido.
OBTER
Normalmente, as solicitações HTTP GET são idempotentes . Ou seja, você obtém exatamente o mesmo resultado toda vez que executa a solicitação (deixando a autorização / autenticação e a natureza sensível ao tempo da página - resultados da pesquisa, últimas notícias, etc - sem consideração). Podemos falar sobre um pedido que pode ser marcado. Clicar em um link, clicar em um favorito, inserir o URL bruto na barra de endereço do navegador, etc., tudo disparará uma solicitação HTTP GET. Se um Servlet estiver escutando na URL em questão, seu doGet()
método será chamado. Geralmente é usado para pré - processar uma solicitação. Ou seja, fazendo algumas coisas de negócios antes de apresentar a saída HTML de um JSP, como reunir dados para exibição em uma tabela.
@WebServlet("/products")
public class ProductsServlet extends HttpServlet {
@EJB
private ProductService productService;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Product> products = productService.list();
request.setAttribute("products", products); // Will be available as ${products} in JSP
request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
}
}
<table>
<c:forEach items="${products}" var="product">
<tr>
<td>${product.name}</td>
<td><a href="product?id=${product.id}">detail</a></td>
</tr>
</c:forEach>
</table>
Além disso, os links para visualizar / editar detalhes, conforme mostrado na última coluna acima, geralmente são idempotentes.
@WebServlet("/product")
public class ProductServlet extends HttpServlet {
@EJB
private ProductService productService;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Product product = productService.find(request.getParameter("id"));
request.setAttribute("product", product); // Will be available as ${product} in JSP
request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response);
}
}
<dl>
<dt>ID</dt>
<dd>${product.id}</dd>
<dt>Name</dt>
<dd>${product.name}</dd>
<dt>Description</dt>
<dd>${product.description}</dd>
<dt>Price</dt>
<dd>${product.price}</dd>
<dt>Image</dt>
<dd><img src="productImage?id=${product.id}" /></dd>
</dl>
POSTAR
As solicitações HTTP POST não são idempotentes. Se o usuário final enviou um formulário POST em um URL anteriormente, o que não executou um redirecionamento, então o URL não é necessariamente favorito. Os dados do formulário enviado não são refletidos no URL. Copiar o URL em uma nova janela / guia do navegador pode não necessariamente produzir exatamente o mesmo resultado que após o envio do formulário. Assim, esse URL não pode ser marcado. Se um Servlet estiver ouvindo na URL em questão, ele doPost()
será chamado. Geralmente é usado para pós - processar uma solicitação. Ou seja, coletar dados de um formulário HTML enviado e fazer algumas coisas de negócios com ele (conversão, validação, salvamento em banco de dados, etc.). Finalmente, geralmente o resultado é apresentado como HTML da página JSP encaminhada.
<form action="login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="login">
<span class="error">${error}</span>
</form>
... que pode ser usado em combinação com este pedaço de Servlet:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@EJB
private UserService userService;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user);
response.sendRedirect("home");
}
else {
request.setAttribute("error", "Unknown user, please try again");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
}
Veja, se o User
for encontrado no banco de dados (ou seja, nome de usuário e senha são válidos), então o User
será colocado no escopo da sessão (ou seja, "conectado") e o servlet irá redirecionar para alguma página principal (este exemplo vai para http://example.com/contextname/home
), caso contrário ele definirá uma mensagem de erro e encaminhará a solicitação de volta para a mesma página JSP para que a mensagem seja exibida ${error}
.
Você também pode, se necessário, "ocultar" o login.jsp
in de /WEB-INF/login.jsp
modo que os usuários só possam acessá-lo pelo servlet. Isso mantém o URL limpo http://example.com/contextname/login
. Tudo que você precisa fazer é adicionar um doGet()
ao servlet assim:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}
(e atualize a mesma linha de doPost()
acordo)
Dito isso, não tenho certeza se é apenas brincar e atirar no escuro, mas o código que você postou não parece bom (como usar em compareTo()
vez de equals()
e cavar os nomes de parâmetros em vez de apenas usar getParameter()
e o id
e password
parece ser declarados como variáveis de instância de servlet - que NÃO é threadsafe ). Portanto, eu recomendo fortemente aprender um pouco mais sobre a API Java SE básica usando os tutoriais Oracle (consulte o capítulo "Trilhas que cobrem o básico") e como usar JSP / Servlets da maneira certa usando esses tutoriais .
Veja também:
Atualização : conforme a atualização da sua pergunta (o que é muito importante, você não deve remover partes da sua pergunta original, isso tornaria as respostas inúteis .. em vez disso, adicione as informações em um novo bloco), acontece que você configurar desnecessariamente o tipo de codificação do formulário para multipart/form-data
. Isso enviará os parâmetros da solicitação em uma composição diferente do (padrão) application/x-www-form-urlencoded
que envia os parâmetros da solicitação como uma string de consulta (por exemplo name1=value1&name2=value2&name3=value3
). Você só precisa multipart/form-data
sempre que tiver um<input type="file">
elemento no formulário para fazer upload de arquivos que podem ser dados sem caracteres (dados binários). Este não é o seu caso, apenas remova-o e ele funcionará conforme o esperado. Se você alguma vez precisar fazer upload de arquivos, terá que definir o tipo de codificação dessa forma e analisar o corpo da solicitação você mesmo. Normalmente você usa o Apache Commons FileUpload lá para, mas se você já está usando a nova API Servlet 3.0, então você pode apenas usar os recursos integrados começando com HttpServletRequest#getPart()
. Veja também esta resposta para um exemplo concreto: Como fazer upload de arquivos para o servidor usando JSP / Servlet?