Estrutura de pastas do aplicativo Web Java

18

Como iniciante no J2EE, recentemente comecei a desenvolver meu próprio projeto usando o Core of J2EE: Servlets e Jsps.

Não pude avaliar se minha estrutura de pastas do projeto está correta ou não. Aqui está minha estrutura de pastas do projeto. insira a descrição da imagem aqui

Antes de fazer uma pergunta, admito que não poderia responder ou justificar se alguém me perguntar por que esse tipo de estrutura de pastas. A pergunta: é um bom sinal colocar meus jsps fora do web-inf. Se não, por que é assim? Se sim, por quê?

Existe alguma convenção de estrutura de pastas padrão para um aplicativo da Web J2EE, eu sei que o maven trouxe alguns padrões, mas ainda assim, podemos personalizar conforme os requisitos que eu acredito.

Eu pesquisei um pouco e encontrei as duas referências 1 2

onde as respostas não estão na mesma página, das quais não pude tirar nenhuma conclusão.

Quais são os pontos a serem considerados durante o layout da estrutura de pastas para um aplicativo da Web J2EE, onde os Jsps e o conteúdo estático devem entrar e por quê?

srk
fonte
Eu recomendo que você pesquise a teoria MVC - o artigo da wikipedia possui alguns recursos excelentes. Se você deseja experimentar o MVC em um aplicativo da Web Java, o Stripes é uma excelente estrutura leve que pode fornecer uma visão geral da arquitetura.
Michael K
1
Aqui está um tratamento mais específico de como o MVC funciona nos aplicativos da web.
Michael K

Respostas:

7

A estrutura padrão para um arquivo WAR é:

/META-INF
   Standard jar stuff like manifest.xml
/WEB-INF
  web.xml
  /classes
    /com...etc.
  /lib

O Maven gera isso para você usando seu src / main / java, recursos, webapp e suas dependências (colocando-as em / lib) no maven-webapp-plugin , mas isso é implementação. O importante é perceber que tudo o que você coloca no WEB-INF não é acessível externamente , enquanto tudo no diretório raiz do WAR é público.

Geralmente, você não deseja colocar muito na raiz, pois deseja que seu aplicativo manipule todo o acesso usando os servlets e filtros que você define no web.xml. É comum ver um index.html (ou .jsp) na raiz que redireciona para um servlet, por exemplo, uma ação Struts .

Implementações típicas do MVC, como Stripes ou Struts, recomendam que o usuário não acesse diretamente as JSPs, preferindo que as JSPs sejam apenas de visualização. Eles recomendam a criação de controladores que encaminham para JSPs após o processamento da solicitação, e as JSPs apenas renderizam o resultado. Por exemplo, enviar um formulário para /loginexecutará uma ação que processa a solicitação de login, cria a sessão do usuário e encaminha o usuário para a visualização de logon da JSP da página inicial.

Michael K
fonte
5

A resposta usual para "qual é o caminho certo?" ou "este é o caminho certo?" é ... depende .

Tudo o que posso fazer é contar os prós e os contras de idéias específicas. O que se segue é 100% da minha opinião. Não conheço nenhum requisito ou regra específica. Tenho certeza que alguém vai discordar de mim.

JSP's

Vamos trabalhar para colocar JSPs no WEB-INF ou não.

Prós de colocar JSP's no WEB-INF:

  • Você controla como as JSPs são executadas. Se você deseja que um JSP seja parametrizado e reutilizável (o que é realmente difícil com um JSP de qualquer maneira), você pode colocá-los no WEB-INF e usar um servlet ou um controlador de ação Struts ou outro controlador frontal para fazer o pré-processamento e depois passe o controle para o JSP, passando no contexto certo do ambiente (como atributos de solicitação, quaisquer verificações de segurança, saneamento de parâmetros etc.)
  • Você pode programar ou mesmo em um nível de firewall ou IDS bloquear solicitações HTTP para * .jsp para reduzir a probabilidade de alguém fazer upload de um JSP na raiz da web e, em seguida, poder executar o código como servidor da web. Eles teriam que sobrescrever um JSP existente. Não é um enorme ganho de segurança, mas dificulta um pouco o comprometimento.
  • Aplica bons hábitos, como MVC, controlador frontal, filtros de servlet, injeção de dependência, etc., em oposição a um grande JSP monstruoso que faz todo o trabalho em si e é difícil de ler / manter.

