Problemas com JSP

Olá Galera do GUJ!! :lol:

Estou tentando rodar uma página Teste.jsp bem simples no Eclipse JEE. Estou usando um servlet para chamar essa página e sempre que eu boto pra rodar, dispara uma excessão.

Este é o código da JSP:

<%@ page language=“java” contentType="text/html; charset=ISO-8859-1"
pageEncoding=“ISO-8859-1”%>

Insert title here

Página de Teste

Como podem perceber não tem nada de mais.
E a excessão é a seguinte:

SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.Teste_jsp._jspInit(Teste_jsp.java:22)
at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at unimed.MainServlet.service(MainServlet.java:33)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
org.apache.jasper.JasperException: java.lang.NullPointerException
at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:356)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at unimed.MainServlet.service(MainServlet.java:33)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at org.apache.jsp.Teste_jsp._jspInit(Teste_jsp.java:22)
at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
… 23 more

Estou utilizando o jre6(update 11) e o tomcat 6.0.18.
Sei que o nullPointException pode ser pq o servidor não achou a JSP, mas eu sempre a coloco na pasta WebContent, que é a correta (pelo menos nos tutoriais de Servlet e JSP)

Alguém saberia identificar qual é exatamente o problema?

Grato Pela Colaboração!!! :smiley:

Você disse que está chamando a página de um servlet, poste o código do servlet.

Quel a linha 22 de sua pagina??

Esse é o código do Servlet:

public class MainServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;

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

public void service(HttpServletRequest req, HttpServletResponse res){
	try{
				
		
		String url = "/Teste.jsp";
		
		        getServletContext().getRequestDispatcher(url).forward(req, res);

	}catch (Throwable t){
		try{
			exibirErro(res.getWriter(), t);
			t.printStackTrace();
		}catch (IOException e){
			e.printStackTrace();
		}
	}
}

E o interessante é que se eu substituir o “Teste.jsp” por uma outra pagina “Page.html”, o servlet roda sem problema algum a página.
Acho que é alguma coisa com a compilação do JSP. Mas eu já coloquei o JAVA_HOME como variável de ambiente apontando para a JVM, tudo como manda o figurino.

Que mistériossauro será esse? :?

