Geração de página com servlet [RESOLVIDO]

6 respostas
S

Olá pessoal!

Estou desenvolvendo um sistema de menu dinâmico, baseado em algumas tabelas de segurança. O objetivo é montar o menu de acordo com o perfil do usuário.

Não estou usando nenhuma framework, pois a modelagem do banco não favorece o uso de hibernate ou outras framewors. Estou fazendo tudo na mão. JDBC puro e Servlet.

Meu problema está na exibição do menu. Para isso utilizo um servlet que "gospe" o html pra mim.

O problema é. Minha página é exibida corretamente, mas gera uma java.lang.IllegalStateException: que não impede a exibição da minha página.

Como tenho pouca experiência em servlet. Gostaria de alguma ajuda.

aqui vai os principais trechos de código:

Meu Servlet:

public class MenuHorizontalHierarquico extends javax.servlet.http.HttpServlet
		implements javax.servlet.Servlet {
	
	static final long serialVersionUID = 1L;
	private boolean filhos;
	RequestDispatcher dispatcher;
	private PrintWriter out;

	/*
	 * (non-Java-doc)
	 * 
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public MenuHorizontalHierarquico() {
		super();
	}

	protected void processRequest(HttpServletRequest request, HttpServletResponse response){

		 try {
			 	dispatcher = request.getRequestDispatcher("index.jsp");
			 	
			 	String login = request.getParameter("login");		
				int projeto = Integer.parseInt(request.getParameter("projeto"));
				
				response.setContentType("text/html;charset=UTF-8");
				out = response.getWriter();
				out.println("<html>");
				out.println("<head>");
				out.println("<title>MenuJDBC</title>");
				out.println("</head>");
				out.println("<body>");

				Menu menu = new Menu();
				List<Menu> menusPai = new ArrayList<Menu>();
				Set<Menu> menusDoUsuario = new HashSet<Menu>();

				menu.setCodProjeto(projeto);
				menu.criaMenusDoUsuarioAtivo(projeto, login);

				menusPai = menu.getMenusPai();
				menusDoUsuario = menu.getMenusDoUsuarioAtivo();
				
				out.println("<ul>&quot;);
				
				for (Menu pai : menusPai) {
					menu.setMenusFilhos(menusDoUsuario, pai.getNumMenuProjeto());
					out.println(imprimiLabelLink(pai.getDesLink(), pai.getNomLabelMenu()));
					
					if (menu.getMenusFilho().size() &gt; 0) {				
						imprimeMenus(menu.getMenusFilho(), &quot;filhos&quot;);
						setFilhos(true);
						filhosDosFilhos(menu.getMenusFilho(), menusDoUsuario);
					}					
				}
				
				out.println(&quot;</ul>");
				out.println("&lt;/body&gt;");
				out.println("&lt;/html&gt;");
				
				
				
				out.flush();
				out.close();
				
				try {
					dispatcher.forward(request, response);
				} catch (ServletException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			    } catch (IOException e) {
			      // TODO Auto-generated catch block
			      e.printStackTrace();
			    }
	}

Minha jsp

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;
&lt;title&gt;LoginJDBC&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Teste de Login&lt;/h1&gt;

&lt;form name="login" action="MenuHorizontalHierarquico" method="get"&gt;
Usuário: &lt;input type="text" name="login" value="SCOTES" /&gt; <br />
Projeto: &lt;input type="text" name="projeto" value="2" /&gt; &lt;input
	type=submit name="Envia"&gt;&lt;/form&gt;
<a >Servlet</a>
&lt;/body&gt;
&lt;/html&gt;

Meu WEB.xml

&lt;description&gt;&lt;/description&gt;
    &lt;display-name&gt;MenuHorizontalHierarquico&lt;/display-name&gt;
    &lt;servlet-name&gt;MenuHorizontalHierarquico&lt;/servlet-name&gt;
    &lt;servlet-class&gt;br.com.folha.login.servlet.MenuHorizontalHierarquico&lt;/servlet-class&gt;
  &lt;/servlet&gt;
  &lt;servlet-mapping&gt;
    &lt;servlet-name&gt;MenuHorizontalHierarquico&lt;/servlet-name&gt;
    &lt;url-pattern&gt;/MenuHorizontalHierarquico&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;

A exeption

2:10:10,670 ERROR [[MenuHorizontalHierarquico]] Servlet.service() for servlet MenuHorizontalHierarquico threw exception java.lang.IllegalStateException: Cannot forward after response has been committed at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:313) at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301) at br.com.folha.login.servlet.MenuHorizontalHierarquico.processRequest(MenuHorizontalHierarquico.java:89) at br.com.folha.login.servlet.MenuHorizontalHierarquico.doGet(MenuHorizontalHierarquico.java:169)

Pelo que entendi estou usando "dispatcher = request.getRequestDispatcher("index.jsp");" e o PrintWriter out;
em ordem errada.

Já inverti isso já usei response.sendRedirect e não resolveu.

O que devo fazer?

6 Respostas

B

Tente rodar sem o out.close();

V

Vc não pode fazer um dispatcher depois de ter escrito no objeto resposta.
Seta o seu menu como um atributto da requisição e depois acesso os atributos de sua requisição no jsp.

Abraçços.

S

bKn Não resolveu

vagner.oliveira2 Não é viável eu montar meu menu na JSP. pois este serviço de menu dinâmico. Vai ser utilizado em vários processos. Pois junto com ele tem um sistema SING-SIN-ON (Atenticação).

V

Vc tem duas opções:
1º retirar o dispatcher e deixar a reposta ser exibida no browser
2º adicionar os atribudos na requisição e montar o menu no jsp e definir os papéis que podem ter acesso ao seu jsp.

V

Complementando…se vc escreve na resposta e faz um dispatcher será lançado é lançada a exceção pois vc ja escreveu na resposta…não tem sentido fazer um dispatcher se vc ja escreveu a resposta.

Abraços.

S

Obrigado pelas dicas.

Resolvi o problema da seguinte forma.

Como meu servlet tava muito grande com vários métodos.

Fiz uma classe que me retorna um List<String>. Basicamente subistituí o ou.print pelo List na nova classe.

E meu servlet ficou assim

protected void processRequest(HttpServletRequest request, HttpServletResponse response){
		response.setContentType("text/html;charset=UTF-8");
		String login = request.getParameter("login");		
		int projeto = Integer.parseInt(request.getParameter("projeto"));
		
		try {
			PrintWriter out = response.getWriter();
			GeraMenus menu = new GeraMenus();
			menu.clearMenuHorizontal();
			
			for(String saida: menu.getMenuHorizontal(login, projeto)){
				out.print(saida);
			}
			
			out.flush();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
Criado 23 de julho de 2009
Ultima resposta 23 de jul. de 2009
Respostas 6
Participantes 3