Contras de colocar JSPs no WEB-INF:

  • Você não pode acessar a página diretamente, mesmo que seja uma página autônoma simples que não precise de processamento inicial. Isso ocorre porque os arquivos em / WEB-INF não podem ser servidos por um contêiner de servlet.

Arquivos estáticos

Em termos de arquivos puramente estáticos, como HTML, imagem, folha de estilo, javascript, etc., coloque-os na raiz da web (my_app no ​​seu caso), mas NOT / WEB-INF (porque não é acessível).

Layout geral

Quanto ao layout geral do diretório, isso depende um pouco do seu processo de criação. Eu gosto de armazenar tudo em "src" ou "source" porque deixa claro quais arquivos são gerados pela construção e quais são arquivos de origem puros. mainpermite separar o código de teste, como as classes junit, do código-fonte principal, o que também é bom. Mas se você não tiver nenhum teste de unidade (oh não!), É uma distinção sem sentido.

Por outro lado, se você não manipular a raiz da web durante a compilação (como se fosse todos os arquivos JSP e estáticos), talvez você a mantenha no nível superior, como /webrootou /deploycopie os arquivos conforme necessário, como arquivos .class ou .jar. É um hábito de seres humanos (especialmente desenvolvedores) se organizarem demais. Um bom sinal de excesso de organização é ter muitas pastas com apenas uma única subpasta.

O que você mostrou

Você indicou que está seguindo uma convenção definida pelo maven, portanto, se você já estiver usando o maven, fique com esse layout. Não há absolutamente nada de errado com o layout que você descreveu.

Brandon
fonte
1

Bem, seu src / main / webapp certamente me lembra um projeto de maven. Qual é bom.

Para o my_app / jsps, não tenho certeza. Os desenvolvedores geralmente deixam seus jsp na pasta webapp ou, se você quiser fazer um pouco de mapeamento de URL, em um diretório webapp / jsp.

!Atenção! : Você nunca deve colocar um arquivo jsp em web-inf. Seu WEB-INF deve conter apenas arquivos xml para configurar seu site. Lembre-se, seu jsp é uma página da Web ou parte de uma página da Web.

Você pode usar o nome de pastas como modelo, parcial ... o que achar melhor para você. Deve ser fácil encontrar um estranho. Basta separar diferentes tipos de conteúdo, como páginas completas, modelos, visualizações parciais ...

Brice Ruppen
fonte
src / main / webapp contém o arquivo de layout WAR padrão e é lido pelo maven-war-plugin ao compilar um webapp Java.
Michael K
1
Não há razão para você não colocar JSPs no WEB-INF, desde que você tenha configurado servlets no seu web.xml que acabará encaminhando para eles. Essa é a maneira padrão de implementar um aplicativo Struts - todos os pedidos passam pelo servlet Struts, que os mapeia para uma ação e depois para um JSP.
Michael K
Concordo com o fato de que um jsp não deve ser acessado diretamente e impedir que isso seja considerado uma boa prática. Mas existem outros meios para fazer isso.
Brice Ruppen
1

Eu concordo com o Brice . Também sou iniciante no J2EE, mas acho que é melhor trabalhar fácil e claramente no começo.

A pasta raiz é WEBAPP, e você deve fazer com que sua estrutura da web pense que a maioria das páginas será localizada lá. Caso contrário, quando as páginas se comunicarem, provavelmente você não poderá gerenciar os relacionamentos de arquivos sem erros.

musef
fonte
1

Na verdade, o aplicativo WAR pode ser construído sem WEB-INF/web.xml. É possível criar aplicativo WAR apenas com classes Java dentro.

Fonte: Elementos do Descritor de Implantação web.xml

Com anotações Java EE, o descritor de implementação padrão web.xml é opcional. De acordo com a especificação do servlet 3.0 em http://jcp.org/en/jsr/detail?id=315 , as anotações podem ser definidas em determinados componentes da Web, como servlets, filtros, ouvintes e manipuladores de tags.

Hoje em dia é possível criar WAR do que parece com JAR com .warextensões :)

Respondendo à sua pergunta, a estrutura WAR depende de seus requisitos.

http://en.wikipedia.org/wiki/WAR_(Sun_file_format)

MᴀʀɪᴜsᴢS
fonte