Olá. Sua implementação do método service está errada.
Este método é responsável por encaminhar a chamada correta do navegador (get, post…) para os métodos do servlet (doGet, doPost…).
Então subescreva alguma desses métodos e não o service.

	protected void doGet(HttpServletRequest req,
			HttpServletResponse res) throws ServletException, IOException {
		try {
			String url = "/Teste.jsp";
			getServletContext().getRequestDispatcher(url).forward(req, res);

		} catch (Throwable t) {
			try {
				exibirErro(res.getWriter(), t);
				t.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

Olá, bzy!!! Cara, quando vi sua sugestão até me animei. “É isso!!!” Pensei. Substituí o método service pelo doGet da mesma forma que vc colocou, mas daí quando fui implementar deu a mesma excessão:

SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
at org.apache.jsp.Teste_jsp._jspInit(Teste_jsp.java:22)
at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at unimed.Servlet.doGet(Servlet.java:31)

Parece alguma coisa relacionada com o ambiente. Como se o tomcat não estivesse encontrando o caminho para a JVM compilar e executar a JSP. Como já havia mensionado anteriormente, quando substituo o Teste.jsp por uma página html normal, o Servlet roda sem problemas.

Por gentileza, dá uma olhada nas configurações da variáveis de ambiente e, por favor, corrija-me se estiver algo errado:

CLASSPATH: C:\Arquivos de programas\Java\jre6\lib\tools.jar
JAVA_HOME: C:\Arquivos de programas\Java\jre6
Path: C:\Arquivos de programas\Java\jre6\bin

Bom, vamo lá.
Os servlets tem alguns detalhes que levam ao erro, por exemplo usar / no link que o chama ou não. A declaração no DD do servlet-name e do url-pattern e outras coisas que fazem a aplicação não rodar.

Para ver onde pode estar errando, eu fiz um aplicativo simples. Você pode copiar e ver o código-fonte.
Isso pode ajudar:
Passos para criar um servlet:

Crie uma classe java que extenda o HttpServlet;
Ex:

Sobrescreva algum dos métodos de serviço (doGet, doPost)
Ex:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}

Declare o servlet no Deplyment Descritor (DD) que é o web.xml.
Ex:
Algo como dizer: “Por favor container, transforme essa classe java em um servlet”

	<servlet>
		<servlet-name>ServletSimples</servlet-name>
		<servlet-class>pacote.ServletSimples</servlet-class>
	</servlet>

Depois:
Algo como dizer: “Container, a classe que você vai transformar em servlet é chamada pela seguinte URL meuServlet

	<servlet-mapping>
		<servlet-name>ServletSimples</servlet-name>
		<url-pattern>/meuServlet</url-pattern>
	</servlet-mapping>

O servlet-name do servlet e do servlet-mapping tem que ter o mesmo nome.
O servlet-class indica o caminho completo da classe, incluindo os pacotes.
O url-pattern pode indicar um diretório(/), um arquivo (/teste ou /teste.htm ou /teste.guj) ou uma extensão (*.do)

Por favor, baixe o arquivo e coloque dentro do \webapps do seu tomcat, ele irá criar uma pasta com os arquivos da aplicação. Rode o aplicativo e estude o arquivo Simples.java que utiliza o PrintWriter, o EuRedireciono.java que utiliza o RequestDispatcher e o web.xml.

Ok!!! bzy :lol:

Eu baixei seu exemplo e vou dar uma olhada. Só queria acrescentar que toda essa parte da configuração do sevlet que vc falou eu não preciso me preocupar com isso pq estou trabalho no Eclipse JEE ganymed. Ele já vem com todos os plugins necessários para criar projetos web. Basta dar um New … Other… Servlet que ele já me da uma Classe servlet já configurada no web.xml. Só tenho que implementar o corpo dos métodos na classe.

Eu não entendo!!

Se eu clico diretamente na pagina html dentro do eclipse com o botao direito e escolho a opção Run AS … Run on Server… Aparece um browser no próprio eclipse e carrega a página. Se faço a mesma operação em uma JSP, ele acusa nullPointerException, ou seja, referenciando um objeto que nao existe. Essa é a origem e todo o problema. Gostaria que alguém me explicasse como realmente funciona um Servlet e como é feita a chamada pelas paginas JSP.

Você chama usando o nome que configurou no DD.
Por exemplo nessa aplicação que fiz, você chama o servlet meuServlet acessando (nesse exemplo localmente) http://localhost:8080/Simples/meuServlet onde Simples é o nome da aplicação.

E o link para chamar o servlet é e não com barra.

Se puder exporte seu WAR e poste aqui.

Abraços.

Oi bzy!!!

Eu entendi o que vc propõe. Vc quer que eu coloque uma pagina JSP dentro da webapps do tomcat com um link redirecionando para o servlet. Ontem eu até fiz isso, coloquei o meu Teste.jsp dentro da pasta examples/jsp o chamei pelo browser pela url: http://localhost:8080/examples/jsp/Teste.jsp e funcionou mas nao testei o link.

Assim cara, eu queria fazer tudo dentro do Eclipse, tipo ter uma classe Servlet e rodá-la no servidor e dentro do próprio Eclipse exibir o browser com a página sem ter que fazer redirecionamentos. Trabalhando com o Eclipse JEE não teria sentido colocar qualquer JSP dentro do tomcat pra chamar externamente.

Eu sei que isso é possível pq já o fiz com uma página html, o problema são as JSPs que sempre que rodo o Servlet dá o mesmo erro: NullPointerException.

Bom dia.
Deve estar havendo algum equivoco.
Quando você trabalha com o Eclipse e cria um projeto WEB, você coloca os servletes (classes java) em Java Resources :src e as páginas dentro de WebContent (fora de WEB-INF E META-INF).
Se você rodar a página ou o servlet (Run on server) ele irá rodar automáticamente o TomCat (se tiver o TomCat na máquina).

Agora quando você usa o diretório do TomCat webapps é outra história. Basicamente você exporta o projeto como WAR e coloca dentro da pasta webapps e roda pelo TomCat e não pelo Eclipse. Embora você não precise do Eclipse para rodar o TomCat (nem o inverso).

Baixe o WAR que eu postei anteriormente e importe no Eclipse.