JavaEE Web程序文件夹架构
最近接手了一个典型Java Web项目,使用的是Spring MVC框架,因为之前没有做过这类项目,不是很熟悉,了解之后就做了这一份笔记。
我使用了IntelliJ IDEA创建了一个Java EE工程并且模板使用Web application
,那么生成的文件目录如下:
├── demo.iml
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── some
│ │ └── pages
│ │ └── demo
│ │ └── HelloServlet.java
│ ├── resources
│ └── webapp
│ ├── index.jsp
│ └── WEB-INF
│ └── web.xml
└── test
├── java
└── resources
编译之后生成的文件如下:
├── index.jsp
├── META-INF
│ └── MANIFEST.MF
└── WEB-INF
├── classes
│ └── com
│ └── some
│ └── pages
│ └── demo
│ └── HelloServlet.class
└── web.xml
参考Packaging Web Archives,一个Web程序主要由下面几个部分组成:
- WEB-INF/classes 存放编译之后的类库,服务端逻辑代码部分。
- WEB-INF/lib 第三方依赖库。
- WEB-INF/web.xml 整个程序的描述文件,也是入口文件。
- META-INF/MANIFEST.MF 程序的打包信息等。
- index.jsp 这个是程序模板带来的文件,其实在上述两个目录之外,剩下的都是网页资源,可以是静态资源(css、js、img),也可以是
jsp
文件
使用默认模板编译部署时,源文件和生成文件对应的关系,但是这些都是可以根据自己喜欢,存放在合适的地方,不过推荐按照这样的规则存放和部署。
源文件 | 输出目录 |
---|---|
src/main/java | WEB-INF/classes |
src/main/resources | WEB-INF/classes |
src/main/webapp | / |
src/main/webapp/WEB-INF/web.xml | WEB-INF/web.xml |
查看WEB-INF/web.xml文件内容,没有发现编写mapping,在Servlet 3.0的时候就可以用@WebServlet
代替web.xml里面的mapper,同样的注解还有@WebFilter
/@WebListener
。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
查看src/main/java/com/some/pages/demo/HelloServlet.java,这是一个典型http框架里面的Controller,并不陌生。
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
private String message;
public void init() {
message = "Hello World!";
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
public void destroy() {
}
}
大概了解一下这些内容,加上一定的java基础,开发项目问题不大。即使2021年使用JavaEE加上jsp做信息系统的开发,对于小企业来说,我依旧觉得合适。不过就我目前接手的这个项目还是存在很多问题,主要如下:
- 使用Spring MVC作为开发框架,很多服务独立于Spring容器之外。
- 没有统一的日志服务,调试日志随意打印。
- 非必要的各种封装,大大小小的类都是一对一的接口和实现。
- 大量代码是用生成器生成的,枯燥且没有任何美感。
- 各种没有文档标注的全局变量、方法。
- 功能模块划分不合理。
上述的这些问题都是无关技术的,从这几个点上推敲,可以了解到这个项目前期是在某个脚手架上快速开发实现功能,过分的关注业务而忽视项目的可维护性,导致现在的困局。其他人员接手难度大,功能实现不稳定等。不过在业务驱动型的软件工程就是这个样子,等到无法维护的时候,就会推倒重来,再开一个新坑。