2015-10-14 2 views
2

Я хочу написать SPA с AngularJS на стороне клиента и Java EE на стороне сервера. Если я правильно понимаю, идея для frontend состоит в том, чтобы создать страницу по умолчанию (назовем ее index.html) и реализовать маршрутизацию для обмена частями этой страницы по умолчанию. Таким образом, при каждом запросе загружается страница по умолчанию и логика маршрутизации заменяет его части в зависимости от контекста:Одностраничное приложение с Java EE/Wildfly: конфигурация на стороне сервера

<!-- index.html --> 
<html> 
    <body> 
     <!-- this block is replaced depending on context --> 
     <div ng-view></div> 
    </body> 
</html> 

<!-- page one --> 
<div> 
    <h1>Page One</h1> 
    <a href="/specific">Some specific stuff</a> 
</div> 

<!-- page two --> 
<div> 
    <h1>Page Two</h1> 
</div> 

Теперь логика маршрутизации может быть что-то вроде этого:

angular.module('myApp', []) 
    .config(['$routeProvider', function ($routeProvider) { 
     $routeProvider 
      .when('/', {templateUrl: 'pages/pageOne.html'}) 
      .when('/someSpecific', {templateUrl: 'pageTwo.html'}) 
      .otherwise({redirectTo: '/'}); 
    } 
]); 

Вопрос заключается в том, как связать это с Java EE и экземпляром сервера Wildfly? Если я объявлю index.html в качестве приветственной страницы и ничего не сделаю, прямые вызовы, такие как http://website.org/someSpecificContext, потерпят неудачу, потому что никакая страница не отображается на путь (и не должна быть), поэтому никакая страница и никакой угловой код не будут загружены. Если я сделаю перенаправление из всех возможных подпунктов в index.html в фильтр сервлета, информация о пути будет потеряна, поэтому каждый вызов будет завершен на странице индекса. Может быть, это глупый вопрос новичков, но я действительно застрял здесь и буду благодарен за любую помощь.

+0

вы не перенаправлять, вы просто всегда служить index.html ... думаю * виртуальные каталоги * – charlietfl

+0

charlieftl, не могли бы вы указать мне эту тему в терминах сервера? Это должно быть предварительно сконфигурировано сервер/приложение Java EE и как? – hoefling

+0

Я ничего не знаю о java ee ... google search, кажется, показывает много результатов, хотя для этого. Поскольку он стоит прямо сейчас, вы не используете 'html5Mode', поэтому все ваши угловые пути будут иметь' # 'в них и не будут иметь никакого влияния на сервер таким образом. Вам нужно только настроить сервер, если вы используете 'html5Mode' и используете довольно url без' # '. Подавать шаблоны любым способом, вы хотите – charlietfl

ответ

5

Я лично пользуюсь обработчиком rewrite для этого. К сожалению, не так много документации об этой функции. Вы можете найти информацию here, а также here. Вы должны в основном переписать те html 5 url, о которых знает только Angular, однако вам нужно ответить компонентом REST на стороне сервера (я полагаю, вы используете REST), когда Angular запрашивает данные бэкэнд. Ресурсы REST находятся в корневом пути /api. Это пример файла прибойный-handlers.conf быть помещены в папку WEB-INF:

regex['(.*/order/?.*?$)'] and not regex['(.*/api.*)'] -> rewrite['/index.html'] 
regex['(.*/billing/?.*?$)'] and not regex['(.*/api.*)'] -> rewrite['/index.html'] 
+0

Теперь вот такой ответ я ожидал. Я знал, что должна быть возможность использовать существующее решение, а не изобретать колесо. Спасибо, я попробую это в следующий понедельник и сообщит. – hoefling

+0

Да, я использую REST для передачи данных с сервера на клиент, и в идеале я бы реализовал только процедуры REST на стороне сервера, возможно, за ними была какая-то логика безопасности, но это все, все остальное должно обрабатываться богатым клиентом. Вот почему мне не нравится мое собственное решение, потому что он добавляет ненужный код на сервер и будет придерживаться вашего, если он будет работать нормально. – hoefling

+0

Ваше решение заслуживает того, чтобы быть переносным через сервер Java EE :-). Однако обработчики подносов предлагают очень гибкое решение. У вас есть разные типы обработчиков, которые вы можете использовать, например, для настройки заголовков HTTP-сообщений, статуса и т. Д. – Franck

0

Хорошо, вот как я справляюсь с этим. Это сервер-независимый, только файлы, изменяемые в вашем проекте Java EE:

  • Поместите все файлы в соответствующих каталогах:

    / (project's sources root) 
    | 
    -> js/ 
    -> css/ 
    -> webpages/ 
    -> etc 
    
  • Реализовать новый javax.servlet.Filter:

    public class FilterAccess implements Filter { 
        @Override 
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
         if (!(request instanceof HttpServletRequest)) { 
          return; 
         } 
         HttpServletRequest req = (HttpServletRequest) request; 
    
         if (isAllowed(req)) { 
          chain.doFilter(request, response); 
         } else { // forward every other request to index page 
          req.getRequestDispatcher("/pages/index.html").forward(request, response); 
         } 
        } 
    
        private boolean isAllowed(HttpServletRequest req) { 
         List<String> allowed = Arrays.asList("/webpages", "/js", "/css", ...); 
         for (String path : allowed) { 
          if (req.getServletPath().startsWith(path)) { 
           return true; 
          } 
         } 
         return false; 
        } 
    } 
    
  • Bind в файле web.xml:

    <filter> 
        <filter-name>FilterAccess</filter-name> 
        <filter-class>package.for.FilterAccess</filter-class> 
    </filter> 
    <filter-mapping> 
        <filter-name>FilterAccess</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    

В принципе, идея состоит в том, чтобы пересылать каждый запрос ресурса, который не лежит в одном из разрешенных каталогов, на главную страницу. Вы также можете переопределить функцию isAllowed по желанию, например. проверяя, заканчивается ли URL-адрес запроса .js, чтобы разрешить файлы javascript и т. д. Кроме того, код не очень чистый, можно объявлять разрешенные пути как константы или даже перемещать их во внешний файл ресурсов и т. д., но вы все равно получаете точку;)

Еще не принял мой собственный ответ, поскольку я до сих пор не знаю, правильно ли это при создании приложения с одной страницей с Java EE.