Quantcast
Channel: Últimos conteúdos
Viewing all articles
Browse latest Browse all 14190

JSP + Servlet : doPost não é executado ao postar p/ mesmo JSP

$
0
0

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?


Viewing all articles
Browse latest Browse all 14190