Доступ к Spring MVC бобы DI от jsp

В некоторых платформах MVC можно назвать действие контроллера от представления, если Вы хотите выполнить некоторый код и представить некоторое частичное представление. Я не уверен, что корректный путь состоит в том, чтобы сделать это в Spring MVC

Я хочу иметь набор шаблонов JSP. Некоторые из них будут макетами страницы, некоторые из них будут маленькими компонентами как paginator, поле входа в систему, меню, облако тегов и т.д. и т.д. и т.д. Каждый из них, компоненту нужны некоторые бобы или действие контроллера для установки некоторых данных в ViewAndModel так, чтобы представление могло использовать его.

Проблема, я не хочу устанавливать все эти объекты в каждом вызове. Мой контроллер регистра заботится только о регистрационной обработке. Таким образом, теперь, как я делаю его правильно? Как я называю бобы DI или контроллеры от представления для подготовки частичных представлений? Или я должен создать некоторые отображения? Или я приближаюсь к проблеме от полностью неправильного угла?

14
задан Sotirios Delimanolis 29 October 2015 в 00:09
поделиться

2 ответа

(\+|-)?([0-9]+(\.[0-9]+))

 

-121--4551073-

Мне пришлось прочитать это несколько раз, но я понял, что вы задаете.:) Этот вопрос является конкретным экземпляром этого другого вопроса:

Вот пример того, как вы можете его использовать. Очевидно, вы можете изменить его. Кроме того, не пропустите мою последнюю записку в конце этого ответа.

Сборка MyCompany.MyProduct.MyComponent:

Определите интерфейсы в этой сборке:

namespace MyCompany.MyProduct.MyComponent
{
    public interface IMyObjectInterface
    {
        void MyObjectMethod();
    }

    /* It's important to include this non-generic interface as a base for
     * IMyContentInterface<T> because you will be able to reference this
     * in the assembly where you load components dynamically.
     */
    public interface IMyContentInterface
    {
        Type ObjectType
        {
            get;
        }

        void MyContentMethod();
    }

    public interface IMyContentInterface<T> : IMyContentInterface
        where T : IMyObjectInterface
    {
    }
}

Сборка MyCompany.MyProduct.MyComponent.Implementation:

Реализуйте интерфейсы в этой сборке, которые будут динамически загружаться.

namespace MyCompany.MyProduct.MyComponent
{
    public abstract class MyAbstractObject : IMyObjectInterface
    {
        public abstract void MyObjectMethod();
    }

    public class MyObject : MyAbstractObject
    {
        public override void MyObjectMethod() { }
    }

    public abstract class MyAbstractContent<T> : IMyContentInterface<T>
        where T : MyAbstractObject
    {
        public Type ObjectType
        {
            get
            {
                return typeof(T);
            }
        }

        public abstract void MyContentMethod();
    }

    public class MyContent : MyAbstractContent<MyObject>
    {
        public override void MyContentMethod() { }
    }
}

Сборка MyCompany.MyProduct

Программа составлена в этой сборке, термин, который я взял из Управляемая расширяемость Рамки . Эта сборка ссылается на MyCompany.MyProduct.MyComponent , но не на MyCompany.MyProduct.MyComponent.Implementation при условии, что интерфейсы с большей вероятностью останутся совместимыми с , чем реализации во время разработки изделия. Эта конструкция является попыткой поддержать когезию по сравнению с муфтой (пара часто неправильно понятых слов), но фактические реализации имеют тенденцию сильно меняться в их успехе в достижении этой цели.

namespace MyCompany.MyProduct
{
    using MyCompany.MyProduct.MyComponent;
    using System.Reflection;
    using System.Security.Policy;

    public class ComponentHost
    {
        public void LoadComponents()
        {
            Assembly implementation = LoadImplementationAssembly();

            /* The implementation assembly path might be loaded from an XML or
             * similar configuration file
             */
            Type objectType = implementation.GetType("MyCompany.MyProduct.MyComponent.MyObject");
            Type contentType = implementation.GetType("MyCompany.MyProduct.MyComponent.MyContent");

            /* THIS assembly only works with IMyContentInterface (not generic),
             * but inside the implementation assembly, you can use the generic
             * type since you can reference generic type parameter in the source.
             */
            IMyContentInterface content = (IMyContentInterface)Activator.CreateInstance(contentType);
        }

        private Assembly LoadImplementationAssembly()
        {
            /* The implementation assembly path might be loaded from an XML or
             * similar configuration file
             */
            string assemblyPath = "MyCompany.MyProduct.MyComponent.Implementation.dll";
            return Assembly.LoadFile(assemblyPath);
        }
    }
}

Последнее примечание:

Рамка управляемой расширяемости была создана в качестве общего решения проблемы, над которой вы работаете. Проработав с ним некоторое время, я с уверенностью говорю, что он обладает следующими хорошими свойствами:

  • Относительно короткая кривая обучения.
  • В результате очень чистый код.
  • Низкая стоимость выполнения (сборка небольшая, а производительность достаточно хорошая).

Я бы легко рекомендовал его как серьезный жизнеспособный вариант для того, кто работает над новым приложением, если оно соответствует любой комбинации одного или нескольких из следующих:

  • Приложение разделено на компоненты (как было бы почти любое нетривиальное приложение).
  • Приложение должно быть гибким или расширяемым в будущем (как и любой долгосрочный проект).
  • Приложению необходимо динамически загружать реализацию из неизвестной сборки.
-121--4605405-

Spring-MVC может предоставлять компоненты контекста приложения слою просмотра, если это необходимо.

Например, InternalResoureViewResolver может быть выдан запрос на предоставление каждого компонента в контексте или только указанных компонентов. Просмотрите свойства exposeContextBeansAsAttributes и ExposedContextBeanNames .

Например, укажите, что вы хотите открыть для JSP компоненты beanA и beanB . Таким образом, вы объявите разрешитель представлений в вашем контексте:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   <property name="exposedContextBeanNames">
      <list>
         <value>beanA</value>
         <value>beanB</value>
      </list>
   </property>
</bean>

В качестве альтернативы, чтобы просто раскрыть каждый компонент:

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

Является ли это хорошей идеей другой вопрос, но Spring дает вам вариант.

40
ответ дан 1 December 2019 в 06:15
поделиться

Никогда не получать доступ к бизнес-компонентам от видов JSP; Что-то вроде Sitemesh может использоваться для объединения видов мутипу в одном. JSP также должен не вызывать методы контроллера напрямую

0
ответ дан 1 December 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: