0% found this document useful (0 votes)
7 views

6 Context Dependency Injection 1 1 m6 Slides

Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views

6 Context Dependency Injection 1 1 m6 Slides

Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 33

Bringing the Web Tier

and
Service Tier Together

Antonio Goncalves
www.antoniogoncalves.org
@agoncal
Module Outline


 Java EE architectural styles
 Java
 Expression Language

 CDI brings integration

 Binding
 EL name on beans
 @Named

 State management
 Scopes and contexts
Java EE Tiered Architectures
Java for the Service Tier

public class PurchaseOrderBean {

private Float subtotal;


public class UserBean {
public String compute() {...} public String login;
}
}
EL for the Presentation Tier
<h:inputText value="#{userBean.login}"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:commandButton value="Compute" action='#{purchaseOrderBean.compute}'/>

public class PurchaseOrderBean {

private Float subtotal;


public class UserBean {
public String compute() {...} public String login;
}
}
EL for the Presentation Tier
<h:inputText value="#{userBean.login}"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:commandButton value="Compute" action='#{purchaseOrderBean.compute}'/>

public class PurchaseOrderBean {

private Float subtotal;


public class UserBean {
public String compute() {...} public String login;
}
}
EL for the Presentation Tier
<h:inputText value="#{userBean.login}"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:commandButton value="Compute" action='#{purchaseOrderBean.compute}'/>

public class PurchaseOrderBean {

private Float subtotal;


public class UserBean {
public String compute() {...} public String login;
}
}
EL for the Presentation Tier
<h:inputText value="#{userBean.login}"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:commandButton value="Compute" action='#{purchaseOrderBean.compute}'/>

public class PurchaseOrderBean {

private Float subtotal;


public class UserBean {
public String compute() {...} public String login;
}
}
CDI to Bind Service and Presentation Tier
<h:inputText value="#{userBean.login}"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:commandButton value="Compute" action='#{purchaseOrderBean.compute}'/>

@Named
public class PurchaseOrderBean {

private Float subtotal; @Named


public class UserBean {
public String compute() {...} public String login;
}
}
CDI to Manage State
<h:inputText value="#{userBean.login}"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:commandButton value="Compute" action='#{purchaseOrderBean.compute}'/>

@Named
public class PurchaseOrderBean {

private Float subtotal; @Named


public class UserBean {
public String compute() {...} public String login;
}
}
CDI to Manage State
<h:inputText value="#{userBean.login}"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:commandButton value="Compute" action='#{purchaseOrderBean.compute}'/>

@Named
public class PurchaseOrderBean {
@SessionScoped
private Float subtotal; @Named
public class UserBean {
public String compute() {...} public String login;
}
}
CDI to Manage State
<h:inputText value="#{userBean.login}"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:commandButton value="Compute" action='#{purchaseOrderBean.compute}'/>

@RequestScoped
@Named
public class PurchaseOrderBean {
@SessionScoped
private Float subtotal; @Named
public class UserBean {
public String compute() {...} public String login;
}
}
Binding

 Bind web tier and service tier

 Give an EL name to a bean


#
 @Named qualifier

 EL expression

 Expression Language

 Access Java from JSF pages


Expression Language
#{expression}

// Value Expressions
#{purchaseOrderBean.subtotal}
#{purchaseOrderBean.customer.name}

// Array Expressions
#{purchaseOrderBean.orders[2]}

// Method Expressions
#{purchaseOrderBean.compute}

// Parameterized Method Calls


#{purchaseOrderBean.compute('5')}
JSF Page
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:body>
<h:form>

<h:outputLabel value="Sub-total:"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:outputLabel value="Vat rate:"/>
<h:inputText value="#{purchaseOrderBean.vatRate}"/>
<h:commandLink value="Compute"
action='#{purchaseOrderBean.compute}'/>
</h:form>
</h:body>
</html>
CDI Bean
@Named
public class PurchaseOrderBean {

private Float subtotal = 0F;

private Float vatRate = 5.5F;

public String compute() {

Float vat = subtotal * (vatRate / 100);


Float discount = subtotal * (discountRate / 100);
total = subtotal + vat – discount;
return null;
}
}
@Named
@Named
public class PurchaseOrderBean {

private Float subtotal = 0F;

private Float vatRate = 5.5F;

public String compute() {...}


}

