Controle de visibilidade por componentes

Pessoal,
Queria saber se alguém já implementou controle de visibilidade de componentes, como: se o usuário pode ou não ver inputtext ou botão.
Isso usando JSF 2.0.
Se não tiver exemplo em código não tem problema, se não for para web não tem problema também , mas gostaria de idéias, algoritmos que seriam de grande ajuda.

o interessante seria uma tabela no banco de dados com permissões sobre o que o usuário pode fazer… e usar um switch ou if mesmo e mostrar ou não o formulário

Boa noite a todos.

De acordo com o que o nosso amigo Dudu_sps disse, primeiro voce tem que criar perfis de usuário dentro do banco de dados.

Depois, quanto ao Java Server Faces, ainda não tive oportundade de trabalhar com ele, porém voce mudar a estilização CSS de componentes HTML dentro de funções JavaScript.

Ai vai um exemplo:

<!DOCTYPE HTML PUBLIC ?-//W3C//DTD HTML 4.01 Transitional//EN?>
<html>
<head>
<script>
     function showT(c,f){
           if(c.checked){
               f.txt1.style.visibility="visible"
           }  else {
               f.txt1.style.visibility="hidden"
           }
    }
</script>
</head>

<body>
<form>
<input type="checkbox" onclick="showT(this,this.form)"><input name="txt1" type="text" style="visibility:hidden">
</form>
</body>
</html>

Obrigado pelas respostas,

dudu_sps, sim, as permissões serão armazenadas no banco de dados.

discorpio, obrigado pela ideia, mas esclarecendo melhor, a visibilidade não seria apenas a aparencia seria do aplicativo também, que eu mesmo tive o descuido de nao ter especificado melhor, pensei também via css fazer isso mas qualquer um poderia setar via injection modificar visibilidade e teria que criar validações desnecessárias.

Depois de pensar um pouco pensei em criar um booleano para cada componente mesmo, só queria mesmo saber como o pessoal faziam isso.

Só gostaria de esperar mais um pouco pra ver se mais alguém tenha idéias para compartilhar.

[quote=tsunemisan]Obrigado pelas respostas,

dudu_sps, sim, as permissões serão armazenadas no banco de dados.

discorpio, obrigado pela ideia, mas esclarecendo melhor, a visibilidade não seria apenas a aparencia seria do aplicativo também, que eu mesmo tive o descuido de nao ter especificado melhor, pensei também via css fazer isso mas qualquer um poderia setar via injection modificar visibilidade e teria que criar validações desnecessárias.

Depois de pensar um pouco pensei em criar um booleano para cada componente mesmo, só queria mesmo saber como o pessoal faziam isso.

Só gostaria de esperar mais um pouco pra ver se mais alguém tenha idéias para compartilhar.
[/quote]

Bom dia a todos.

Tsunemisan, o código que te passei faz com que o componente fica invisível na tela, e não só na aparência.

Ao menos voce testou o código que passei. :?:

Se o CSS serve para estilizar aparência dos componentes, então porque não estilizar também a visibilidade dos componentes HTML :?: Já que visibilidade está relacionado a aparência.

Sim, fui testar setando visibility como hidden e como esperava infelizmente era apenas visualmente.
Testei com botao da tela de login do projetinho que estou fazendo, executei o firebug e fui inspecionar e lá estava ele no style setado como hidden e com firebug apaguei aquele pedaço e o botão voltou a ficar visivel.
Na verdade queria que não aparecesse ao usuario o componente, nem para os engraçadinhos com conhecimento de css injection pudesse ter acesso e cabei fazendo isso pelo lado do servidor mesmo, criando página devida antes de enviar para o lado cliente.

Mas obrigado a todos, consegui ter algumas ideias e resolvi criar classe separada com funções que retornem true false em vez de criar trocentas variaveis booleanas no meu managedbean pra ficar acomodada.

Boa noite Tsunemisan.

Me desculpe por te interpretar erroneamente.

Pensava que você estava confundindo com a tag "input type=“hidden”, me perdoe.

