The
<h:selectBooleanCheckbox> renders an HTML
"input" element of "type" "checkbox"
Common/basic
usage in JSF (I) - without label defined via <h:outputLabel>:
<?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://xmlns.jcp.org/jsf/html">
<h:head>
<title>JSF selectBooleanCheckbox
examples</title>
</h:head>
<h:body>
<h:form>
Remember me:
<h:selectBooleanCheckbox
value="#{playerBean.rememberme}"/>
<h:commandButton value="Submit"
action="data"/>
</h:form>
</h:body>
</html>
The <h:selectBooleanCheckbox>
will be rendered in HTML as:
<input
type="checkbox" name="j_idt6:j_idt8"
checked="checked" />
Common/basic
usage in JSF (II) - with label defined via <h:outputLabel>:
<?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://xmlns.jcp.org/jsf/html">
<h:head>
<title>JSF selectBooleanCheckbox
examples</title>
</h:head>
<h:body>
<h:form>
<h:selectBooleanCheckbox id="checkboxId"
value="#{playerBean.rememberme}"/>
<h:outputLabel for="checkboxId">Remember me</h:outputLabel>
<h:commandButton value="Submit"
action="data"/>
</h:form>
</h:body>
</html>
The <h:selectBooleanCheckbox>
will be rendered in HTML as:
<input
id="j_idt11:checkboxId" type="checkbox"
name="j_idt11:checkboxId" checked="checked" />
The PlayerBean
will be:
package
beans;
import
java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import
javax.inject.Named;
@Named
@SessionScoped
public class
PlayerBean implements Serializable {
private boolean rememberme = true;
public boolean isRememberme() {
return
rememberme;
}
public void setRememberme(boolean rememberme)
{
this.rememberme = rememberme;
}
}
At initial
request, the checkbox is selected (ticked) because the its value is initialized
from bean with true.
If rememberme
will be initially set to false, then at initial request the checkbox will be
unselected (unticked).
The data.xhtml
page is:
<?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://xmlns.jcp.org/jsf/html">
<h:head>
<title></title>
</h:head>
<h:body>
<!-- View submitted data -->
Remember: #{playerBean.rememberme}
</h:body>
</html>
Data flow in
image:
More examples:
Add xmlns:pt="http://xmlns.jcp.org/jsf/passthrough" for pass-through attributes
Styling messages with CSS
class
<h:form>
Remember me:
<div class="slide">
<h:selectBooleanCheckbox
id="slide" value="#{playerBean.rememberme}"/>
<h:outputLabel
for="slide"></h:outputLabel>
</div>
<h:commandButton value="Submit"
action="data"/>
</h:form>
<h:form>
Remember me:
<div class="rounded">
<h:selectBooleanCheckbox id="rounded"
value="#{playerBean.rememberme}"/>
<h:outputLabel for="rounded"></h:outputLabel>
</div>
<h:commandButton value="Submit"
action="data"/>
</h:form>
The used CSS are available in the complete source code.
Use valueChangeListener with <h:selectBooleanCheckbox>
<h:form>
Remember me:
<h:selectBooleanCheckbox
value="#{playerBean.rememberme}"
onchange="this.form.submit();"
valueChangeListener="#{playerBean.rememberAction}"/>
valueChangeListener="#{playerBean.rememberAction}"/>
</h:form>
#{playerBean.rememberme}
In PlayerBean
we need to add the rememberAction() method, as below (the ValueChangeEvent
is optional, you can use a void method without arguments also):
private
static final Logger LOG = Logger.getLogger(PlayerBean.class.getName());
public void
rememberAction(ValueChangeEvent event) {
LOG.log(Level.INFO, "rememberAction()
called, {0}", event.getOldValue() + " - " +
event.getNewValue());
}
AJAXify <h:selectBooleanCheckbox>
<h:form>
Remember me:
<h:selectBooleanCheckbox
value="#{playerBean.rememberme}">
<f:ajax execute="@this" render="@form"/>
</h:selectBooleanCheckbox>
#{playerBean.rememberme}
</h:form>
AJAXify <h:selectBooleanCheckbox> with valueChangeListener
<h:form>
Remember me:
<h:selectBooleanCheckbox
value="#{playerBean.rememberme}"
valueChangeListener="#{playerBean.rememberAction}">
<f:ajax execute="@this"
render="@form"/>
</h:selectBooleanCheckbox>
#{playerBean.rememberme}
</h:form>
In PlayerBean
we need to add the rememberAction() method, as below (the ValueChangeEvent
is optional, you can use a void method without arguments also):
private
static final Logger LOG = Logger.getLogger(PlayerBean.class.getName());
public void
rememberAction(ValueChangeEvent event) {
LOG.log(Level.INFO, "rememberAction()
called, {0}", event.getOldValue() + " - " +
event.getNewValue());
}
Indeterminate checkbox,
see https://css-tricks.com/indeterminate-checkboxes/
<h:form id="indeterminateForm">
<ul>
<li>
<h:selectBooleanCheckbox id="basic"/>
<h:outputLabel
for="basic">Install</h:outputLabel>
<ul>
<li>
<h:selectBooleanCheckbox
id="basic-1"/>
<h:outputLabel for="basic-1">Demos</h:outputLabel>
</li>
<li>
<h:selectBooleanCheckbox
id="basic-2"/>
<h:outputLabel
for="basic-2">Development</h:outputLabel>
<ul>
<li>
<h:selectBooleanCheckbox
id="basic-2-1"/>
<h:outputLabel
for="basic-2-1">Simple</h:outputLabel>
</li>
<li>
<h:selectBooleanCheckbox
id="basic-2-2"/>
<h:outputLabel
for="basic-2-2">Advance</h:outputLabel>
</li>
</ul>
</li>
<li>
<h:selectBooleanCheckbox
id="basic-3"/>
<h:outputLabel
for="basic-3">Debug</h:outputLabel>
</li>
</ul>
</li>
<li>
<h:selectBooleanCheckbox id="repair"/>
<h:outputLabel for="repair">Repair</h:outputLabel>
<ul>
<li>
<h:selectBooleanCheckbox id="repair-1"/>
<h:outputLabel
for="repair-1">Demos</h:outputLabel>
</li>
<li>
<h:selectBooleanCheckbox id="repair-2"/>
<h:outputLabel
for="repair-2">Tools</h:outputLabel>
</li>
<li>
<h:selectBooleanCheckbox id="repair-3"/>
<h:outputLabel for="repair-3">Kit</h:outputLabel>
</li>
</ul>
</li>
</ul>
<h:commandButton value="Submit"
action="data"/>
</h:form>
Notice that indeterminate
is not a checkbox attribute, is a JavaScript property. With other words, we
can't make a checkbox indeterminate through HTML by design. The below snippet
of JS (based on jQuery) can control this property in our case (the original
source code is available at https://css-tricks.com/indeterminate-checkboxes/):
<script
src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script
type="text/javascript">
// see
https://css-tricks.com/indeterminate-checkboxes/
$(function () {
$('input[type="checkbox"]').change(function (e) {
var checked =
$(this).prop("checked"),
container = $(this).parent(),
siblings = container.siblings();
container.find('input[type="checkbox"]').prop({
indeterminate:
false,
checked: checked
});
function checkSiblings(el) {
var parent = el.parent().parent(),
all = true;
el.siblings().each(function () {
return all =
($(this).children('input[type="checkbox"]').prop("checked")
=== checked);
});
//<![CDATA[
if (all && checked) {
//]]>
parent.children('input[type="checkbox"]').prop({
indeterminate:
false,
checked: checked
});
checkSiblings(parent);
//<![CDATA[
} else if (all && !checked) {
//]]>
parent.children('input[type="checkbox"]').prop("checked",
checked);
parent.children('input[type="checkbox"]').prop("indeterminate",
(parent.find('input[type="checkbox"]:checked').length
> 0));
checkSiblings(parent);
} else {
el.parents("li").children('input[type="checkbox"]').prop({
indeterminate: true,
checked: false
});
}
}
checkSiblings(container);
});
});
</script>
Require the user to tick
the desired checkbox (use OmniFaces)
<h:form>
<h:panelGrid columns="3">
<h:outputLabel for="termsId"
value="Tick terms and conditions:" />
<h:selectBooleanCheckbox id="termsId"
value="#{playerBean.terms}" requiredMessage="You must accept
terms and conditions!">
<f:validator
validatorId="omnifaces.RequiredCheckboxValidator" />
</h:selectBooleanCheckbox>
<h:commandButton value="Submit"
action="#{playerBean.termsAction()}"/>
</h:panelGrid>
<h:message for="termsId"
/>
</h:form>
<h:form>
<h:panelGrid columns="3">
<h:outputLabel
for="termsId" value="Tick terms and conditions:" />
<h:selectBooleanCheckbox
id="termsId" value="#{playerBean.terms}"
pt:required="true"
pt:x-moz-errormessage="You must accept terms and conditions!" title="You must accept terms and conditions!" />
pt:x-moz-errormessage="You must accept terms and conditions!" title="You must accept terms and conditions!" />
<h:commandButton
value="Submit"
action="#{playerBean.termsAction()}"/>
</h:panelGrid>
<h:message for="termsId"
/>
</h:form>
For both
cases, just add the field terms and method termsAction() in PlayerBean:
private
boolean terms;
public
boolean isTerms() {
return terms;
}
public void
setTerms(boolean terms) {
this.terms = terms;
}
public
String termsAction(){
return "data";
}
You can
simply display the terms value in data.xhtml:
Terms:
#{playerBean.terms}
Check on client side (via
JS) if a checkbox is selected
<h:form
id="formId">
Remember me:
<h:selectBooleanCheckbox
id="rememberId" value="#{playerBean.rememberme}"/>
<h:commandButton value="Submit"
action="data" onclick="isSelected();"/>
</h:form>
<script
type="text/javascript">
function isSelected() {
alert($('#formId:rememberId'.replace(/:/g,
"\\:")).is(':checked'));
}
</script>
Complete
source code on GitHub.
See also Mkyong.com
More resources on Constantin Alin, ZEEF page.
BooleanCheckbox in JSF Extension on JSF ShowCase ZEEF page.
See also Mkyong.com
More resources on Constantin Alin, ZEEF page.
BooleanCheckbox in JSF Extension on JSF ShowCase ZEEF page.
Niciun comentariu :
Trimiteți un comentariu