我有一个单页的web应用,当建立后必须安装到java-ee应用服务器中,比如Glassfish。也就是说,我应该把它打包成一个WAR。
这个单页web应用和它的后台应用是强烈分离的,它应该是可以自己构建和部署的。也就是说,WAR只应该并且将包括单页web应用。
如果可能的话,我希望在没有任何Java代码的情况下解决这个问题。
在单页应用程序的情况下,URL路由的功能应该是这样的。
如果请求的URL符合一个静态资产文件(html,js,css等),那么这个文件就应该被服务。
在任何其他情况下 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代码的情况下,也就是在没有任何 "胶合 "或 "中间人 "服务器端模块的情况下,实现上述路由逻辑?
我可以让它工作(我的前端是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之后得到一个完全正常的应用可能会有点误导(对浏览器)。