最近接手了一个典型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

javaeett_dt_012

参考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/javaWEB-INF/classes
src/main/resourcesWEB-INF/classes
src/main/webapp/
src/main/webapp/WEB-INF/web.xmlWEB-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做信息系统的开发,对于小企业来说,我依旧觉得合适。不过就我目前接手的这个项目还是存在很多问题,主要如下:

  1. 使用Spring MVC作为开发框架,很多服务独立于Spring容器之外。
  2. 没有统一的日志服务,调试日志随意打印。
  3. 非必要的各种封装,大大小小的类都是一对一的接口和实现。
  4. 大量代码是用生成器生成的,枯燥且没有任何美感。
  5. 各种没有文档标注的全局变量、方法。
  6. 功能模块划分不合理。

上述的这些问题都是无关技术的,从这几个点上推敲,可以了解到这个项目前期是在某个脚手架上快速开发实现功能,过分的关注业务而忽视项目的可维护性,导致现在的困局。其他人员接手难度大,功能实现不稳定等。不过在业务驱动型的软件工程就是这个样子,等到无法维护的时候,就会推倒重来,再开一个新坑。