WEB-INF - duida

22 respostas
LPJava

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

kapa01

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.

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);

LPJava

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…

deadlock

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

nathanpc

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.

LPJava

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?

deadlock

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

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

gomesrod

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:

marcelo_mococa

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).

g4j

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

Kleber-rr
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.

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

Kleber-rr

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!!

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!

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?

gomesrod

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.

Marcio_Nogueira

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:

Kleber-rr

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.

Kleber-rr
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.

fabim

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.

danilopelegrino

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

Pankka

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