Q: How does
JSF depict the MVC (a.k.a Model View Controller)
model?
Ans. The data that is manipulated
in form or the other is done by model. The data
presented to user in one form or the other is
done by view. JSF is connects the view and the
model. View can be depicted as shown by:
<h:inputText value="#{user.name}"/>
JSF acts as controller by way of action processing
done by the user or triggering of an event.
For ex.
<h:commandbutton value="Login"
action="login"/>
, this button event will triggered by the user
on Button press, which will invoke the login
Bean as stated in the faces-config.xml file.
Hence, it could be summarized as below: User
Button Click -> form submission to server
-> invocation of Bean class -> result
thrown by Bean class caught be navigation rule
-> navigation rule based on action directs
to specific page.
Q: What does it mean by rendering of
page in JSF?
Ans. Every JSF page as described
has various components made with the help of
JSF library. JSF may contain h:form, h:inputText,
h:commandButton, etc. Each of these are rendered
(translated) to HTML output. This process is
called encoding. The encoding procedure also
assigns each component with a unique ID assigned
by framework. The ID generated is random.
Q: How to show Confirmation Dialog when
user Click the Command Link?
A: h:commandLink assign the onclick attribute
for internal use. So, you cannot use it to write
your own code. This problem will fixed in the
JSF 1.2. For the current JSF version you can
use onmousedown event that occurs before onclick.
<script language="javascript">
function ConfirmDelete(link) { var delete =
confirm('Do you want to Delete?'); if (delete
== true) { link.onclick(); } } </script>
. . . . <h:commandLink action="delete"
onmousedown="return ConfirmDelete(this);">
<h:outputText value="delete it"/>
</h:commandLink>
Q: What is the different between getRequestParameterMap()
and getRequestParameterValuesMap()
getRequestParameterValuesMap() similar to getRequestParameterMap(),
but contains multiple values for for the parameters
with the same name. It is important if you one
of the components such as <h:selectMany>.
Q: Is it possible to have more than
one Faces Configuration file?
Yes. You can define the list of the configuration
files in the web.xml.
This is an example:
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config-navigation.xml,/WEB-INF/faces-beans.xml</param-value>
</context-param>
Note: Do not register /WEB-INF/faces-config.xml
file in the web.xml . Otherwise, the JSF implementation
will process it twice.
________________________________________
Hi there, I guess the Note: column should have
been meant or intended for "faces-config.xml"
file as thats the default configuration file
for JSF (which is similar to struts-config.xml
for Struts!!). faces-context.xml file sounds
like the user defined config file similar to
the aforementioned two xml files.
Q: How to mask actual URL to the JSF
page?
A: You'll need to implement your own version
of javax.faces.ViewHandler which does what you
need. Then, you register your own view handler
in faces-config.xml.
Here's a simple abstract ViewHandler you can
extend and then implement the 3 abstract methods
for. The abstract methods you override here
are where you'll do your conversions to/from
URI to physical paths on the file system. This
information is just passed right along to the
default ViewHandler for JSF to deal with in
the usual way. For example, you could override
these methods to add and remove the file extension
of an incoming view id (like in your example),
for extension-less view URIs.
import java.io.IOException;
import java.util.Locale;
import javax.faces.FacesException;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* A facade view handler which maps URIs into
actual physical views that the
* underlying implementation can deal with regularly.
*
* Therefore, all internal references to view
ids, for example in faces-config,
* will use the path to the physical files. Everything
publicized, however, will
* see a "converted" / facade url.
*/
public abstract class SimpleConverterViewHandler
extends ViewHandler {
private static final Log LOG = LogFactory
.getLog(SimpleConverterViewHandler.class);
private final ViewHandler
base;
public SimpleConverterViewHandler(ViewHandler
base) {
this.base = base;
}
/**
* Distinguishes a URI from a physical file view.
*
* Tests if a view id is in the expected format
-- the format corresponding
* to the physical file views, as opposed to
the URIs.
*
* This test is necessary because JSF takes the
view ID from the
* faces-config navigation, and calls renderView()
on it, etc.
*/
public abstract boolean isViewFormat(FacesContext
context, String viewId);
/**
* Convert a private file path (view id) into
a public URI.
*/
public abstract String convertViewToURI(FacesContext
context, String viewId);
/**
* Convert a public URI into a private file path
(view id)
*
* note: uri always starts with "/";
*/
public abstract String convertURIToView(FacesContext
context, String uri);
public String getActionURL(FacesContext
context, String viewId) {
// NOTE: this is used for FORM actions.
String newViewId =
convertViewToURI(context, viewId);
LOG.debug("getViewIdPath: " + viewId
+ "->" + newViewId);
return base.getActionURL(context, newViewId);
}
private String doConvertURIToView(FacesContext
context, String requestURI) {
if (isViewFormat(context, requestURI)) {
return requestURI;
} else {
return convertURIToView(context, requestURI);
}
}
public void renderView(FacesContext
context, UIViewRoot viewToRender)
throws IOException, FacesException {
if (null == context || null == viewToRender)
throw new NullPointerException("null context
or view");
String requestURI
= viewToRender.getViewId();
String newViewId = doConvertURIToView(context,
requestURI);
LOG.debug("renderView:
" + requestURI + "->" + newViewId);
viewToRender.setViewId(newViewId);
base.renderView(context,
viewToRender);
}
public UIViewRoot
restoreView(FacesContext context, String viewId)
{
String newViewId = doConvertURIToView(context,
viewId);
LOG.debug("restoreView: " + viewId
+ "->" + newViewId);
return base.restoreView(context,
newViewId);
}
public Locale calculateLocale(FacesContext
arg0) {
return base.calculateLocale(arg0);
}
public String calculateRenderKitId(FacesContext
arg0) {
return base.calculateRenderKitId(arg0);
}
public UIViewRoot
createView(FacesContext arg0, String arg1) {
return base.createView(arg0, arg1);
}
public String getResourceURL(FacesContext
arg0, String arg1) {
return base.getResourceURL(arg0, arg1);
}
public void writeState(FacesContext
arg0) throws IOException {
base.writeState(arg0);
}
}