Spring MVC с AngularJs — перезагрузка браузера возвращает ресурс не найден

Основная проблема была в моем приложении SpringMVC, у меня есть index.jsp для загрузки. В angularJs я использовал $locationProvider из ngRoute, я полагаю (извините, я новичок в Angular). Допустим, у меня есть панель навигации, а именно nav1, nav2, nav2. Когда я щелкнул nav1, URL-адрес был index.ipxs/nav1, в котором частичный шаблон обычно отображается в моем div ng-view. Но когда я ВРУЧНУЮ ПЕРЕЗАГРУЖАЮ БРАУЗЕР, он говорит: «Запрос/ресурс не найден». Чего я хочу добиться, так это перенаправить на домашнюю страницу (index.ipxs/nav1) по умолчанию всякий раз, когда я перезагружаю браузер, даже если я сейчас нахожусь на странице index.ipxs/nav2 ИЛИ для отображения страницы, где бы я ни находился, и сохранить состояние страницы...

Вот мой код

**index.jsp**

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html ng-app="iPlexusApp">
<head>
<base href="/">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>iPlexus</title>

<spring:url value="/resources/css/main.css" var="mainCss" />
<spring:url value="/resources/js/bootstrap.min.js" var="bootstrapJs" />
<spring:url value="/resources/js/angular.js" var="angularJs" />
<spring:url value="/resources/js/app.js" var="appJs" />
<spring:url value="/resources/js/angular-route.js" var="angularRouteJs" />
<spring:url value="/resources/js/controllers/navController.js"
    var="navControllerJs" />
<spring:url value="/resources/css/bootstrap.min.css" var="bootstrapCss" />
<spring:url value="/resources/image/logo.png" var="logo" />
<spring:url value="/resources/partials/marketplace.jsp"
    var="marketplace" />
<spring:url value="/resources/partials/directory.jsp" var="directory" />
<spring:url value="/resources/partials/faq.jsp" var="faq" />

<link rel="stylesheet" href="${bootstrapCss}" />
<link rel="stylesheet" href="${mainCss}" />


</head>
<body>

    <nav class="navbar navbar-default navbar-static-top" role="navigation">
    <img id="appLogo" src="${logo}" />
    <div class="container">
        <%--        <div ng-controller="selectedNav" ng-include="'${navHeader}'"></div> --%>
        <div class="navbar-header">
            <button type="button" class="navbar-toggle collapsed"
                data-toggle="collapse" data-target="#navContents-navbar-collapse-1">

                <span class="icon-bar"></span> <span class="icon-bar"></span> <span
                    class="icon-bar"></span>
            </button>
        </div>

        <div ng-controller="navController" class="collapse navbar-collapse"
            id="navContents-navbar-collapse-1">
            <ul class="nav navbar-nav">
                <li ng-class="{active: isActive('/iPlexus/index.ipxs/marketplace')}"><a
                    href="/iPlexus/index.ipxs/marketplace"><span
                        class="glyphicon glyphicon-briefcase nav-icon"></span>Marketplace</a></li>
                <li ng-class="{active: isActive('/iPlexus/index.ipxs/directory')}"><a
                    href="/iPlexus/index.ipxs/directory"><span
                        class="glyphicon glyphicon-th-list nav-icon"></span>Directory</a></li>
                <li ng-class="{active: isActive('/iPlexus/index.ipxs/faq')}"><a
                    href="/iPlexus/index.ipxs/faq"><span
                        class="glyphicon glyphicon-question-sign nav-icon"></span>FAQ</a></li>
            </ul>
        </div>

        <div class="jumbotron">
            <h1>${message}</h1>
            <h1>{{5+5}}</h1>
        </div>
        <div ng-view></div>
    </div>
    </nav>

    <script
        src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="${bootstrapJs}"></script>
    <script src="${angularJs}"></script>
    <script src="${angularRouteJs}"></script>
    <script src="${appJs}"></script>
    <script src="${navControllerJs }"></script>
 <script>

 </script>
</body>
</html>

