Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSF & Spring MVC ViewResolver 
V
    Опции темы
MisterCleric
Дата 11.2.2010, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет всем.
Сначала опишу, что есть.
1. View на JSF Faceletes
2. Вся JSF-конфигурация происходит через делегацию Spring.
3. Все, что дальше, думаю, понятно - бизнес-логика вызваеться Spring'ом

Так вот стала такая задача: 
Появилось несколько заказчиков на приложение - и от начальства поступило желание максимально быстро адаптировать его под каждого. При чем разработка ведется на всех сразу.
В большинстве своем разница всего лишь во внешнем виде: тема и расположение элементов на странице. Т.е. бизнес логика от заказчика к заказчику не меняется: одно и тоже, но картинка разная.
Сами страницы мы разрабатываем так, что бы они максимально обслуживали дискретную порцию бизнес-данных. Т.е. если требуется отобразить список депозитов пользователя в виде списка, то так страница и называется. Просто она может от заказчика к заказчику по разному выглядеть, например, разные колонки этой таблицы хотят.
А также возможна ситуация, что некоторые странички будут у них одинаковыми. Но в дальнейшем, если пожелает, что-то один из заказчиков поменять, мы должны максимально быстро ему предоставить такой интерфейс, при этом не затрагивая того, который будет для остальных.

В общем, идея такая:
 Положить все странички в одну папку, в этой же папке для каждого заказчика создать подпапку, которая как-то будет его идентифицировать, а мы этот идентификатор будет получать при старте приложения уже на сервере у заказчика. В папочку заказчика положить копию страницы из корня и по его желанию "разметить".
Так вот необходимо реализовать такой механизм получения этих страниц по такому принципу: попытаться найти страничку в папке заказчика, если нет, достать ее из корня.

А вопрос у меня такой: возможно ли реализовать такой алгоритм, используя Spring MVC ViewResolver? Просто пока еще не сталкивался с ним: всегда хватало JSF. Я документацию почитал и исходники посмотрел. Сам пока ничего не пробовал: лень писать, если не уверен в решении. Возможно можно как-то используя UrlRewrite. И да самому можно написать. Но я больше склоняюсь к уже готовым решениям. 

Спасибо


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
garbuz
Дата 11.2.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Не знаю как в спринге в JSF дело обстоит, но всегда есть возможность расширить имеющийся резолвер, основная задача которого находить нужный тебе view. 
Как-то расширял AbstractCachingViewResolver, метод loadView, для работы с ajax'ом. Посмотри его.
А при работе с JSF какой резолвер используется?

PM MAIL   Вверх
MisterCleric
Дата 11.2.2010, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

А при работе с JSF какой резолвер используется?

А никакой. Сейчас вообще нет конфигурации 
Код

<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>


Из jsf вызываются бины как и обычно, только берутся они со SrpingContext

Это сообщение отредактировал(а) MisterCleric - 11.2.2010, 16:38


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
garbuz
Дата 11.2.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



MisterCleric, ну вьюхами в JSF наверно не бины являются - jsp, velociry шаблоны, какие-то штуки jsf'a? Я просто про jsf ваще не в курсе.
PM MAIL   Вверх
MisterCleric
Дата 12.2.2010, 13:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Так, ну что. Вот мое решение:
1. Как я изначально и говорил, структура папок war'ника примерно такая:
      / 
       page1.xhtml
       page2.xhtml
       /client1/
                 page1.xhtml
       /client2/
2. Переход на эти ресурсы осуществляеться через виртуальный контекст, например так:
Код

<a4j:include viewId="/view/page1"/>


3. Web.xml на этот виртуальный контекст выходит такой:
Код

    <servlet>
        <servlet-name>viewResolver</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>viewResolver</servlet-name>
        <url-pattern>/view/*</url-pattern>
    </servlet-mapping>


4. Сам конфиг этого сервлета:
viewResolver-servlet.xml
Код

     <context:property-placeholder location="classpath*:my-props.properties"/>

   <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="defaultHandler">
            <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
        </property>
    </bean>

    <bean class="my-com.my-proj.web.spring.MyInternalResourceViewResolver">
        <property name="order" value="1"/>
        <property name="prefix" value="/${clientId}/"/>
        <property name="suffix" value=".xhtml"/>
    </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="suffix" value=".xhtml"/>
    </bean>

clientId получаю при старте приложения, и это являеться именем папки, где лежат странички под этого клиента
5. Сам MyInternalResourceViewResolver такой:
Код

public class MyInternalResourceViewResolver extends InternalResourceViewResolver {
    
    protected AbstractUrlBasedView buildView(String viewName) throws Exception {
        AbstractUrlBasedView view = super.buildView(viewName);
        WebApplicationContext applicationContext = (WebApplicationContext) getApplicationContext();
        ServletContext servletContext = applicationContext.getServletContext();
        URL url = servletContext.getResource(view.getUrl());
        return url != null ? view : null;
    }
}


Т.е. я просто проверяю есть ли ресурс с таким именем по указанному пути. Если нет, то из-за view == null произойдет передача управления слудующему ViewResolver, который прочитает ресурс из корня. Ну вот, собственно, и все.
Может кому-нибудь будет полезно.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
sergioK
Дата 13.2.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 207
Регистрация: 15.2.2008

Репутация: нет
Всего: нет



Цитата(MisterCleric @ 11.2.2010,  16:06)
Привет всем.
 Просто она может от заказчика к заказчику по разному выглядеть, например, разные колонки этой таблицы хотят.

В общем, идея такая:
 Положить все странички в одну папку, в этой же папке для каждого заказчика создать подпапку, которая как-то будет его идентифицировать, а мы этот идентификатор будет получать при старте приложения уже на сервере у заказчика. В папочку заказчика положить копию страницы из корня и по его желанию "разметить".
Так вот необходимо реализовать такой механизм получения этих страниц по такому принципу: попытаться найти страничку в папке заказчика, если нет, достать ее из корня.

А вопрос у меня такой: возможно ли реализовать такой алгоритм, используя Spring MVC ViewResolver? Просто пока еще не сталкивался с ним: всегда хватало JSF. Я документацию почитал и исходники посмотрел. Сам пока ничего не пробовал: лень писать, если не уверен в решении. Возможно можно как-то используя UrlRewrite. И да самому можно написать. Но я больше склоняюсь к уже готовым решениям. 

Спасибо

A не проще  типа Selection fields и там заказчит выберет нужные ему поля ,
можно заготовить 2-3 варианта  стандартных отображений и пусть каждый выбирает то что ему нравиться 



PM MAIL   Вверх
MisterCleric
Дата 14.2.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

можно заготовить 2-3 варианта  стандартных отображений и пусть каждый выбирает то что ему нравиться 


а кто за эти 2-3 варианта заплатит? Таково требование от начальства: решать проблемы по мере их поступления.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.