Java Web应用程序文件夹结构


18

作为J2EE的初学者,我最近开始使用J2EE的核心:Servlets&Jsps从头开始开发自己的项目。

我无法评估我的项目文件夹结构是否正确。这是我的项目文件夹结构。 在此处输入图片说明

在问问题之前,我承认我无法回答,也无法证明有人问我为什么使用这种文件夹结构。问题:将我的jsps放在web-inf之外是一个好兆头。如果没有,为什么会这样呢?如果是,为什么?

J2EE Web应用程序是否有任何标准的文件夹结构约定,我知道maven提出了一些标准,但是我们仍然可以根据我认为的要求进行自定义。

我做了一些谷歌搜索,找到了两个参考 1 2

答案不在同一页上,因此无法得出任何结论。

布局J2EE Web应用程序的文件夹结构时要考虑哪些要点,重要的是,应该将Jsps静态内容放入&为何?



我强烈建议您研究MVC理论- 维基百科文章上有一些很好的资源。如果您想在Java Webapp中尝试使用MVC,Stripe是一个出色的轻量级框架,可以为您提供该体系结构的概述。
Michael K


Answers:


7

WAR文件的标准结构为:

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

Maven使用src / main / java,资源,webapp以及maven-webapp-plugin中的依赖项(将它们放在/ lib中)为您生成了代码,但这就是实现。重要的是要意识到,您放置在WEB-INF中的任何内容都不能从外部访问,而WAR根目录中的所有内容都是公共的。

通常,您不想在根目录中放很多,因为您希望应用程序使用您在web.xml中定义的servlet和过滤器来处理所有访问。常见的是在根目录中看到一个index.html(或.jsp)重定向到servlet,例如Struts操作。

诸如Stripes或Struts之类的典型MVC实现建议用户不要直接访问JSP,而建议JSP仅是视图。他们建议创建在处理请求后转发给JSP的控制器,而JSP仅呈现结果。例如,提交表单/login将运行将处理登录请求,创建用户会话并将用户转发到主页JSP的登录视图的操作。


5

通常的回答是“正确的方法是什么?” 或“这是正确的方法吗?” 是..... 这取决于

我所能做的就是告诉您特定想法的利弊。接下来是100%我的意见。我不知道任何特定要求或规则。我敢肯定有人会不同意我。

JSP的

让我们研究是否将JSP放在WEB-INF中。

将JSP放入WEB-INF的优点:

  • 您可以控制JSP的执行方式。如果您希望对JSP进行参数化和可重用(无论如何,使用JSP确实很难),则可以将它们放入WEB-INF并使用servlet或Struts操作控制器或其他前端控制器进行预处理。然后将控制权传递给JSP,并在正确的环境上下文中传递(例如请求属性,任何安全检查,参数清除等)。
  • 您可以以编程方式甚至在防火墙或IDS级别阻止对* .jsp的HTTP请求,以减少有人将JSP上传到Web根目录,然后能够作为Web服务器执行代码的可能性。他们必须重写现有的JSP。这不会带来巨大的安全收益,但确实会使折衷稍微困难一些。
  • 养成良好的习惯,例如MVC,前端控制器,servlet过滤器,依赖项注入等,而不是大型怪异的JSP自己完成所有工作并且难以读取/维护。

将JSP放入WEB-INF的缺点:

  • 您不能直接访问该页面,即使该页面是简单的独立页面也不需要预先处理。这是因为/ WEB-INF下的文件不能由servlet容器提供。

静态文件

对于纯静态文件(如HTML,图像,样式表,javascript等),请将其放在Web根目录下(在您的情况下为my_app),但不放在/ WEB-INF下(因为无法访问)。

整体布局

至于整体目录布局,它在某种程度上取决于您的构建过程。我喜欢将所有内容都存储在“ src”或“ source”下,因为它可以清楚地显示出哪些文件是通过构建生成的,哪些是纯源文件。 main使您可以将junit类之类的测试代码与主要源代码分开,这也很好。但是,如果您没有任何单元测试(哦,不!),那么这是毫无意义的区别。

另一方面,如果在构建过程中根本不操纵Web根目录(例如,它是所有JSP和静态文件),则可能将其保留在顶层,例如/webroot/deploy根据需要复制文件,例如.class或.jar文件。人类(尤其是开发人员)过度组织是一种习惯。过度组织的一个好迹象是只有一个子文件夹的文件夹很多。

你所显示的

您已经表明您正在遵循由maven设置的约定,因此,如果您已经在使用maven,请坚持使用该布局。您描述的布局绝对没有错。


1

好吧,您的src / main / webapp肯定使我想起了一个maven项目。哪个好

对于my_app / jsps,我不确定。开发人员通常将其jsp保留在webapp文件夹中,或者如果您想进行一点URL映射,则保留在webapp / jsp目录中。

!警告!注意:永远不要将jsp文件放在web-inf中。您的WEB-INF应该只包含xml文件来配置您的网站。请记住,您的jsp是网页或网页的一部分。

您可以使用文件夹名称(例如模板,部分文件夹...)来满足您的需要。对于一个陌生人来说应该很容易找到。只需分隔不同类型的内容,例如整页,模板,局部视图...


src / main / webapp包含标准的WAR布局文件,并且在编译Java webapp时由maven-war-plugin读取。
Michael K

1
只要您在web.xml中配置了最终将转发给它们的servlet,就没有理由不应该将JSP放入WEB-INF。这是实现Struts应用程序的标准方法-所有请求都通过Struts Servlet,该Servlet将它们映射到一个动作,然后映射到一个JSP。
Michael K

我同意以下事实:不应直接访问jsp,并应将其视为良好做法。但是还有其他方法可以做到这一点。
Brice Ruppen 2014年

1

同意布莱斯的观点。我也是J2EE的初学者,但我认为一开始最好轻松易懂地工作。

根文件夹是WEBAPP,您应该使您的Web结构以为大多数页面都位于该位置。如果不是这样,则当页面之间进行通信时,您可能无法正确管理文件关系。


1

实际上,无需构建WAR应用程序即可WEB-INF/web.xml。使用内部仅包含Java类的WAR应用程序是可能的。

来源:一个web.xml部署描述符元素

使用Java EE批注,标准的web.xml部署描述符是可选的。根据http://jcp.org/en/jsr/detail?id=315上的Servlet 3.0规范,可以在某些Web组件(例如Servlet,过滤器,侦听器和标记处理程序)上定义注释。

因此,如今可以构建比看起来像带有.war扩展名的JAR的WAR :)

回答您的问题,WAR结构取决于您的要求。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.