|
The Dojo plugin will be deprecated on Struts 2.1 |
All examples on this page assume the following JSP fragment is on the same page as the example.
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>
<head>
<sx:head />
</head>
<s:url id="url" value="/MyAction.action" />
|
<s:submit value="Make Request" onclick="dojo.event.topic.publish('/request')" />
<sx:bind listenTopics="/request" href="%{#url}" />
|
<s:submit value="Make Request" id="submit" />
<sx:bind sources="submit" events="onclick" href="%{#url}" />
|
<s:submit value="Make Request" id="submit0" />
<s:submit value="Make Request" id="submit1" />
<sx:bind sources="submit0,submit1" events="onclick" href="%{#url}" />
|
<s:textarea id="area0" />
<s:textarea id="area1" />
<sx:bind sources="area0,area1" events="onfocus,onchange" href="%{#url}" />
|
<s:div id="div" />
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind targets="div" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit targets="div" value="Make Request" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a targets="div" value="Make Request" href="%{#url}" />
|
<s:div id="div0" />
<s:div id="div1" />
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind targets="div0,div1" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit targets="div0,div1" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a targets="div0,div1" href="%{#url}" />
|
<img id="indicator" src="${pageContext.request.contextPath}/images/indicator.gif" style="display:none" />
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind indicator="indicator" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit indicator="indicator" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a indicator="indicator" href="%{#url}" />
|
<s:div id="div" />
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind highlightColor="blue" highlightDuration="2000" targets="div" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit highlightColor="blue" highlightDuration="2000" targets="div" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a highlightColor="blue" highlightDuration="2000" targets="div" href="%{#url}" />
|
<s:div id="div" />
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind executeScripts="true" targets="div" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit executeScripts="true" targets="div" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a executeScripts="true" targets="div" href="%{#url}" />
|
<script type="text/javascript">
dojo.event.topic.subscribe("/before", function(event, widget){
alert('inside a topic event. before request');
//event: event object
//widget: widget that published the topic
});
</script>
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind beforeNotifyTopics="/before" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit beforeNotifyTopics="/before" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a beforeNotifyTopics="/before" href="%{#url}" />
|
<script type="text/javascript">
dojo.event.topic.subscribe("/after", function(data, request, widget){
alert('inside a topic event. after request');
//data : text returned from request
//request: XMLHttpRequest object
//widget: widget that published the topic
});
</script>
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind afterNotifyTopics="/after" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit afterNotifyTopics="/after" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a afterNotifyTopics="/after" href="%{#url}" />
|
<script type="text/javascript">
dojo.event.topic.subscribe("/error", function(error, request, widget){
alert('inside a topic event. on error');
//error : error object (error.message has the error message)
//request: XMLHttpRequest object
//widget: widget that published the topic
});
</script>
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind errorNotifyTopics="/error" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit errorNotifyTopics="/error" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a errorNotifyTopics="/error" href="%{#url}" />
|
<div id="div" />
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind errorText="Error Loading" targets="div" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit errorText="Error Loading" targets="div" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a errorText="Error Loading" targets="div" href="%{#url}" />
|
<script type="text/javascript">
dojo.event.topic.subscribe("/before", function(event, widget){
alert('I will stop this request');
event.cancel = true;
});
</script>
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind beforeNotifyTopics="/before" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit beforeNotifyTopics="/before" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a beforeNotifyTopics="/before" href="%{#url}" />
|
<form id="form">
<input type=textbox name="data">
</form>
<!-- With a bind tag -->
<s:submit value="Make Request" id="submit" />
<sx:bind formId="form" sources="submit" events="onclick" href="%{#url}" />
<!-- With a submit tag -->
<sx:submit formId="form" href="%{#url}" />
<!-- With an anchor tag -->
<sx:a formId="form" href="%{#url}" />
|
<!-- With a submit tag --> <s:form namespace="/mynamespace" action="MyAction"> <input type=textbox name="data"> <sx:submit /> </s:form> <!-- With an anchor tag --> <s:form namespace="/mynamespace" action="MyAction"> <input type=textbox name="data"> <sx:a /> </s:form> |
<sx:div href="%{#url}">
Initial Content
</sx:div>
|
<sx:div href="%{#url}" listenTopics="/refresh">
Initial Content
</sx:div>
<s:submit value="Refresh" onclick="dojo.event.topic.publish('/refresh')" />
|
<img id="indicator" src="${pageContext.request.contextPath}/images/indicator.gif" style="display:none"/>
<sx:div href="%{#url}" updateFreq="2000">
Initial Content
</sx:div>
|
<sx:div href="%{#url}" delay="2000">
Initial Content
</sx:div>
|
<sx:div href="%{#url}" loadingText="reloading" showLoadingText="true">
Initial Content
</sx:div>
|
<sx:div href="noaction" errorText="Error loading content"> Initial Content </sx:div> |
<sx:div href="%{#url}" executeScripts="true">
Initial Content
</sx:div>
|
<sx:div href="%{#url}"
listenTopics="/refresh"
startTimerListenTopics="/startTimer"
stopTimerListenTopics="/stopTimer"
updateFreq="3000">
Initial Content
</sx:div>
<s:submit value="Refresh" onclick="dojo.event.topic.publish('/refresh')" />
<s:submit value="Start refresh timer" onclick="dojo.event.topic.publish('/startTimer')" />
<s:submit value="Stop refresh timer" onclick="dojo.event.topic.publish('/stopTimer')" />
|
<sx:datetimepicker name="picker" /> |
<sx:datetimepicker type="time" name="picker" /> |
<sx:datetimepicker value="%{'2007-01-01'}" name="picker" />
|
<sx:datetimepicker value="date" name="picker" /> |
<script type="text/javascript">
function setValue() {
var picker = dojo.widget.byId("picker");
//string value
picker.setValue('2007-01-01');
//Date value
picker.setValue(new Date());
}
function showValue() {
var picker = dojo.widget.byId("picker");
//string value
var stringValue = picker.getValue();
alert(stringValue);
//date value
var dateValue = picker.getDate();
alert(dateValue);
}
</script>
<sx:datetimepicker id="picker" />
|
<sx:datetimepicker id="picker" cssStye="background:red" cssClass="someclass"/> |
<script type="text/javascript">
dojo.event.topic.subscribe("/value", function(text, date, widget){
alert('value changed');
//textEntered: String entered in the textbox
//date: JavaScript Date object with the value selected
//widget: widget that published the topic
});
</script>
<sx:datetimepicker label="Order Date" valueNotifyTopics="/value"/>
|
|
Locales must be specified in the sx:head tag. |
<sx:head extraLocales="en-us,nl-nl,de-de" />
<sx:datetimepicker label="In German" name="dddp7" value="%{'2006-06-28'}" language="de-de" />
<sx:datetimepicker label="In Dutch" name="dddp8" value="%{'2006-06-28'}" language="nl-nl" />
|
<sx:tabbedpanel id="tabContainer">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" >
Local Tab 2
</sx:div>
</sx:tabbedpanel>
|
<sx:tabbedpanel id="tabContainer">
<sx:div label="Local Tab 1" >
Tab 1
</sx:div>
<sx:div label="Remote Tab 2" href="%{#url}">
Remote Tab 2
</sx:div>
</sx:tabbedpanel>
|
<sx:tabbedpanel cssStyle="width: 500px; height: 300px;" doLayout="true" id="tabContainer">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" >
Local Tab 2
</sx:div>
</sx:tabbedpanel>
|
<sx:tabbedpanel id="tabContainer">
<sx:div label="Remote Tab 1" href="%{#url}">
Remote Tab 1
</sx:div>
<sx:div label="Remote Tab 2" href="%{#url}" preload="false">
Remote Tab 1
</sx:div>
</sx:tabbedpanel>
|
<sx:tabbedpanel id="tabContainer">
<sx:div label="Remote Tab 1" href="%{#url}" refreshOnShow="true">
Remote Tab 1
</sx:div>
<sx:div label="Remote Tab 2" href="%{#url}" refreshOnShow="true">
Remote Tab 2
</sx:div>
</sx:tabbedpanel>
|
<sx:tabbedpanel id="tabContainer">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" disabled="true">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
|
<script type="text/javascript">
function enableTab(param) {
var tabContainer = dojo.widget.byId('tabContainer');
tabContainer.enableTab(param);
}
function disableTab(param) {
var tabContainer = dojo.widget.byId('tabContainer');
tabContainer.disableTab(param);
}
</script>
<sx:tabbedpanel id="tabContainer" id="tabContainer">
<sx:div id="tab1" label="Tab 1">
Local Tab 1
</sx:div>
<sx:div id="tab2" label="Tab 2" disabled="true">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<!-- By Tab Index -->
<input type="button" onclick="enableTab(1)" value="Enable Tab 2 using Index" />
<input type="button" onclick="disableTab(1)" value="Disable Tab 2 using Index" />
<!-- By Tab Id -->
<input type="button" onclick="enableTab('tab2')" value="Enable Tab 2 using Id" />
<input type="button" onclick="disableTab('tab2')" value="Disable Tab 2 using Id" />
<!-- By Widget -->
<input type="button" onclick="enableTab(dojo.widget.byId('tab2'))" value="Enable Tab 2 using widget" />
<input type="button" onclick="disableTab(dojo.widget.byId('tab2'))" value="Disable Tab 2 using widget" />
|
<sx:tabbedpanel labelposition="bottom" id="tabContainer">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" >
Local Tab 2
</sx:div>
</sx:tabbedpanel>
|
<sx:tabbedpanel id="tabContainer">
<sx:div label="Tab 1" >
Local Tab 1
</sx:div>
<sx:div label="Tab 2" closable="true">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
|
<script type="text/javascript">
dojo.event.topic.subscribe('/before', function(event, tab, tabContainer) {
alert("Before selecting tab");
});
dojo.event.topic.subscribe('/after', function(tab, tabContainer) {
alert("After tab was selected");
});
</script>
<sx:tabbedpanel beforeSelectTabNotifyTopics="/before" afterSelectTabNotifyTopics="/after" id="tabContainer">
<sx:div label="Tab 1">
Local Tab 1
</sx:div>
<sx:div label="Tab 2">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
|
<script type="text/javascript">
function selectTab(id) {
var tabContainer = dojo.widget.byId("tabContainer");
tabContainer.selectTab(id);
}
</script>
<sx:tabbedpanel id="tabContainer">
<sx:div label="Tab 1" id="tab1">
Local Tab 1
</sx:div>
<sx:div label="Tab 2" id="tab2">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
<input type="button" onclick="selectTab('tab1')" value="Select tab 1" />
<input type="button" onclick="selectTab('tab2')" value="Select tab 2" />
|
<script type="text/javascript">
dojo.event.topic.subscribe('/before', function(event, tab, tabContainer) {
event.cancel = tab.widgetId == "tab2" ;
});
</script>
<sx:tabbedpanel beforeSelectTabNotifyTopics="/before" id="tabContainer">
<sx:div id="tab1" label="Tab 1">
Local Tab 1
</sx:div>
<sx:div id="tab2" label="Tab 2">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
|
<sx:tabbedpanel templateCssPath="%{#cssUrl}" id="tabContainer">
<sx:div id="tab1" label="Tab 1">
Local Tab 1
</sx:div>
<sx:div id="tab2" label="Tab 2">
Local Tab 2
</sx:div>
</sx:tabbedpanel>
|
<sx:autocompleter list="{'apple','banana','grape','pear'}" />
|
<sx:autocompleter list="{'apple','banana','grape','pear'}" value="apple"/>
|
<sx:autocompleter list="{'apple','banana','grape','pear'}" forceValidOption="true"/>
|
The action
public class AutocompleterExample extends ActionSupport {
public Map<String, String> getOptions() {
Map<String,String> options = new HashMap<String,String>();
options.put("Florida", "FL");
options.put("Alabama", "AL");
return options;
}
}
|
The mapping:
<struts>
...
<package name="autocompleter" namespace="/autocompleter" extends="json-default">
<action name="getStates" class="AutocompleterExample">
<result type="json">
<param name="root">options</param></result>
</action>
</package>
...
</struts>
|
The JSP (fragment):
<s:url id="optionsUrl" namespace="/autocompleter" action="getStates" />
<sx:autocompleter href="%{#optionsUrl}" />
|
When a form containing an autocompleter is submitted, two values will be submitted for each autocompleter, one for the selected value, and one for its associated key.
The action:
public MyAction extends ActionSupport {
private String optionsKey;
private String options;
...
}
|
The JSP:
<s:form id="form"> <sx:autocompleter name="options" label="Options" /> </s:form> |
<s:url id="optionsUrl" namespace="/autocompleter" action="getStates" />
<sx:autocompleter href="%{#optionsUrl}" value="Florida" keyValue="FL"/>
|
The action:
public MyAction extends ActionSupport {
private String superKey;
private String options;
...
}
|
The JSP:
<s:form id="form"> <sx:autocompleter keyName="superKey" name="options" label="Options" /> </s:form> |
for this autocompleter:
<sx:autocompleter name="state" /> |
The following JSON will be accepted:
{
"Alabama" : "AL",
"Alaska" : "AK"
}
|
[
["Alabama", "AL"],
["Alaska", "AK"]
]
|
{
"state" : [
["Alabama","AL"],
["Alaska","AK"]
]
}
|
{
"state" : {
"Alabama" : "Alabama",
"Alaska" : "AK"
}
}
|
{
"states" : [
["Alabama","AL"],
["Alaska","AK"]
]
}
|
{
"Australopithecus" : [
["Alabama","AL"],
["Alaska","AK"]
]
}
|
<sx:autocompleter href="%{#url}" loadOnTextChange="true" loadMinimumCount="3" />
|
<sx:autocompleter href="%{#url}" showDownArrow="false" />
|
<sx:autocompleter href="%{#url}" resultsLimit="3" />
|
<sx:autocompleter href="%{#url}" resultsLimit="-1" />
|
<sx:autocompleter href="%{#url}" dropdownHeight="180" dropdownWidth="200" />
|
<sx:autocompleter href="%{#url}" disabled="true" />
|
<script type="text/javascript">
function enableit() {
var autoCompleter = dojo.widget.byId("auto");
autoCompleter.enable();
}
function disableit() {
var autoCompleter = dojo.widget.byId("auto");
autoCompleter.disable();
}
</script>
<sx:autocompleter id="auto" href="%{#url}" />
|
<sx:autocompleter listenTopics="/reload" href="%{#url}" />
|
<s:form id="form">
<input type="textbox" name="data">
</s:form>
<sx:autocompleter formId="form" href="%{#url}" />
|
<script type="text/javascript">
function filter(input) {
return input.name == "data1";
}
</script>
<s:form id="form">
<input type="textbox" name="data0">
<input type="textbox" name="data1">
</s:form>
<sx:autocompleter formId="form" formFilter="filter" href="%{#url}" />
|
<form id="selectForm">
<sx:autocompleter name="select" list="{'fruits','colors'}" valueNotifyTopics="/changed" />
</form>
<sx:autocompleter href="%{#url}" formId="selectForm" listenTopics="/changed" />
|
<sx:autocompleter autoComplete="false" href="%{#url}" />
|
<sx:autocompleter preload="false" href="%{#url}" />
|