Pergunta

Eu faço classes estáticas em servlet, essas classes são controladores para páginas da web. Solicitações são redirecionadas para controladores de urls do controlador que estão em HashMap estática que contém todos os controladores. Há algum posibilities que o usuário / sessão realted coisas poderiam ficar messsed com outras sessões de usuários? Claro que vou salvar todos os dados relacionados sessão para HttpSession e pedido, resposta e HttpSession objetos são dados ao controlador quando manipulador de solicitação do controlador é chamado.

UPDATE:

Aqui está um exemplo:

public class MainControllerServlet extends HttpServlet {
static HashMap<String, ControllerAbstract> controllers = new HashMap<String, ControllerAbstract>();

    public MainControllerServlet()
    {
        controllers.put("url", new Controller());
    }

}

ControllerAbstract:

public abstract class ControllerAbstract {
    private String url;
    private HashMap<String, ControllerAbstract> children = new HashMap<String, ControllerAbstract>();

    public abstract void handleRequest(HttpServletRequest request, HttpServletResponse response, SessionBean session, String type) throws Exception;

}
Foi útil?

Solução

Parece do seu código que você está usando um hashmap estático, não classes estáticas, assim que você está compartilhando o mapa entre todos os usuários. Existem alguns problemas que vejo com isso -

  • O seu mapa não é thread-safe, o que poderia ser um problema com os conflitos entre a criação do objeto e recuperação. Dada a partilha potencial / rosqueamento questões, onde mais você colocar objetos no mapa?
  • Seus objetos ControllerAbstract tem estado, e você pode correr em uma situação onde várias solicitações estará usando o mesmo controlador. Por exemplo, se todos os pedidos adicionar à hashmap crianças em seus próprios objetos ControllerAbstract? Você pode ter várias solicitações usando o mesmo ControllerAbstract - por exemplo, se o pedido 1 quer adicionar ou excluir a ele é ControllerAbstract.children mapear enquanto pedido 2 referenciando o mesmo objeto decide que precisa para percorrer as crianças que você vai ter uma ConcurrentModificationException.
  • construção
  • Servlet é gerenciado pelo contêiner. Se você vai ter que codificar o url para tê-lo existir no construtor do servlet, é apenas uma string constante? Se assim for, não seria mais fácil simplesmente declará-lo como uma constante no objeto ControllerAbstract? Se não, onde é que vem? Em qualquer caso, o que fazer é alterar o mapa de controladores sempre que o recipiente decide que precisa para criar um novo servlet.

Outras dicas

Você quer dizer referências estáticos? não existe tal coisa como classes estáticas, menos que são classes internas, mas eles não têm comportamento estático. Se você estiver usando referências estáticas como controladores, você tem cuidado com todos os atributos desses controladores.

classes internas estáticas são uma alternativa para aulas normais em outro pacote. Então você não terá que se preocupar com eles se misturar com suas classes de servlet.

Porque você chamar os métodos .handleRequest() como resultado de chamadas servlet, você deve certifique-se que a implementação dos controladores é re-entrantes . Ou seja, sua execução não deve usar o armazenamento variável que não seja a pilha e os objetos que você passar como argumentos.

Dito isso, eu iria optar por colocar os controladores em sua própria fora do pacote do pacote que contém os servlets. Você pode então adicionar uma classe gerente que possui e inicializa o mapa e lida com chamadas de servlets (abstraindo os detalhes de implementação.)

Tanto quanto eu posso recordar uma classe estática é nada mais do que uma classe aninhada. Então, eu não vejo por que deveria ser diferente do que uma classe pública normal.

estática interior aulas se comportam exatamente como as classes normais, eles só têm um escopo adicional. Dito isto, se você está compartilhando estado entre as classes usando variáveis ??estáticas na classe externa, então isso poderia levar a problemas. Dado que você disse que você só vai estar usando o objeto HttpSession para transmitir dados entre invocações, então isso não será um problema para você.

O que você está fazendo parece OK para mim. Apenas certifique-se que você não guarde nada em variáveis ??de membro em suas implementações do controlador. Eu também estou supondo que você só está colocando objetos nas controladores mapear pelo servlet tempo instanciar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top