当把一个SPA(没有Java代码)打包成一个WAR时,如何为每个URL提供index.html,除了那些与实际资产文件相匹配的URL?

问题描述 投票:2回答:1

我有一个单页的web应用,当建立后必须安装到java-ee应用服务器中,比如Glassfish。也就是说,我应该把它打包成一个WAR。

这个单页web应用和它的后台应用是强烈分离的,它应该是可以自己构建和部署的。也就是说,WAR只应该并且将包括单页web应用。

如果可能的话,我希望在没有任何Java代码的情况下解决这个问题。

在单页应用程序的情况下,URL路由的功能应该是这样的。

  1. 如果请求的URL符合一个静态资产文件(html,js,css等),那么这个文件就应该被服务。

  2. 在任何其他情况下 index.html 应该被服务。

当第二点不适用时,应用程序(默认情况下)只能在其入口点(index.html). 而不是用直接指向任何子路由的URL。

有一个变通的方法,因为在Ember.js中可以设置一个选项来使用基于哈希的子路由URLs,但这有一个限制性的缺点,我想完全避免。但这有其限制性的缺点,我想完全避免。

然而我目前的解决方案是只有开启上述变通方法才行。我使用的是maven和 maven-assembly-plugin 来实现这一目标。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>My App</name>
  <build>
    <finalName>finalName</finalName>
    <plugins>
      <plugin>
        <!-- assemble static content -->
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptors>
            <descriptor>static.xml</descriptor>
          </descriptors>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

静态.xml

(dist 是ember-cli放置编译好的assets的目录,我需要将其包含在内)。)

<?xml version="1.0" encoding="UTF-8"?>
<assembly>
  <id>static</id>
  <formats>
    <format>war</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
    <fileSet>
      <directory>dist</directory>
      <includes>
        <include>**</include>
      </includes>
      <excludes>
        <exclude>WEB-INF/*</exclude>
      </excludes>
      <outputDirectory>/</outputDirectory>
    </fileSet>
    <fileSet>
      <directory>WEB-INF</directory>
      <includes>
        <include>**</include>
      </includes>
      <outputDirectory>/WEB-INF</outputDirectory>
    </fileSet>
  </fileSets>
</assembly>

我在WEB-INF文件夹里也有一个web.xml,但这个基本上是空的。

<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_3_1.xsd" version="3.1">

</web-app>

所以总结一下问题。有没有可能在不写任何Java代码的情况下,也就是在没有任何 "胶合 "或 "中间人 "服务器端模块的情况下,实现上述路由逻辑?

maven jakarta-ee build single-page-application war
1个回答
0
投票

我可以让它工作(我的前端是angular,但只要不挑剔返回状态404,其他的都可以工作)。我的web.xml。

<web-app version="4.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
  <error-page>
    <error-code>404</error-code>
    <location>/index.html</location>
  </error-page>
</web-app>

意思是:当找不到资源时(不是servlet,不是jsp,不是静态文件,也不是其他),就把 "index.html "作为404页面。

不过有两个缺点:1.你的应用碰巧问到了任何资源,而服务器没有(无论是图片、样式表还是其他),都会得到一个完整的index.html的响应;2.在404之后得到一个完全正常的应用可能会有点误导(对浏览器)。

© www.soinside.com 2019 - 2024. All rights reserved.