SadNess
Novembro 21, 2006, 5:15pm
#1
galera
estou com uma dúvida de como chamar diversos métodos diferentes em um único Controlador, utilizando servlets/jsp
Digamos que eu quisesse que 2 requisições diferentes fossem tratadas no mesmo Controlador (um servlet)
O método que sempre será chamado será o doPost(), logo ele só poderá atender 1 tipo de solicitação
Minha dúvida é:
Eu terei sempre que ter 1 Controlador diferente para cada requisição?
Ou existe alguma boa maneira de fazer com que 1 Controlador seja responsável por diferentes tipos de requisição?
Você Esta usando alguma framework (Struts por exemplo) ?
Se estiver usando Servlet direto pode fazer o seguinte:
public class ControllServlet extends HttpServlet {
private static final long serialVersionUID = -8791581674710726725L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doExecute(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doExecute(request, response);
}
private void doExecute(HttpServletRequest request, HttpServletResponse response) throws ServletException {
String acao = request.getParameter("acao");
Method method;
try {
//Acha o methodo passado pelo paramentro acao
method = this.getClass().getMethod(acao, new Class<?>[] {HttpServletRequest.class, HttpServletResponse.class});
//Invoca este metodo
method.invoke(this, new Object[] {request, response});
} catch (SecurityException e) {
throw new ServletException(e);
} catch (NoSuchMethodException e) {
throw new ServletException(e);
} catch (IllegalArgumentException e) {
throw new ServletException(e);
} catch (IllegalAccessException e) {
throw new ServletException(e);
} catch (InvocationTargetException e) {
throw new ServletException(e);
}
}
//Um exemplo de acao
public void acao1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
//Outro exemplo de acao
public void acao2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
Mapeando este servlet para “servlet/ControllServlet”, a seguinte URL acionara o método “public void acao1(HttpServletRequest request, HttpServletResponse response)”
http://localhost:8080/Teste/servlet/ControllServlet?acao=acao1
Já a URL http://localhost:8080/Teste/servlet/ControllServlet?acao=acao2 , executara o metodo “public void acao2(HttpServletRequest request, HttpServletResponse response)”
Isto esta bem tosco, vc tem que tratar os erros, um método default, etc etc etc.
Eu recomento que você procure usar uma framework para isso (Struts, VRaptor, Webwork, …) Veja mais algumas em http://www.java-source.net/open-source/web-frameworks
SadNess
Novembro 21, 2006, 6:19pm
#3
é
é uma idéia bem interessante
e eu utilizo struts sim
mas no fim pra mim parece a mesma coisa, já que o método execute() teoricamente substitui o doGet()/doPost() não?
Pedrosa
Novembro 21, 2006, 6:32pm
#4
Já pensou em parar de se preocupar com isso e usar um framework que faça esse trabalho sujo por você?
http://www.vraptor.org/index.html
Se você esta usando o Struts, não invente a roda, de uma olhada na LookupDispatchAction http://struts.apache.org/1.x/struts-extras/apidocs/org/apache/struts/actions/LookupDispatchAction.html
Se você tiver a oportunidade de usar outras frameworks, de uma olhada no VRaptor (http://http://www.vraptor.org/ ) como Pedrosa sugeriu, ou no Stripes (http://stripes.mc4j.org ), ambas XMLless.