Pra fazer o que pretende, eu vejo só uma solução, aliás eu vejo duas:

A solução é voce contruir o componente do lado do servidor e voce pode fazer isto de duas maneiras:

Primeiro, construir este componente dentro da Servlet, onde se o usuário foi autenticado, de acordo com o seu perfil, constroi o componente ou não, da seguinte forma:


  public class Login extends HttpServlet {

        // Se voce está enviando os dados com o método Get então aqui o método tem ser o doGet 
        public void doPost(HttpServletRequest request, HttpServletResponse response) {

               // Conecta o banco

               // Atentica o usuário

               PrintStream inputText = new PrintStream(response.getOutputStream());
               inputText.println("<html><head><title>.......</title></head><body>");
               inputText.println(".......................");
               inputText.println(".......................");

               // Se o usuário for Administrador.
               inputText.println("<input type=\"text\" name=\"meuInput\" value=\"......\">");

              // Se não
               inputText.println("");

               inputText.println("</body></html>");  

        }
  }

Bom, ai voce vai me questionar: No caso do código acima eu tenho que escrever a página toda para a Servlet redesenhar a página no cliente :?: :shock: :x :frowning:

Infelizmente vai, mas o bom disso tudo é que só no caso acima, ou seja, voce tem um outra opção que é criar um objeto que retorna uma string que seja a tag do input text. Como assim criar um Objeto. :shock: :roll: :slight_smile:

Digo isto porque os JSPs permitem voce instanciar um objeto dentro deles, ou seja, dentro da página do cliente, e este objeto só retornará a tag se o cliente autenticado tiver o perfil para isto. Vamos ao que interessa.


  // Criando a classe do objeto.
  public class InputText {

       private String input; 

       public InputText(Boolean isVisible) {
            if (isVisible) {
                 input = "<input type=\"text\" name=\"meuInput\" value=\"....\">";
             } else {
                 input = "";
             }
       }

       public String getInput() {
             return input;
       }

   }
          

Bom, este código acima voce põe em um pacote que quiser, e lá na Servlet, antes de redirecionar a página para o JSP, instancie o objeto InputText com o parâmetro true ou false, assim:

public class Login extends HttpServlet {

        // Se voce está enviando os dados com o método Get então aqui o método tem ser o doGet 
        public void doPost(HttpServletRequest request, HttpServletResponse response) {

               // Conecta o banco

               // Atentica o usuário

               // Se o usuário for Administrador.
               InputText input = new InputText(true);

              // Se não
               InputText input = new InputText(false);
     
              request.setAttribute("inputText", input);
              response.sendRedirect("minhaJSP.jsp");
        }
  }

Agora, depois de autenticar o usuario e instanciar o InputText, voce vai jogá-la lá na página JSP com o request.setAttribute, e voce tem que apanhá-lo lá na página também com o request.getAttribute, assim:

  // Escreva este código abaixo no top do JSP
  <%! public InputText input = null; %>
  <% input = (InputText)request.getAttribute("inputText"); %>
  <html>
        <head></head>
        <body>
              .....
              .....
              // Aqui voce coloca ou não o input no seu devido lugar.
              <% out.write(input.getInput()); %>
              // ou
              <%= input.getInput() %>
              ....
              ....
         </body>
    </html>

É claro que o método getInput() só vai escrever o input de acordo com o perfil do usuário logado, e desse jeito, não há nenhum engraçadinho que conseguirá ver o sua tag input type=“text”, se não tiver autorização para isso.

Se voce olhar direito, vai perceber que é assim que a maioria dos frameworks que trabalham com visualização, se comportam.

Havia também a opção de voce instanciar o InputText lá na página JSP, contudo, tornou-se inviável porque voce primeiro teria que reconhecer o usuário autenticado e passar o parâmetro booleano para o InputText, e neste caso, a autenticação de usuário é recomendável ser feita no servidor.

Espero ter te ajudado.

Obrigado discorpio, não tinha pensado nessa idéia.
Acho que já pode ser colocado como resolvido. :smiley: