有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaTomcat,Grunt构建

我在angular js应用程序中使用grunt,在服务器端使用tomcat

只要需要,在dev env中,我就运行Grunt build,获取dist文件夹并将其放在TomcatWebApp文件夹中

然而,我有一个奇怪的问题。应用程序中的URL只有在我从HTML页面单击它们时才起作用

例如,如果我键入http://localhost:8080/upload,我将得到404 page not found error,但是如果从索引页-http://localhost:8080,我单击页面中的链接,可以上传它

有什么问题吗

如果我在节点上运行应用程序。js,链接工作完美!只是在Tomcat上,它没有按预期工作

已编辑

我在angular js中这样定义URL

angular.module('angularjsApp')
  .config(function ($stateProvider) {
    $stateProvider
      .state('upload', {
        url: '/upload',
        templateUrl: 'app/upload/upload.html',
        controller: 'UploadCtrl'
      });
  });

共 (3) 个答案

  1. # 1 楼答案

    这些链接是实际的标准HTML链接吗?如果Tomcat不响应http://localhost:8080/upload,那么它可能不是一个GET请求

  2. # 2 楼答案

    您使用历史推送状态导航的角度设置方式,更改浏览器的URL,而不会实际导致浏览器从后端重新获取其内容

    因此,在浏览器中使用推送状态可以很好地导航,但是当请求实际发送到服务器时,它会响应404,因为您没有任何东西可以提供HTML

    有两种解决方案:

    1. 切换到使用#!URL,以便从服务器上始终获得相同的URL(请参阅其他答案)
    2. 更新服务器,为所有路径提供相同的静态HTML(此答案)

    您需要一个servlet,它将返回您的初始HTML内容,以便对所有路由执行此操作-因此映射到/*,而不仅仅是/,因此它给出的任何路径都会返回相同的HTML

    所以你的网站。xml有一个servlet,看起来如下所示,返回:

    <servlet>
        <servlet-name>StaticHtmlServlet</servlet-name>
        <servlet-class>com.example.StaticHtmlServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>StaticHtmlServlet</servlet-name>
        <url-pattern>/</url-pattern>
        <url-pattern>/*</url-pattern> <!  so this is what's added  >
    </servlet-mapping>
    
  3. # 3 楼答案

    为了通过AngularJs服务器,然后在域后添加/#/,并确保html5模式默认启用为false$locationProvider.html5mode)。下面是您的应用程序从客户端站点提供内容的示例(angular js)

    http://localhost:8080/#/upload