JavaEE Design Patterns
JavaEE Design Patterns
1
Agenda
● Presentation tier design patterns
● Business tier design patterns
● Integration tier design patterns
2
Core J2EE Patterns
3
Three Tiers
4
Presentation-Tier Patterns
● Intercepting Filter
● Front Controller
● View Helper
● Composite View
● Service to Worker
5
Business-Tier Patterns
● Business Delegate
● Service Locator
● Session Facade
● Data Transfer Object (DTO)
– (was Value Object)
● Data Transfer Object Assembler
– (was Value Object Assembler)
● Composite Entity
● Value List Handler
6
Integration-Tier Patterns
● Connector
● Data Access Object
● Service Activator
7
Presentation-Tier
Design Patterns
8
Presentation Tier Processing
Pre/Post- Control
Client Display Business
Processor Logic Service
Intercepting
Filter
9
Intercepting Filter: Forces
● Each service request and response
requires common pre-processing and
post-processing
– logging, authentication, caching, compression,
data transformation
● Adding and removing these “pre” and
“post” processing components should be
flexible
– deployment time installation/configuration
10
Intercepting Filter: Solution
● Create pluggable and chainable filters to
process common services such that
– Filters intercept incoming and outgoing
requests and responses
– Flexible to be added and removed without
requiring changes to other part of the
application
● Examples
– Servlet filters for HTTP requests/responses
– Message handlers for SOAP
requests/responses 11
Intercepting Filter:
Class Diagram
Target_Resource
Consumer
Filter One
FilterChain
Filter Two
12
Intercepting Filter Pattern
Sequence Diagram
Compression
Consumer SecurityFilter LoggingFilter FrontController
Filter
Incoming
Request
Apply
Forward request
Apply
Forward request
Complete Request
Processing
Response
Apply
Forward response
Outgoing Apply
response
13
Intercepting Filter Pattern
Sample code for writing Servlet 2.3 Filter
Public final class SecurityFilter implements Filter{
Sample Deployment Descriptor
public void doFilter(ServletRequest req,
ServletResponse res,
FilterChain chain)
throws IOException, ServletException{
// Perform security checks here
.....
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<servlet-name>ControllerServlet</servlet-name>
</filter-mapping>
14
Presentation Tier Processing
Pre/Post- Control
Client Display Business
Processor Logic Service
Intercepting Front
Filter Controller
15
Front Controller: Forces
● There is a need for centralized controller
for view selection and navigation (Model
2)
– based on user entered data
– business logic processing
– client type
● Common system services are typically
rendered to each request, so having a
single point of entry is desirable
– Example: Authentication, authorization, Logging
– Can leverage filter pattern 16
Front Controller: Solution
● Use a controller as an centralized point
of contact for all requests
– Promote code reuse for invoking common
system services
● Can have multiple front controllers, each
mapping to a set of distinct services
● Works with other patterns
– Filter, Command, Dispatcher, View Helper
17
Front Controller:
Implementation Strategy
Consumer Controller
Sends Service request
18
Front Controller Sample Code
Servlet-based Implementation
Public class EmployeeController extends HttpServlet{
Sample Deployment Descriptor
//Initializes the servlet
public void init(ServletConfig config) throws ServletException{
super.init(config);
}
//Destroys the servlet
public void destroy(){}
// Create a RequestHelper object that represent the client request specific information
RequestHelper reqHelper = new RequestHelper(request);
/********************************************************************
* Create a Command object. Command object is an implementation of the Command
* Pattern. Behind the scenes, implementation of getCommand() method would be like
* Command command = CommandFactory.create(request.getParameter("op"));
********************************************************************/
Command command= reqHelper.getCommand();
20
Front Controller Sample Code
Servlet Front Strategy with Dispatch
Pattern
//Implement the dispatch method
Sample Deployment Descriptor
protected void dispatch(HttpServletRequest request,
HttpServletResponse response, String page)
throws ServletException, IOException {
RequestDispatcher dispatcher
= getServletContext().getRequestDispatcher(page);
dispatcher.forward(request, response);
}
}
21
Business-Tier
Design Patterns
22
Business Delegate Pattern:
Forces
● Business service interface (Business
service APIs) change as business
requirements evolve
● Coupling between the presentation tier
components and business service tier
(business services) should be kept to
minimum
● It is desirable to reduce network traffic
between client and business services
23
Business Delegate Pattern:
Solution
● Use a Business Delegate to
– Reduce coupling between presentation-tier
and business service components
– Hide the underlying implementation details of
the business service components
– Cache references to business services
components
– Cache data
– Translate low level exceptions to application
level exceptions
24
Business Delegate Pattern:
Class Diagram
BusinessDelegate BusinessService
1 Uses 1..*
LookupService
Lookup / create
25
Business Delegate Pattern
Sequence Diagram
Business Lookup Business
Client Delegate Service Service
1. Create
1.1 Get service
1.1.1 Lookup
1.1.2 Return business
service
2. Invoke
2.1 Invoke
2.2 Invoke
26
Service Locator Pattern:
Forces
● Service lookup and creation involves
complex interfaces and network
operations
– JNDI operation is complex
● ex) PortableRemoteObject.narrow(.., ..)
● Service lookup and creation operations
are resource intensive and redundant
– Getting JNDI context
27
Service Locator Pattern:
Solution
● Use a Service Locator to
– Abstract naming service usage
– Shield complexity of service lookup and
creation
– Enable optimize service lookup and creation
functions
● Usually called within Business Delegate
object
28
Service Locator Pattern:
Class Diagram
Client <<Singleton>>
Component ServiceLocator
1 Uses 1..*
Creates
Uses
InitialContext
Uses
Uses
Lookup
BusinessService
Uses ServiceFactory
Lookup / create
29
Service Locator Pattern:
Sequence Diagram
Client ServiceLocator InitialContext ServiceFactory BusinessService
2. Get Service
2.1. Lookup
2.1.1 Create
2.1.2 Return
EJBHome
30
Service Locator Pattern:
Implementation Strategies
● Implementation strategies for Service
Locator
– EJB Service Locator Strategy
– JMS Queue Service Locator Strategy
– JMS Topic Service Locator Strategy
– Combined EJB and JMS Service Locator
Strategy
31
Service Locator Pattern
Sample code using EJB Service Locator
public class ServiceLocator
{
private static ServiceLocator me;
InitialContext context = null;
32
Service Locator Pattern: Sample code
using EJB Service Locator Strategy
// Convert the given string into EJB Handle and then to EJB Object
public EJBObject getService(String Id) throws ServiceLocatorException{
if (Id == null){
throw new ServiceLocatorException(...);
}
try{
byte[] bytes = new String(Id).getBytes();
InputStream io = new ByteArrayInputStream(bytes);
ObjectInputStream is = new ObjectInputStream(io);
javax.ejb.Handle handle = (javax.ejb.Handle)is.readObject();
return handle.getEJBObject();
}catch(Exception ex){
throw new ServiceLocatorException(...);
}
}
34
Service Locator Pattern
Client code using EJB Service
Locator
public class SampleServiceLocatorClient{
public static void main(String[] args){
ServiceLocator objServiceLocator = ServiceLocator.getInstance();
try{
ResourceSessionHome objResourceSessionHome
= (ResourceSessionHome)objServiceLocator.getHome(
myExamples.resourcesession.ResourceSessionHome.class);
}catch(ServiceLocatorException ex){
// Client handles exception
...
}
}
}
35
Thank You!
36