Galera, comecei a estudar Java web faz algumas semanas. Como tive problemas com os livros, acabei ficando com o "Essential JEE", que é bem seco, sem passo-a-passo.
Na parte de web conheço mais o funcionamento do Django (MVC), então acredito que o problema deve ser relacionado a alguma configuração ou ao esquema request-response em Java.
Container: WildFly 8
IDE: Eclipse
Java 7
web.xml (a parte relevante)
<servlet> <servlet-name>QuadFactorialServlet</servlet-name> <jsp-file>/WEB-INF/jsps/QuadFactorial.jsp</jsp-file> </servlet> <servlet-mapping> <servlet-name>QuadFactorialServlet</servlet-name> <url-pattern>/QuadFactorial</url-pattern> </servlet-mapping>
QuadFactorial.jsp (em WebContent/WEB-INF/jsps)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form id="fac" method="POST" action="${pageContext.request.contextPath}/QuadFactorial"> <label for="number">Informe n:</label> <input id="number" name="number" type="text"/> <input type="submit" value="Enviar" name="submit"/> </form> </body> </html>
QuadFactorialServlet.java
import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name="QuadFactorialServlet") public class QuadFactorialServlet extends HttpServlet { private static final long serialVersionUID = 1L; /* http://introcs.cs.princeton.edu/java/91float/Gamma.java.html */ private static double logGamma(double x) { double tmp = (x - 0.5) * Math.log(x + 4.5) - (x + 4.5); double ser = 1.0 + 76.18009173 / (x + 0) - 86.50532033 / (x + 1) + 24.01409822 / (x + 2) - 1.231739516 / (x + 3) + 0.00120858003 / (x + 4) - 0.00000536382 / (x + 5); return tmp + Math.log(ser * Math.sqrt(2 * Math.PI)); } private static double gamma(double x) { return Math.exp(logGamma(x)); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map<String, String[]> m = request.getParameterMap(); PrintWriter pr = response.getWriter(); String message = ""; if (m.size() > 0) { int n = Integer.parseInt(m.get("number")[0]); if (n < 0) { message = "O número deve ser maior ou igual a zero."; } else { /*double f = gamma(n+1+n)/gamma(n+1); message = Double.toString(f);*/ } } } }
A ideia era aceitar um inteiro via formulário e calcular o fatorial quádruplo desse número (por enquanto não estou querendo fazer redirects,forwards nem imprimir texto no JSP. Poderia até ser no console do servidor). Mas o problema é que, mesmo definindo um breakpoint, quando dou 'Debug As' no jsp dentro da IDE, a página é exibida quando requisição = GET (http://localhost:8080/jee_exp/QuadFactorial) e não acontece nada quando requisição = POST.
Fui dar uma olhada no valor interpolado no fonte da página e está /jee_exp/QuadFactorial. Então achei que, por algum motivo estranho, a requisição poderia ser um GET, então adicionei um doGet, botei um breakpoint lá e abri o DevTools no Chrome. Não. É um POST mesmo e continua não chegando ao breakpoint no método doPost (1a linha).
Também achei que fosse a falta do @Override no método. Com ou sem, continua dando problema.
Alguém sabe me dizer o que está acontecendo?
OFF: Pelo que já li, os servlets+web.xml com o mapeamento do jsp são quase a mesma coisa que as class-based views do Django (p/ quem não conhece: https://docs.djangoproject.com/en/1.8/topics/class-based-views/). Esse está sendo meu modelo de comparação.
UPDATE 15/06/2015
Resolvi criar um segundo servlet chamado TestPostServlet, associado ao url /testPost. Alterei a action do meu formulário p/ ${pageContext.request.contextPath}/testPost. Agora o doPost do novo servlet é chamado.
Então fica a pergunta: como faço p/ que o mesmo Servlet processe ambas as requisições (GET e POST) a partir do mesmo JSP? É necessário configurar algo a mais?