WEB-INF - duida

22 respostas
L

ae! Pessoal, estudando o livro da kathy Servlet &JSP me veio uma duvida sobre WEB-INF.

Se eu coloco um package admin/admin.jsp dentro e WEB-INF a unica forma de acesso a ele eh via servlet?
Terei que criar uma class Servlet com o metodo do post ou get?

Tipo, eu tenho um class JavaBeans e uma arquivo jsp, usando jsp:useBean, mas agora como implementaria isso se tivesse que usar o servlet?

terei que:

  1. criar um servlet
    2.Chamar os metodos da class JavaBean a partir do servlet?

seia isso?

22 Respostas

K

Não tenho muita experiencia com programação web, mas acho que posso te ajudar.
Sim, a unica maneira de acessar uma página .jsp dentro de WEB-INF é através de Servlet.
Tanto faz, as duas maneiras funcionam.
Para acessar as suas classes/metodos, o acesso é normal (não é nescesario usar jsp:useBean).
Espero ter ajudo.

G

Olá,

Na verdade é bem mais simples do que isso, você pode fazer forward para sua JSP a partir do Servlet que vai funcionar.

// no doGet ou doPost RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/admin/admin.jsp"); rd.forward(request, response);

L

gomesrod:
Olá,

Na verdade é bem mais simples do que isso, você pode fazer forward para sua JSP a partir do Servlet que vai funcionar.

// no doGet ou doPost RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/admin/admin.jsp"); rd.forward(request, response);

opa! eh verdade, nem lembrei.

obrigado pela colaboracao :smiley:

kapa01 eu usei o javabeans para manter code clear no meu jsp, nao gosto muito de <% %>

abraco e obrigado por sua sugestao…

D

Lembre q WEB-INF não é o lugar adequado para colocar páginas…

N

Concordo com o deadlock o WEB-INF não é lugar de botar os arquivos de internet, ponha em mm outro lugar para ficar mais organizado e seguro, apenas uma sugestão.

L

hmm, entao como proteger o acesso direto de um arquivo .jsp? se vc tem uma pagina lista.jsp e deseja que antes de mostrar a lista o user tem que fazer autenticacao, e se ele tentar acessar o arquivo diretamente pelo browser, nao vai ter sucesso. Como estou lendo o livro Servlet & JSP a kathy citou que WEB-INF seria para proteger o acesso direto, mas tem outra forma?

D

Acho q jah fiz uma vez… mas faz mto tempo :wink:

seguinte, pergunta pro “tio Google” que ele deve saber…

G

Você pode usar Security Constraints para determinar que o cara deve estar logado e pertencer a um determinado grupo para acessar a página. Continua lendo o HeadFirst que logo chega o capítulo que explica isso direitinho (eu sei porque foi la que aprendi) :smiley:

M

Para proteger suas páginas ou a lógica de negócio, use o Spring Security ou a própria especificação da Sun (JAAS).

G

Pode colocar páginas jsp dentro de WEB-INF sim. Principalmente se quer proteger de acesso direto via url por exemplo.

K
gomesrod:
Olá, Na verdade é bem mais simples do que isso, você pode fazer forward para sua JSP a partir do Servlet que vai funcionar.
// no doGet ou doPost
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/admin/admin.jsp");
rd.forward(request, response);

Olá gomesrod, fiz a minha implementação na minha classe HibernateSessionFilter e ficou assim:

import java.io.IOException;



import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;



public class HibernateSessionFilter implements Filter {



	public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)

			throws IOException, ServletException {



		HibernateUtil.openSession();

		RequestDispatcher rd = req

				.getRequestDispatcher("/WEB-INF/jsp/mainpage.jsp");

		rd.forward(req, res);

		try {

			HibernateUtil.currentSession().beginTransaction();

			fc.doFilter(req, res);

			HibernateUtil.currentSession().getTransaction().commit();

		} catch (Exception e) {

			throw new ServletException(e);

		} finally {

			HibernateUtil.closeCurrentSession();

		}

	}



	public void init(FilterConfig c) {

	}



	public void destroy() {

	}



}
O problema é que quando eu vou acessar a pagina de login, ele da um erro: nao encontra o FacesContext, olha só:
HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: java.lang.RuntimeException: Cannot find FacesContext
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:541)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:435)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	br.com.caelum.fj26.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:21)

root cause

java.lang.RuntimeException: Cannot find FacesContext
	javax.faces.webapp.UIComponentClassicTagBase.getFacesContext(UIComponentClassicTagBase.java:1797)
	javax.faces.webapp.UIComponentClassicTagBase.setJspId(UIComponentClassicTagBase.java:1614)
	org.apache.jsp.WEB_002dINF.jsp.mainpage_jsp._jspx_meth_f_005fview_005f0(mainpage_jsp.java:134)
	org.apache.jsp.WEB_002dINF.jsp.mainpage_jsp._jspService(mainpage_jsp.java:105)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	br.com.caelum.fj26.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:21)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.