Основная проблема была в моем приложении SpringMVC, у меня есть index.jsp для загрузки. В angularJs я использовал $locationProvider из ngRoute, я полагаю (извините, я новичок в Angular). Допустим, у меня есть панель навигации, а именно nav1, nav2, nav2. Когда я щелкнул nav1, URL-адрес был index.ipxs/nav1, в котором частичный шаблон обычно отображается в моем div ng-view. Но когда я ВРУЧНУЮ ПЕРЕЗАГРУЖАЮ БРАУЗЕР, он говорит: «Запрос/ресурс не найден». Чего я хочу добиться, так это перенаправить на домашнюю страницу (index.ipxs/nav1) по умолчанию всякий раз, когда я перезагружаю браузер, даже если я сейчас нахожусь на странице index.ipxs/nav2 ИЛИ для отображения страницы, где бы я ни находился, и сохранить состояние страницы...

**app.js**

var iPlexusApp = angular
        .module('iPlexusApp', [ 'ngRoute' ])
        .config(
                [
                        '$routeProvider',
                        '$locationProvider',
                        function($routeProvider, $locationProvider) {
                            $routeProvider
                                    .when(
                                            '/iPlexus/index.ipxs/marketplace',
                                            {
                                                templateUrl : '/iPlexus/resources/partials/marketplace.jsp'
                                            });
                            $routeProvider
                                    .when(
                                            '/iPlexus/index.ipxs/directory',
                                            {
                                                templateUrl : '/iPlexus/resources/partials/directory.jsp'
                                            });
                            $routeProvider
                                    .when(
                                            '/iPlexus/index.ipxs/faq',
                                            {
                                                templateUrl : '/iPlexus/resources/partials/faq.jsp'
                                            });
                            $routeProvider.otherwise({
                                redirectTo : '/iPlexus/index.ipxs/marketplace'
                            });
                            $locationProvider.html5Mode({
                                enabled : true,
                                requireBase : false
                            });
                        } ]);

person marked.    schedule 20.01.2016    source источник
comment
какой у вас URL-шаблон настроен в web.xml?   -  person sdfacre    schedule 20.01.2016
comment
здесь: ‹servlet-mapping› ‹servlet-name›iplexus-dispatcher‹/servlet-name› ‹url-pattern›*.ipxs‹/url-pattern› ‹/servlet-mapping›   -  person marked.    schedule 20.01.2016
comment
Я не сторонник этой архитектуры. Проблема в том, что все URL-адреса ваших страниц перехватываются spring. есть ли причина, по которой вам нужно использовать jsp и пользовательский шаблон URL?   -  person sdfacre    schedule 20.01.2016
comment
Я просто играю с этой архитектурой, но, поскольку я уже пришел с springMVC, я хотел создать приложение, которое также поддерживает angularJS. Я прочитал некоторую документацию о $route.reload() или window.location.reload(), и она кажется многообещающей. Я попробую позже и посмотрю, что произойдет. Я также прокомментирую результат на случай, если кто-то столкнется с той же проблемой.   -  person marked.    schedule 20.01.2016
comment
Если вам действительно нужно придерживаться этой структуры, попробуйте сопоставить все шаблоны URL-адресов ‹url-pattern›/*‹/url-pattern› и посмотрите, сработает ли это? но вскоре вы можете столкнуться с другими проблемами, например, состояния, хранящиеся в Angular, исчезают после перезагрузки.   -  person sdfacre    schedule 21.01.2016
comment
Спасибо, но я нашел обходной путь, я использовал этот переписывание URL для того, чтобы перенаправить любое перенаправление непосредственно на сервере... мотыга, это помогает всем, у кого такая же проблема   -  person marked.    schedule 21.01.2016


Ответы (2)


Может быть, может быть поздно, но я нахожу ту же проблему, и это приложение возникает, потому что, когда вы обновляете страницу, вы отправляете запрос на Spring для URL-адреса, который он просто не знает, вы создали URL-адрес с угловым, который не является картой на сервере, вам просто нужно создать ресурс на сервере, который сопоставляет все ваши URL-адреса в приложении с вашей индексной страницей, например

    @RequestMapping(value = "/{[path:[^\\.]*}")
public String redirect() {
  return "forward:/";
}
person t3mplar83    schedule 26.03.2018

Спасибо, но я нашел обходной путь, я использовал этот перезапись URL, чтобы перенаправить любое перенаправление непосредственно на стороне сервера... надеюсь, это поможет всем, у кого есть такая же проблема.

person marked.    schedule 21.01.2016