<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:inputText value="#{purchaseOrderBean.vatRate}"/>
<h:commandLink action='#{purchaseOrderBean.compute}'/>
@Named
@Named("order")
public class PurchaseOrderBean {

private Float subtotal = 0F;

private Float vatRate = 5.5F;

public String compute() {...}


}

<h:inputText value="#{order.subtotal}"/>
<h:inputText value="#{order.vatRate}"/>
<h:commandLink action='#{order.compute}'/>
Producers and Alternatives

 @Named on a bean

 @Named and @Produces


 Attributes in EL

 @Named and @Alternatives


 Switch implementation in EL


Naming a Producer
public class NumberProducer {

@Produces @Vat @Named


private Float vatRate = 5.5F;

@Produces @Discount @Named


private Float discountRate = 2.25f;

<h:inputText value="#{vatRate}"/>
<h:inputText value="#{discountRate}"/>
Naming a Producer
public class NumberProducer {

@Produces @Vat @Named("vat")


private Float vatRate = 5.5F;

@Produces @Discount @Named


private Float discountRate = 2.25f;

<h:inputText value="#{vat}"/>
<h:inputText value="#{discountRate}"/>
Naming a Producer
public class NumberProducer {

@Produces @Vat @Named("vat")


private Float vatRate = 5.5F;

@Produces @Discount @Named("discount")


private Float discountRate = 2.25f;

<h:inputText value="#{vat}"/>
<h:inputText value="#{discount}"/>
Alternative Named Producer
public class NumberProducer {

@Produces @Vat @Named("vat")


private Float vatRate = 5.5F;

@Produces @Vat @Named("vat") @Alternative


private Float vatRateAlt = 19.6F;

@Produces @Discount @Named("discount")


private Float discountRate = 2.25f;

@Produces @Discount @Named("discount") @Alternative


private Float discountRateAlt = 4.75f;
}

<h:inputText value="#{vat}"/>
<h:inputText value="#{discount}"/>
Enabling the Alternative
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">

<alternatives>
<class>com.pluralsight.NumberProducer</class>
</alternatives>

</beans>
State Management

 Managing state within a context


 When context ends, state is cleaned up

 Declarative with annotations

 CDI built-in scopes


 Application


 Session
 Request
 Conversation
Built-in Scopes

 
Request Request Request Request Request Request Request Request

Conversation Conversation

Session Session

Application
Built-in Scopes

 @ApplicationScoped

 @SessionScoped

 @RequestScoped


 @ConversationScoped

 Conversation & session implement Serializable

 @Dependent


 No annotation
 Default
Application Scope
@Named
@ApplicationScoped
public class Cache implements Serializable {

private Map<Object,Object> cache = new HashMap<>();

public void addToCache (Object key, Object value) {


// ...
}

public Object getFromCache (Object key) {


// ...
}

public void removeFromCache (Object key) {


// ...
}
}
Session Scope
@Named
@SessionScoped
public class ShoppingCart implements Serializable {

private List<Item> cartItems = new ArrayList<>();

public String addItemToCart() {


// ...
}

public String checkout() {


// ...
}
}
Request Scope
@Named
@RequestScoped
public class BookService {

public Book persist(Book book) {


// ...
}

public List<String> findAllImages() {


// ...
}

public List<Book> findByCategory(long categoryId) {


// ...
}
}
Conversation Scope
@Named
@ConversationScoped
public class CustomerWizard implements Serializable {

@Inject
private Conversation conversation;

private Customer customer = new Customer();

public void initProfile () {


conversation.begin();
// ...
}

public void endProfile () {


// ...
conversation.end();
}
}
Dependent Pseudo Scope
@Named
@Dependent
public class IsbnGenerator {

public String generateNumber() {


return "13-84356-" + Math.abs(new Random().nextInt());
}
}

@RequestScoped
public class BookService {

@Inject
private IsbnGenerator generator;
// ...
}
Summary

 Bringing Web tier and service tier together


 Binding
 @Named

 State management
 Scopes

 No distinction between presentation and business logic components

 Everything is a CDI bean

You might also like