O que será q eu estou fazendo de errado??

Valeu man.

G

Kleber-rr:

O problema é que quando eu vou acessar a pagina de login, ele da um erro: nao encontra o FacesContext

O que será q eu estou fazendo de errado??

Esse erro acontece quando você tenta acessar a JSP diretamente. Tem que passar pelo Faces Servlet e ele é que usa internamente a JSP para montar a página.

Para passar pelo Faces Servlet é só mudar a URL do forward de acordo com o mapeamento configurado no web.xml.

Provavelmente ficará como algum desses exemplos:
/WEB-INF/jsp/mainpage.jsf
/WEB-INF/jsp/mainpage.faces
/WEB-INF/faces/jsp/mainpage.jsp

K

gomesrod:
Kleber-rr:

O problema é que quando eu vou acessar a pagina de login, ele da um erro: nao encontra o FacesContext

O que será q eu estou fazendo de errado??

Esse erro acontece quando você tenta acessar a JSP diretamente. Tem que passar pelo Faces Servlet e ele é que usa internamente a JSP para montar a página.

Para passar pelo Faces Servlet é só mudar a URL do forward de acordo com o mapeamento configurado no web.xml.

Provavelmente ficará como algum desses exemplos:
/WEB-INF/jsp/mainpage.jsf
/WEB-INF/jsp/mainpage.faces
/WEB-INF/faces/jsp/mainpage.jsp

Cara, me passou despercebido o mapeamento no web.xml. Como eu devo inserir? Você pode me dar um exemplo??
Valeu!!

G

No arquivo web.xml deve ter algo parecido com o seguinte:

<servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet><servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping>
(juntos ou separados)

Pois bem, no “url-pattern” você vê as urls que são tratadas pelo Faces, no meu caso, *.jsf.
Ou seja: eu digito no browser /minhaapp/pagina.jsf e o Faces automaticamente usa minha página pagina.jsp para compor a view e renderizar a resposta.

Aproveitando, gostaria de deixar uma sugestão: pelas dúvidas que está tendo, imagino que você esteja modificando um projeto já pronto. Procure criar uma aplicação Faces do zero, seguindo algum tutorial, que esses pequenos detalhes (que a gente só mexe uma vez e nunca mais) vão ficar bem mais claros.

Boa sorte!

M

