В некоторых платформах MVC можно назвать действие контроллера от представления, если Вы хотите выполнить некоторый код и представить некоторое частичное представление. Я не уверен, что корректный путь состоит в том, чтобы сделать это в Spring MVC
Я хочу иметь набор шаблонов JSP. Некоторые из них будут макетами страницы, некоторые из них будут маленькими компонентами как paginator, поле входа в систему, меню, облако тегов и т.д. и т.д. и т.д. Каждый из них, компоненту нужны некоторые бобы или действие контроллера для установки некоторых данных в ViewAndModel так, чтобы представление могло использовать его.
Проблема, я не хочу устанавливать все эти объекты в каждом вызове. Мой контроллер регистра заботится только о регистрационной обработке. Таким образом, теперь, как я делаю его правильно? Как я называю бобы DI или контроллеры от представления для подготовки частичных представлений? Или я должен создать некоторые отображения? Или я приближаюсь к проблеме от полностью неправильного угла?
(\+|-)?([0-9]+(\.[0-9]+))
-121--4551073-
Мне пришлось прочитать это несколько раз, но я понял, что вы задаете.:) Этот вопрос является конкретным экземпляром этого другого вопроса:
Вот пример того, как вы можете его использовать. Очевидно, вы можете изменить его. Кроме того, не пропустите мою последнюю записку в конце этого ответа.
Определите интерфейсы в этой сборке:
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
{
}
}
Реализуйте интерфейсы в этой сборке, которые будут динамически загружаться.
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.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);
}
}
}
Рамка управляемой расширяемости была создана в качестве общего решения проблемы, над которой вы работаете. Проработав с ним некоторое время, я с уверенностью говорю, что он обладает следующими хорошими свойствами:
Я бы легко рекомендовал его как серьезный жизнеспособный вариант для того, кто работает над новым приложением, если оно соответствует любой комбинации одного или нескольких из следующих:
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 дает вам вариант.
Никогда не получать доступ к бизнес-компонентам от видов JSP; Что-то вроде Sitemesh может использоваться для объединения видов мутипу в одном. JSP также должен не вызывать методы контроллера напрямую