JSF Composite Components for reusability
Q. Can you explain what are composite components in JSF?
A. JSF 2.0 introduced reusable components called composite components. It uses "cc" ( Composite Component)as the prefix in .xhtml files.
Q. How will you create a Composite Component in JSF 2.0 or later versions?
A. If you want to write a component say login.xhtml and call it from a page named register.xhtml, here are the basic steps.
Step 1: Define the component under
- src/main/webapp/resources in your war file or
- src/main/resources/META-INF/resources in you jar file
Let's define the login.xhtml under src/main/webapp/resources/login-folder
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:composite="http://java.sun.com/jsf/composite" > <composite:interface> <composite:attribute name="userNameLabel" /> <composite:attribute name="userNameValue" /> <composite:attribute name="passwordLabel" /> <composite:attribute name="passwordValue" /> //........... </composite:interface> <composite:implementation> <h:form> <h:panelGrid columns="2" id="textPanel"> #{cc.attrs.userNameLabel} : <h:inputText id="name" value="#{cc.attrs.userNameValue}" /> #{cc.attrs.passwordLabel} : <h:inputText id="password" value="#{cc.attrs.passwordValue}" /> </h:panelGrid> //.... </h:form> </composite:implementation> </html>
Note: cc.attrs.userNameLabel refers to userNameLabel defined in the composite:interface. "cc.attrs" is an internal JSF prefix. It uses other prefixes like cc:clientId, which returns current composite component's prefix.
Step 2: Invoke the composite component from the register.xhtml page. This is what passes the values to the components interface.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:registration="http://java.sun.com/jsf/composite/login-folder"> <h:body> <h1>Composite Components in JSF 2.0</h1> <registration:login id="loginComponent" userNameLabel="Name" userNameValue="#{user.name}" passwordLabel="password" passwordValue="#{user.password}" /> </h:body> </html>
Note:
The component is registered under the name "registration" prefix --> http://java.sun.com/jsf/composite/login-folder and "login-folder" tells you where to find the component under src/main/webapp/resources.
The registration:login --> registration is the prefix and login denotes look for login.xhtml under the folder src/main/webapp/resources/login-folder which is defined by the registration name space prefix in the html element.
The #{cc.clientId} value will be "loginComponent"
Step 3: #{user.name} refers to the JSF managed bean class. Where "user" is the annotated value and name is a Java class instance variable.
import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean(name="user") @SessionScoped public class UserBean{ public String name; public String password; //getter and setter methods for name and password //any action class methods }
Search for "JSF" or click on the JSF cloud tag for more blog posts on JSF with diagrams and code snippets. JSF is kind of in a decline in favor of JavaScript based frameworks like angular-js. I have a few posts on angularjs and Javascript . JSF mainly used for enhancing or maintaining existing applications.
Labels: JSF
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home