eu ainda não li esse livro, o head first, e também não tenho muita experiência com web… a forma que eu uso de impedir o usuario de entrar em alguma pagina do sistema sem estar logado, é colocando um filter servlet mapeado para /*, que verifica o usuario na sessão, caso não exista eu redireciono para a tela de login… me parece um jeito simples e eficiente.

para os mais experiêntes, existe algum problema em fazer desta forma?

existe alguma outra forma que seja simples e melhor que esta?

G

maior_abandonado:
eu ainda não li esse livro, o head first, e também não tenho muita experiência com web… a forma que eu uso de impedir o usuario de entrar em alguma pagina do sistema sem estar logado, é colocando um filter servlet mapeado para /*, que verifica o usuario na sessão, caso não exista eu redireciono para a tela de login… me parece um jeito simples e eficiente.

para os mais experiêntes, existe algum problema em fazer desta forma?

existe alguma outra forma que seja simples e melhor que esta?


Eu também não tenho tanta experiência com segurança, mas acho que tecnicamente não tem nenhum problema não… a vantagem da segurança fornecida pelo container é que não precisa programar, você só cria o formulário de login em html e faz as configurações que tudo acontece automagicamente.

Essa facilidade fica mais evidente quando se trabalha com grupos… pelo web.xml você faz o controle de quem pode ver o que, sem precisar escrever código.

M

Bom, quando você deseja que o acesso direto a seus arquivos .jsp seja evitado, você pode criar pastas dentro de WEB-INF. Este é um diretório protegido no servidor de aplicação, para confirmar este dado, crie uma página .jsp dentro de WEB-INF e tente acessá-la diretamente através da url. Um erro será exibido, dizendo que não foi possível localizar o arquivo.
Você pode utilizar um servlet para receber as requisições http e redirecionar para a página a ser exibida, para isso, será necessário trabalhar com os objetos response e request. :wink:

K

gomesrod:
No arquivo web.xml deve ter algo parecido com o seguinte:

<servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet><servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping>
(juntos ou separados)

Pois bem, no “url-pattern” você vê as urls que são tratadas pelo Faces, no meu caso, *.jsf.
Ou seja: eu digito no browser /minhaapp/pagina.jsf e o Faces automaticamente usa minha página pagina.jsp para compor a view e renderizar a resposta.

Aproveitando, gostaria de deixar uma sugestão: pelas dúvidas que está tendo, imagino que você esteja modificando um projeto já pronto. Procure criar uma aplicação Faces do zero, seguindo algum tutorial, que esses pequenos detalhes (que a gente só mexe uma vez e nunca mais) vão ficar bem mais claros.

Boa sorte!

Cara, obrigado pela ajuda e pelas dicas.
Realmente, eu estou tentando melhorar um projeto que eu criei no curso de java, antes de iniciar o desenvolvimento de outro projeto, por isso estou tendo essas dificuldades de iniciante.
Agradeço pela atençao. vou testar a dica. Valeu.

K
gomesrod, eu estive conferindo o web.xml e realmente já tem as linhas do javax:
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>

Eu vou postar as minhas classes do hibernate pra vc ver se no meu caso, eu poderia implementar esse filtro.

HibernateSessionFilter
package br.com.caelum.fj26.util;



import java.io.IOException;



import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;



public class HibernateSessionFilter implements Filter {



	public void doFilter(ServletRequest req, ServletResponse res, FilterChain fc)

			throws IOException, ServletException {



		HibernateUtil.openSession();

		try {

			HibernateUtil.currentSession().beginTransaction();

			fc.doFilter(req, res);

			HibernateUtil.currentSession().getTransaction().commit();

		} catch (Exception e) {

			throw new ServletException(e);

		} finally {

			HibernateUtil.closeCurrentSession();

		}

		// RequestDispatcher rd = req

		// .getRequestDispatcher("/WEB-INF/jsp/mainpage.jsf");

		// rd.forward(req, res);

	}



	public void init(FilterConfig c) {

	}



	public void destroy() {

	}



}
Classe HibernateUtil:
package br.com.caelum.fj26.util;



import org.apache.log4j.Logger;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.AnnotationConfiguration;



//import org.postgresql.core.Logger;



public class HibernateUtil {



	private static Logger logger = Logger.getLogger(HibernateUtil.class);



	private static SessionFactory sessionFactory;



	// ajuda a guardar as coisas na thread

	private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();



	static {

		sessionFactory = new AnnotationConfiguration().configure()

				.buildSessionFactory();

	}



	public static Session openSession() {

		if (sessions.get() != null) {

			logger.error("Alguem nao fechou uma j&#65533; aberta!!");

			// grave, alguem nao fechou uma j&#65533; aberta!

		}

		sessions.set(sessionFactory.openSession());

		return sessions.get();

	}



	public static void closeCurrentSession() {

		sessions.get().close();

		sessions.set(null);

	}



	public static Session currentSession() {

		return sessions.get();

	}



}

Pelo que eu estive lendo, a session que eu crio nessas duas classes não são Http. Tem como nessas mesmas classes eu implementar esse filtro utilizando as mesmas sessions?? Ou daria problemas. Como ficaria?? valeu.

F

maior_abandonado:
eu ainda não li esse livro, o head first, e também não tenho muita experiência com web… a forma que eu uso de impedir o usuario de entrar em alguma pagina do sistema sem estar logado, é colocando um filter servlet mapeado para /*, que verifica o usuario na sessão, caso não exista eu redireciono para a tela de login… me parece um jeito simples e eficiente.

para os mais experiêntes, existe algum problema em fazer desta forma?

existe alguma outra forma que seja simples e melhor que esta?

Se vc nao usa um SSO ou algo do tipo, essa solucao é pratica e eficiente.

D

maior_abandonado:
eu ainda não li esse livro, o head first, e também não tenho muita experiência com web… a forma que eu uso de impedir o usuario de entrar em alguma pagina do sistema sem estar logado, é colocando um filter servlet mapeado para /*, que verifica o usuario na sessão, caso não exista eu redireciono para a tela de login… me parece um jeito simples e eficiente.

para os mais experiêntes, existe algum problema em fazer desta forma?

existe alguma outra forma que seja simples e melhor que esta?

Cara, para quem ta começando a melhor forma é utilizando filter mesmo.

Depois que vc pegar o jeito, ai tenta dar uma olhada em JAAS, ai depois existem “N” soluções que voce só vai precisar ver qual se enquadra melhor na sua solução.

abraço

P

Aê, galera.
Concordo com o danilopelegrino , o Filter já é um ótimo início.Mas depois o JAAS ou o Spring que são mais robustos.

Pankka.
Analista de Sistemas especialista em Desenvolvimento Web.

Criado 2 de agosto de 2009
Ultima resposta 19 de ago. de 2009
Respostas 22
Participantes 13