首页 > 编程语言 >【Java教程】Day21-13 Web开发:Web应用的文件结构与静态资源处理

【Java教程】Day21-13 Web开发:Web应用的文件结构与静态资源处理

时间:2025-01-07 19:03:10浏览次数:3  
标签:Web Java 处理 文件 静态 Day21 Nginx static

在开发 Java Web 应用程序时,除了常见的 Servlet 和 Filter 等逻辑组件外,还需要处理诸如 JSP 这样的视图文件和一些静态资源文件,如 CSSJS 等。合理组织 Web 应用的文件结构至关重要,它能够提升开发效率,方便后期维护,并确保应用在生产环境中的高效运行。

1. Web 应用程序的文件结构设计

一个标准的 Java Web 应用程序通常包含如下几个核心部分:

csswebapp├── pom.xml└── src    └── main        ├── java        │   └── com        │       └── itranswarp        │           └── learnjava        │               ├── Main.java        │               ├── filter        │               │   └── EncodingFilter.java        │               └── servlet        │                   ├── FileServlet.java        │                   └── HelloServlet.java        ├── resources        └── webapp            ├── WEB-INF            │   └── web.xml            ├── favicon.ico            └── static                └── bootstrap.css

 

1.1 pom.xml

该文件是 Maven 构建工具的配置文件,包含了项目依赖、插件等信息,方便管理项目构建和依赖。

1.2 src/main/java

此目录下存放的是 Java 源代码文件,包括 Servlet、Filter 等 Java 类。

1.3 src/main/resources

存放的是一些资源文件,诸如配置文件、日志文件等。

1.4 src/main/webapp

这是 Web 应用程序的核心目录,包含了 WEB-INF 配置文件和静态资源文件。

  • WEB-INF/web.xml:Web 应用的配置文件,用于定义 Servlet、Filter、Listener 等组件。

  • favicon.ico:浏览器访问应用时显示的图标。

  • static:用于存放静态资源(如 CSS、JS、图片等)。

2. 处理静态资源

在开发阶段,我们通常将所有的静态资源文件放入 /static 目录。在某些 Web 服务器中,可能会有专门的 Servlet 来处理静态文件的请求,但如果 IndexServlet 映射路径为 /,它就会屏蔽掉静态文件的处理逻辑。因此,我们需要编写一个自定义的 FileServlet 来处理静态文件。

2.1 FileServlet 示例

下面是一个简单的 FileServlet 实现:

