HTML5 模式下的 AngularJS + Java

Posted

技术标签:

【中文标题】HTML5 模式下的 AngularJS + Java【英文标题】:AngularJS + Java in HTML5 mode 【发布时间】:2014-10-03 10:24:14 【问题描述】:

我正在编写一个系统,其中前端使用 AngularJS,后端使用带有 Jersey 的 Java。

但我在使用 $locationProvider.html5Mode (true); 删除 url 中的“#”时遇到问题。

如果我单击页面上的链接,则会显示正确的视图。但是如果我按 F5 或在浏览器中复制并粘贴 URL,服务器会查找不存在的资源并说它不可用。

我无法在服务器上重定向到 webapp 入口点的链接,例如此处请求的https://docs.angularjs.org/guide/$location。

另外,我尝试按照他们在此处所说的关于 servlet AngularJS HTML5 Mode - How do direct links work without server specific changes? 的方法进行操作,但对我来说它不起作用。

有人知道如何让它工作吗?

在 NodeJS 中,它将使用 app.use ('/', express.static (__ dirname + '/ public')) ;

下面是我正在使用的代码:

appRoutes.js

angular.module('appRoutes', [])

.config(
        [ '$routeProvider', '$locationProvider',
                function($routeProvider, $locationProvider) 

                    $routeProvider

                    .when('/', 
                        templateUrl : 'views/home.html',
                        controller : 'HomeController'
                    )

                    .when('/login', 
                        templateUrl : 'views/login.html',
                        controller : 'LoginController'
                    ).otherwise(
                        redirectTo : '/'
                    );

                    $locationProvider.html5Mode(true);

                 ])

.run(function($rootScope, $location, Login) 
    $rootScope.$on("$locationChangeStart", function(event, next, current) 
        if (!Login.isLogged()) 
            $location.path('/login');
        
    );
);

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

    <servlet>
        <servlet-name>Resources</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>sammubr.resources</param-value>
        </init-param>

        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>sammubr.filtro.FiltroSeguranca;org.glassfish.jersey.filter.LoggingFilter</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Resources</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Login</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>sammubr.authenticate</param-value>
        </init-param>

    </servlet>
    <servlet-mapping>
        <servlet-name>Login</servlet-name>
        <url-pattern>/authenticate/*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>Logout</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>sammubr.logout</param-value>
        </init-param>

    </servlet>
    <servlet-mapping>
        <servlet-name>Logout</servlet-name>
        <url-pattern>/logout/*</url-pattern>
    </servlet-mapping>

</web-app>

index.html

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<base href="/" />

<title>SampleApp</title>

<!-- CSS -->
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">

</head>
<body ng-app="sampleApp" ng-controller="MainController">
    <div class="container">

        <!-- ANGULAR DYNAMIC CONTENT -->
        <div ng-view></div>

    </div>

    <!-- ANGULARJS -->
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.21/angular.min.js"></script>
    <script src="libs/angular-bootstrap/ui-bootstrap-tpls-0.11.0.min.js"></script>
    <script src="libs/angular-route/angular-route.min.js"></script>
    <script src="libs/angular-cookie/angular-cookies.min.js"></script>

    <!-- CUSTOM JS -->
    <script src="js/app.js"></script>
    <script src="js/appRoutes.js"></script>

    <script src="js/controllers/MainCtrl.js"></script>
    <script src="js/controllers/HomeCtrl.js"></script>

    <script src="js/controllers/LoginCtrl.js"></script>
    <script src="js/services/LoginService.js"></script>

    <script src="js/services/Usuarioservice.js"></script>
    <script src="js/services/UsuarioService.js"></script>
    <script src="js/controllers/UsuarioListCtrl.js"></script>
    <script src="js/controllers/UsuarioItemCtrl.js"></script>
</body>
</html>

【问题讨论】:

这是服务器端问题。如果要使用 HTML5 模式,则必须配置服务器以将所有不是 API 或静态文件的请求重写到应用程序的入口点。它不像默认的 hashbang 模式那么简单。 我知道。这是我的问题:我无法在基于 Java 的服务器中执行此操作。 【参考方案1】:

尝试使用ocpsoft rewrite。

按照说明安装它,然后使用您的入口点和 url 添加配置类。

@RewriteConfiguration
public class RewriteUrlConfigurationProvider extends HttpConfigurationProvider 
  @Override
  public Configuration getConfiguration(ServletContext servletContext) 
    return ConfigurationBuilder.begin()
        .addRule(Join.path("/registration").to("/index.html"))
        .addRule(Join.path("/department/id").to("/index.html")).where("id").matches("[0-9]+");
  

  @Override
  public int priority() 
    return 10;
  

【讨论】:

以上是关于HTML5 模式下的 AngularJS + Java的主要内容,如果未能解决你的问题,请参考以下文章

sh AngularJS HTML5模式/ Apache配置

AngularJS在HTML5模式下路由404错误

AngularJS:无法使用 ui-route $state 获取 html5 模式网址

.htaccess 用于具有 HTML5 模式的 AngularJS 应用程序的子文件夹

具有 HTML5 模式和 ASP.Net MVC 的 AngularJS 可选 URL 参数

apache_conf .htaccess在Media Temple上以HTML5模式使用AngularJS