18
Markos Fragkakis JHUG meeting 20 Nov 2010

JBoss Seam vs JSF

Embed Size (px)

DESCRIPTION

A comparison between JBoss Seam 2.2 and JSF 1.2 vanilla. I gave this presentation at the JHUG event of the 20 November 2010.

Citation preview

Page 1: JBoss Seam vs JSF

Markos Fragkakis JHUG meeting 20 Nov 2010

Page 2: JBoss Seam vs JSF

My experience with JBoss Seam and JSF: •  Used plain JSF 1.2 for prototype (~1 month) •  Used Seam 2.2 in actual implementation (~9 months)

What is this presentation about? •  Common tasks where Seam makes life easier

Page 3: JBoss Seam vs JSF

  Separated business logic in:◦  JSF managed beans◦  Business components (EJBs)

  EJB lookupContext context = new InitialContext(); context.lookup("java:comp/env/...");

Page 4: JBoss Seam vs JSF

  One kind of “stuff ”   Seam Components ◦  POJOs ◦  EJB ◦  Entities

  Seam unifies Java EE: ◦  Dependency Injection

◦  Transactions

◦  Security

  No separation between front-end components and business components.

  Define your own architecture

Page 5: JBoss Seam vs JSF

  JSF ◦  Through faces-config.xml

  Java EE: @EJB ◦  Servlets, Filters, Listeners ◦  Tag handlers, tag library

event listeners … but not in JSF Managed

beans (backing beans)

faces-config.xml

<managed-bean> <managed-bean-name>myBean1</managed-bean-name> <managed-bean-class>mypackage.MyBean1</managed-

bean-class> <managed-bean-scope>application</managed-bean-

scope></managed-bean>

<managed-bean> <managed-bean-name>myBean2</managed-bean-name> <managed-bean-class>mypackage.MyBean2</managed-

bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>myBean1</property-name> <value>#{myBean1}</value> </managed-property></managed-bean>

Page 6: JBoss Seam vs JSF

  Injection of Seam components ◦  EJB ◦  Entities ◦  POJOs

  Outjection

@Name("myBean")@Scope(ScopeType.EVENT)public class MyBean {

@In(create=true) private AccountFacadeRemote accountFacade;

@In(scope=ScopeType.CONVERSATION) @Out(scope=ScopeType.CONVERSATION) private AccountEntity accountEntity;

@In @Out private SomePojo somePojo; …

Page 7: JBoss Seam vs JSF

  State: ◦  Server (i.e. session) ◦  Client (i.e. hidden fields) ◦  Combination

  JSF ◦  Request parameters

(i.e. hidden fields) ◦  Cookies ◦  URLs: http://jhug.gr/user/markos

  Maybe a problem: object != object

Page 8: JBoss Seam vs JSF

  JSF UI Component tree and state ◦  Tomahawk <t:saveState> ◦  Richfaces <a4j:keepAlive>

  If client-side state: object != object

Page 9: JBoss Seam vs JSF

  Session ◦  Problems:   Increased memory usage   Scalability problems   Need to consider

multiple tabs

Page 10: JBoss Seam vs JSF

  Seam scopes: ◦  Event (Request) ◦  Session ◦  Application ◦  Page ◦  Stateless ◦  Business Process ◦  Conversation

  What is a conversation? ◦  Lives for multiple requests ◦  Stateful, but not session

Page 11: JBoss Seam vs JSF
Page 12: JBoss Seam vs JSF

  Conversation end / timeout   Aggressive management

Page 13: JBoss Seam vs JSF

  Application Security: ◦  Page-level security ◦  Component-level security

  JSF does not specify security   Can a filter be used? ◦  Does View Handler use the

Servlet Request Dispatcher?   JSP: Yes

<filter-mapping> <filter-name>My Security Filter</filter-name> <url-pattern>/view2.jsp</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>

  Facelets: No

Page 14: JBoss Seam vs JSF

  Both Page-level and Component-level security   Some examples: ◦  Page-level authentication / authorization

<pages login-view-id="/login.xhtml"> <page view-id=”admin*" login-required="true”>

<restrict>#{s:hasRole('admin')}</restrict> </page> </pages>

<security:identity authenticate-method="#{authManager.authenticate}"/>

◦  Page customization<s:link view="/jhug/deleteMember.xhtml" value="Delete" rendered="#{s:hasRole('admin') || s:hasRole(’usermanager')}"/> ◦  Component-level authorization

@Name("myBean")@Scope(ScopeType.SESSION)@Restrict("#{s:hasRole('admin')}") public class MyBean implements Serializable {…

Page 15: JBoss Seam vs JSF

<h:commandLink value="Click here” action="#{myBean.method}"> <f:setPropertyActionListener target="#{myBean.methodParameter}” value="#{value}" /></h:commandLink>

public class MyBean { private String param;

public String method() { if("something".equals(param)) { return "ok"; } return "notOk"; }

public String getParam() { return param; } public void setParam(String param) { this.param = param; }}

Page 16: JBoss Seam vs JSF

<h:commandLink value="Click here” action="#{myBean.method(value)}” />

@Name("myBean")public class MyBean {

public String method(String param) { if("something".equals(param)) { return "ok"; } return "notOk"; }

}

Page 17: JBoss Seam vs JSF

 Help: ◦ Good books ◦  Extensive, up-to-date documentation ◦ Old forum, somewhat inactive ◦  StackOverflow.com

  Issues: ◦ Works best on JBoss AS ◦  Seam 2 issues are resolved slowly (Focus on Seam 3)

Page 18: JBoss Seam vs JSF

?