java@WebServlet(urlPatterns = "/static/*")public class FileServlet extends HttpServlet {    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        ServletContext ctx = req.getServletContext();        // RequestURI包含ContextPath,需要去掉:        String urlPath = req.getRequestURI().substring(ctx.getContextPath().length());        // 获取真实文件路径:        String filepath = ctx.getRealPath(urlPath);        if (filepath == null) {            // 无法获取到路径:            resp.sendError(HttpServletResponse.SC_NOT_FOUND);            return;        }        Path path = Paths.get(filepath);        if (!path.toFile().isFile()) {            // 文件不存在:            resp.sendError(HttpServletResponse.SC_NOT_FOUND);            return;        }        // 根据文件名猜测Content-Type:        String mime = Files.probeContentType(path);        if (mime == null) {            mime = "application/octet-stream";        }        resp.setContentType(mime);        // 读取文件并写入Response:        OutputStream output = resp.getOutputStream();        try (InputStream input = new BufferedInputStream(new FileInputStream(filepath))) {            input.transferTo(output);        }        output.flush();    }}

 

2.2 解释

在这个例子中,FileServlet 监听 /static/* 路径,并读取 static 目录下的静态资源文件。doGet() 方法从请求中获取文件路径,读取文件并写入响应中。ServletContext 用于获取 Web 应用的真实路径,Files.probeContentType() 用于根据文件类型设置 Content-Type

3. 生产环境的静态资源处理

3.1 静态资源的生产部署

类似 Tomcat 的 Web 服务器通常用于运行 Web 应用程序,它们并不擅长处理静态文件。因此,在生产环境中,通常会使用 Nginx 作为反向代理服务器,来专门处理静态文件的请求,减轻 Tomcat 的负担。

3.2 使用 Nginx 作为反向代理

在生产环境中,我们通常采用以下架构:

markdown             ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐             │  /static/*            │┌───────┐      ┌──────────▶ file│Browser├────┼─┤                     │    ┌ ─ ─ ─ ─ ─ ─ ┐└───────┘      │/          proxy_pass             │ └─────────────────────┼───▶│  Web Server │                       Nginx             └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘    └ ─ ─ ─ ─ ─ ─ ┘

 

3.3 Nginx 配置示例

以下是一个配置文件示例,展示了如何使用 Nginx 配合 Tomcat 处理静态资源:

nginxserver {    listen 80;    server_name www.local.liaoxuefeng.com;    # 静态文件根目录:    root /path/to/src/main/webapp;    access_log /var/log/nginx/webapp_access_log;    error_log  /var/log/nginx/webapp_error_log;    # 处理静态文件请求:    location /static {    }    # 处理favicon请求:    location /favicon.ico {    }    # 不允许请求/WEB-INF:    location /WEB-INF {        return 404;    }    # 其他请求转发给Tomcat:    location / {        proxy_pass       http://127.0.0.1:8080;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-Proto $scheme;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    }}

 

3.4 配置说明

  • location /static:Nginx 负责直接处理静态资源请求。

  • location /favicon.ico:处理浏览器的 favicon 请求。

  • location /WEB-INF:禁止访问 WEB-INF 目录。

  • location /:将其他请求转发给 Tomcat 处理。

4. 练习

  • 使用 Nginx 配合 Tomcat 部署一个 Java Web 应用,确保静态资源能够由 Nginx 直接处理,其他动态请求交由 Tomcat 处理。

5. 小结

在开发 Java Web 应用时,合理组织文件结构对于开发和维护至关重要。开发模式下,需要便捷的静态资源处理方式,而生产模式下,需要高效的静态资源处理能力和反向代理配置。通过 Nginx 和 Tomcat 的组合,可以充分利用 Nginx 高效的静态资源处理能力,同时将动态请求交给 Tomcat 处理,极大提升 Web 应用的性能和可靠性。

 

 

标签:Web,Java,处理,文件,静态,Day21,Nginx,static
From: https://blog.csdn.net/max202011161630/article/details/144857176

相关文章

  • 【Java教程】Day21-01 Web开发:深入HTTP协议与简单HTTP服务器编写
    今天,我们访问网站、使用App时,基本上都基于Web架构,这种架构叫做Browser/Server模式,简称BS架构。BS架构的核心特征在于,客户端仅需一个浏览器,所有应用程序的逻辑和数据都存储在服务器端。客户端通过浏览器发出请求,服务器将Web页面返回并展示给用户。Web页面通常具有很强的交互性,H......
  • 【Java教程】Day20-21 设计模式:行为型模式——策略模式
    1.引言策略模式(StrategyPattern)是一种行为型设计模式,它定义了一系列的算法,将它们封装起来,并使得它们可以相互替换。策略模式的主要目的是使得算法可以独立于使用它的客户而变化。它常用于需要根据不同条件选择不同算法的场景。在Java的标准库中,策略模式得到了广泛的应用,特......
  • @Slf4j 是java里的什么作用
    @Slf4j 是Lombok库提供的一个注解,用于自动生成一个名为 log 的 Logger 实例。Lombok是一个Java库,旨在通过注解减少样板代码(boilerplatecode),使得Java代码更加简洁和易读。主要作用简化日志记录:使用 @Slf4j 注解后,你不需要手动创建 Logger 实例,Lombok会自......
  • java 纤程简介
    在Java中,“纤程”(Fiber)是一种轻量级线程的实现,用于提高多线程计算的效率。纤程的设计目的是减少线程的上下文切换开销,并允许在同一线程上并发执行多个任务。尽管Java目前没有直接支持纤程的标准实现,但随着ProjectLoom的推进,Java正在向支持纤程的方向发展。1.Project......
  • 使用 WebGL 绘制一个简单的点和原理解析
    使用WebGL绘制一个简单的点,我们需要通过WebGL的管线来进行一系列的步骤。以下是实现的详细步骤和原理解析:WebGL绘制点的基本步骤初始化WebGL上下文首先,我们需要获取WebGL上下文,这样才能进行所有的绘图操作。通常,WebGL上下文是通过<canvas>元素获取的。编......
  • 企业级Java 实体对象类定义规范
    1.查询参数类(Query)命名规则:xxxQuery.java用途:用于封装查询操作的请求参数,通常包含分页、过滤、排序等字段。与数据库查询或API请求紧密相关。示例:ProductQuery.java、UserQuery.java使用场景:查询条件的封装,发送查询请求时使用。2.返回参数类(VO)命名规则......
  • Java Spring Boot实现基于URL + IP访问频率限制
    点击下载《JavaSpringBoot实现基于URL+IP访问频率限制(源代码)》1.引言在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段。为了保护系统资源,防止服务器过载或服务不可用,需要对接口的访问频率进行限制。本文将介绍如何使用SpringBoot实现基于URL......
  • Java 异常机制详解:类型、原理、关键字与最佳实践
    异常是Java程序开发中必须掌握的一部分。正确地处理异常不仅可以提高代码的健壮性,还能让程序更易维护。本篇文章将详细讲解Java异常的体系结构、常见类型、关键字的使用及最佳实践,帮助你全面掌握Java异常处理。......
  • 大学生HTML5期末作业 Web前端网页制作 html5+css3+js html+css+js网页设计 体育 腾讯
    大学生HTML5期末作业Web前端网页制作html5+css3+jshtml+css+js网页设计体育腾讯体育7个页面网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode、Sublime、Webstorm、Text、Notepad++等任意html编辑软件进行运行及修改编辑等操作)。获取源码1......
  • 大学生HTML5期末作业 html+css网页制作 新闻 自定义新闻主题2个页面 Web前端网页制作
    大学生HTML5期末作业html+css网页制作新闻自定义新闻主题2个页面Web前端网页制作html5+css3+js网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode、Sublime、Webstorm、Text、Notepad++等任意html编辑软件进行运行及修改编辑等操作)。获取源......