MVC and CDI
In before posts, we have already use@Inject
to inject CDI beans into the Controller class. In fact, MVC embraced CDI internally. RedirectScoped
There is a new CDI compatible scope namedRedirectScoped
introduced in MVC 1.0. A bean annotated with
@RedirectScoped
annotation can be transfered between two requests, conceptly, it is similar with JSF Flash.The
AlertMessage
is an example.-
Declare a bean with
@RedirectScoped
annotation.
@RedirectScoped @Named("flashMessage") public class AlertMessage implements Serializable {}
-
Inject it into a Controller class.
@Inject AlertMessage flashMessage;
-
Access the bean properties in the view via EL.
<c:if test="${not empty flashMessage and not empty flashMessage.text}"> <div class="alert alert-${flashMessage.type} alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true"><![CDATA[×]]></span> </button> <p>${flashMessage.text}</p> </div> </c:if>
AlertMessage
is a RedirectScoped
bean, which means it is can be access in current request and the next request. It is named with CDI @Named
which indicates it can be accessed in view via EL by name flashMessage.MVC Event
MVC defined a series of CDI compatible events, with which you can track the MVC request lifecycle.MVC provides a
MvcEvent
interface as the base of all events in MVC, there are several specific event implementations.- AfterControllerEvent
- AfterProcessViewEvent
- BeforeControllerEvent
- BeforeProcessViewEvent
- ControllerRedirectEvent
@Observes
.@ApplicationScoped
public class MvcEventListener {
@Inject Logger LOGGER;
private void onControllerMatched(@Observes BeforeControllerEvent event) {
LOGGER.info(() -> "Controller matched for " + event.getUriInfo().getRequestUri());
}
private void onViewEngineSelected(@Observes BeforeProcessViewEvent event) {
LOGGER.info(() -> "View engine: " + event.getEngine());
}
@PostConstruct
private void init() {
LOGGER.config(() -> this.getClass().getSimpleName() + " created");
}
}
Source codes
-
Clone the codes from my github.com account.
https://github.com/hantsy/ee8-sandbox/
- Open the mvc project in NetBeans IDE.
- Run it on Glassfish.
- After it is deployed and runging on Glassfish application server, navigate http://localhost:8080/ee8-mvc/mvc/tasks in browser.
评论