WW-5653 Upgrade Bootstrap to 5.3.x in sample apps (#1793)

* WW-5653 docs: add Bootstrap 5.3.x sample-app migration design

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 docs: add Bootstrap 5 migration implementation plan

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 build: add Bootstrap 5, Bootstrap Icons, showcase jQuery webjars

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 feat(showcase): serve Bootstrap 5 and jQuery via webjars

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): serve html5 demo Bootstrap CSS via webjar

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 feat(showcase): migrate navbar and top-level pages to Bootstrap 5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): migrate leftover Bootstrap 2 icon and fixed-navbar classes

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 feat(showcase): migrate tag-demo pages to Bootstrap 5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 feat(showcase): migrate validation-demo pages to Bootstrap 5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 feat(showcase): migrate fileupload and conversion pages to Bootstrap 5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 feat(showcase): migrate wait, token and empmanager pages to Bootstrap 5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): remove BS3 carets and well class

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): use ms-auto for right nav and add nav-link to Home

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 feat(rest-showcase): serve Bootstrap 5 CSS via webjars

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 feat(rest-showcase): migrate JSP markup to Bootstrap 5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(rest-showcase): migrate legacy BS2/BS3 grid classes to Bootstrap 5

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): drop obsolete css/js excludePattern so webjar JS is served

The old struts.action.excludePattern whitelisted the vendored /styles/*.css
and /js/*.js layout for container serving. After moving Bootstrap/jQuery to
webjars under /static/webjars/**, the '.*/js/.*\.js' entry matched the webjar
JS path (e.g. bootstrap.bundle.min.js) and excluded it from Struts' static
handler, so it fell through to the container and 404'd. Remaining webapp assets
(prettify.js, main.css) are served via default-servlet fall-through.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(samples): migrate remaining BS2/BS3 classes (tables, buttons, progress, forms, navbar)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 chore(showcase): comment out verbose debug loggers

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): migrate Bootstrap 5 markup in ftl/vm/html templates

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 test(showcase): disable JS in FreeMarkerManagerTest for Bootstrap 5

HtmlUnit's JS engine cannot parse Bootstrap 5's ES6 (bootstrap.bundle.min.js
uses 'class'), and the decorator now serves it, so the default WebClient threw
on script error. The test only asserts server-rendered FreeMarker output, so
JavaScript is disabled (matching Html5TagExampleTest).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): replace dead Bootstrap 2 form and alert classes

Migrate new-person.ftl form off BS2 control-group/controls/form-actions to
Bootstrap 5 (mb-3, form-label, form-control), and replace the dead alert-error
class with alert-danger across the showcase pages.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 test(showcase): make integration tests tolerate Bootstrap 5 under HtmlUnit

HtmlUnit 5.2.0 cannot parse Bootstrap 5's minified ES6 (bootstrap.bundle.min.js
uses 'class'), which broke the showcase HtmlUnit integration tests once the
decorator started serving the bundle.

- Add ParameterUtils.createWebClient() which disables throwExceptionOnScriptError,
  and route all integration tests through it (they assert server-rendered output,
  not Bootstrap's client-side behaviour).
- Load bootstrap.bundle.min.js with 'defer' so a page's own inline scripts (e.g.
  the async chat demo) still execute before HtmlUnit hits the bundle's parse
  error; defer is also the recommended real-browser loading strategy.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 test(showcase): poll for async chat result instead of fixed sleep

AsyncTest relied on a fixed Thread.sleep(4000) for the server-push chat
round-trip, which is not enough on slower/newer JVMs (reproduced failing on
JDK 25). Poll the result element for up to ~30s via waitForBackgroundJavaScript
instead, making the test robust across JVMs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 test(showcase): drive AsyncTest via HTTP instead of HtmlUnit

The browser-driven chat test was flaky on JDK 25 in CI: HtmlUnit's handling of
the async server-push long-poll timed out (message never rendered), even with
polling. The test's purpose is to validate the Servlet 3 async endpoints, which
needs no browser or JavaScript. Rewrite it to POST /async/sendMessage and read
/async/receiveNewMessages directly over HTTP and assert the JSON, making it
deterministic and independent of Bootstrap/HtmlUnit JS parsing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): drop progressbar role from wait progress bar

Resolves a SonarCloud accessibility finding (S6819) introduced by the Bootstrap 5
migration. The BS5 progress component is styled on .progress/.progress-bar divs;
the role/aria attributes were newly added (the BS3 original had none), so removing
them clears the finding while keeping the Bootstrap 5 styling.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): correct BS5 alert wrapper and drop stray table tag

Address Copilot review on PR #1793:

- decorators/main.jsp: the dismissible wrapper was a second .alert with no
  variant while the variant class (alert-danger, etc.) stayed on the inner
  <ul>, producing a nested, uncoloured alert box. Move the alert* classes
  onto the wrapper and strip them from the <ul> so the wrapper is the single
  alert container.
- orders-edit.jsp: remove the stray, unclosed <table> start tag before
  </s:form> (pre-existing invalid markup carried over during the migration).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): remove BS3 navbar-header wrapper and orphan dropdown-submenu

Clean up two leftover Bootstrap 3 artifacts in the showcase decorator navbar:

- Drop the `navbar-header` wrapper (no BS5 CSS behind it) and make the brand
  and toggler direct children of the `.container-fluid` flex container
  (justify-content: space-between), with the brand first per BS5 convention.
- Remove the empty, unclosed `<li class="dropdown-submenu">` orphan before the
  first item in the Examples menu; BS5 has no dropdown-submenu feature.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): replace soft-deprecated navbar-light with data-bs-theme

navbar-light is soft-deprecated in Bootstrap 5.3. Switch the showcase navbar
to the current data-bs-theme="light" idiom; bg-light is retained for the
background.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(showcase): normalize page-header replacement to border-bottom utilities

A handful of showcase pages replaced the BS3 page-header with a bare <div>
while the rest used <div class="border-bottom pb-2 mb-3">. Normalize those 35
header wrappers to the same border-bottom pb-2 mb-3 utilities so all showcase
page headers render consistently.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* WW-5653 fix(rest-showcase): add mb-3 to page-header replacement

Align rest-showcase order page headers with the showcase standard by using
border-bottom pb-2 mb-3 (was border-bottom pb-2), so header spacing is
consistent across both sample apps.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Lukasz Lenart
2026-07-20 18:16:03 +02:00
committed by GitHub
parent b2548542ec
commit 464817e0b0
144 changed files with 1091 additions and 14554 deletions
+8
View File
@@ -99,6 +99,14 @@
</exclusions>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>bootstrap-icons</artifactId>
</dependency>
</dependencies>
<build>
@@ -31,6 +31,7 @@
<constant name="struts.convention.default.parent.package" value="rest-showcase"/>
<constant name="struts.convention.package.locators" value="example"/>
<constant name="struts.webjars.allowlist" value="bootstrap,bootstrap-icons"/>
<!-- Uncomment the lines below to use Jackson XML bindings instead of the XStream library to handle XML serialisations -->
<!--
@@ -29,7 +29,8 @@
<title>Orders</title>
<!-- Using a standard HTML link tag with JSP EL to get the contextPath may be simpler, but this is an equivalent for s:link -->
<s:set var="pageContextPath"><%=((HttpServletRequest)request).getContextPath()%></s:set>
<s:link href="%{#pageContextPath}/css/bootstrap.min.css" rel="stylesheet"></s:link>
<link rel="stylesheet" href="<s:webjar path='bootstrap/css/bootstrap.min.css'/>"/>
<link rel="stylesheet" href="<s:webjar path='bootstrap-icons/font/bootstrap-icons.min.css'/>"/>
<s:link href="%{#pageContextPath}/css/app.css" rel="stylesheet"></s:link>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
@@ -44,7 +45,7 @@
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Delete Order ${id}</h1>
</div>
@@ -59,7 +60,7 @@
</form>
<br />
<a href="${pageContext.request.contextPath}/orders" class="btn btn-info">
<span class="glyphicon glyphicon-arrow-left"></span> Back to Orders
<i class="bi bi-arrow-left"></i> Back to Orders
</a>
</div><!--/col-md-12--->
</div><!--/row-->
@@ -29,7 +29,8 @@
<title>Orders</title>
<!-- Using a standard HTML link tag with JSP EL to get the contextPath may be simpler, but this is an equivalent for s:link -->
<s:set var="pageContextPath"><%=((HttpServletRequest)request).getContextPath()%></s:set>
<s:link href="%{#pageContextPath}/css/bootstrap.min.css" rel="stylesheet"></s:link>
<link rel="stylesheet" href="<s:webjar path='bootstrap/css/bootstrap.min.css'/>"/>
<link rel="stylesheet" href="<s:webjar path='bootstrap-icons/font/bootstrap-icons.min.css'/>"/>
<s:link href="%{#pageContextPath}/css/app.css" rel="stylesheet"></s:link>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
@@ -44,22 +45,22 @@
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Order <s:property value="id" /></h1>
</div>
<s:actionmessage cssClass="alert alert-danger"/>
<s:form method="post" action="%{#request.contextPath}/orders/%{id}" cssClass="form-horizontal" theme="simple">
<s:form method="post" action="%{#request.contextPath}/orders/%{id}" theme="simple">
<s:hidden name="_method" value="put" />
<div class="form-group">
<label class="col-sm-2 control-label" for="id">ID</label>
<div class="row mb-3">
<label class="col-sm-2 col-form-label" for="id">ID</label>
<div class="col-sm-4">
<s:textfield id="id" name="id" disabled="true" cssClass="form-control"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="clientName">Client</label>
<div class="row mb-3">
<label class="col-sm-2 col-form-label" for="clientName">Client</label>
<div class="col-sm-4">
<s:textfield id="clientName" name="clientName" cssClass="form-control"/>
</div>
@@ -67,8 +68,8 @@
<s:fielderror fieldName="clientName" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="amount">Amount</label>
<div class="row mb-3">
<label class="col-sm-2 col-form-label" for="amount">Amount</label>
<div class="col-sm-4">
<s:textfield id="amount" name="amount" cssClass="form-control" />
</div>
@@ -76,15 +77,14 @@
<s:fielderror fieldName="amount" />
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-4">
<div class="row mb-3">
<div class="offset-sm-2 col-sm-4">
<s:submit cssClass="btn btn-primary"/>
</div>
</div>
<table>
</s:form>
<a href="${pageContext.request.contextPath}/orders" class="btn btn-info">
<span class="glyphicon glyphicon-arrow-left"></span> Back to Orders
<i class="bi bi-arrow-left"></i> Back to Orders
</a>
</div><!--/col-md-12--->
</div><!--/row-->
@@ -29,7 +29,8 @@
<title>Orders</title>
<!-- Using a standard HTML link tag with JSP EL to get the contextPath may be simpler, but this is an equivalent for s:link -->
<s:set var="pageContextPath"><%=((HttpServletRequest)request).getContextPath()%></s:set>
<s:link href="%{#pageContextPath}/css/bootstrap.min.css" rel="stylesheet"></s:link>
<link rel="stylesheet" href="<s:webjar path='bootstrap/css/bootstrap.min.css'/>"/>
<link rel="stylesheet" href="<s:webjar path='bootstrap-icons/font/bootstrap-icons.min.css'/>"/>
<s:link href="%{#pageContextPath}/css/app.css" rel="stylesheet"></s:link>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
@@ -44,15 +45,15 @@
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>New Order</h1>
</div>
<s:actionmessage cssClass="alert alert-danger"/>
<s:form method="post" action="%{#request.contextPath}/orders" cssClass="form-horizontal" theme="simple">
<div class="form-group">
<label class="col-sm-2 control-label" for="clientName">Client</label>
<s:form method="post" action="%{#request.contextPath}/orders" theme="simple">
<div class="row mb-3">
<label class="col-sm-2 col-form-label" for="clientName">Client</label>
<div class="col-sm-4">
<s:textfield id="clientName" name="clientName" cssClass="form-control"/>
</div>
@@ -60,8 +61,8 @@
<s:fielderror fieldName="clientName" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="amount">Amount</label>
<div class="row mb-3">
<label class="col-sm-2 col-form-label" for="amount">Amount</label>
<div class="col-sm-4">
<s:textfield id="amount" name="amount" cssClass="form-control"/>
</div>
@@ -69,14 +70,14 @@
<s:fielderror fieldName="amount" />
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-4">
<div class="row mb-3">
<div class="offset-sm-2 col-sm-4">
<s:submit cssClass="btn btn-primary"/>
</div>
</div>
</s:form>
<a href="${pageContext.request.contextPath}/orders" class="btn btn-info">
<span class="glyphicon glyphicon-arrow-left"></apan> Back to Orders
<i class="bi bi-arrow-left"></i> Back to Orders
</a>
</div><!--/col-md-12--->
</div><!--/row-->
@@ -29,7 +29,8 @@
<title>Orders</title>
<!-- Using a standard HTML link tag with JSP EL to get the contextPath may be simpler, but this is an equivalent for s:link -->
<s:set var="pageContextPath"><%=((HttpServletRequest)request).getContextPath()%></s:set>
<s:link href="%{#pageContextPath}/css/bootstrap.min.css" rel="stylesheet"></s:link>
<link rel="stylesheet" href="<s:webjar path='bootstrap/css/bootstrap.min.css'/>"/>
<link rel="stylesheet" href="<s:webjar path='bootstrap-icons/font/bootstrap-icons.min.css'/>"/>
<s:link href="%{#pageContextPath}/css/app.css" rel="stylesheet"></s:link>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
@@ -44,7 +45,7 @@
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Orders</h1>
</div>
<s:actionmessage cssClass="alert alert-danger"/>
@@ -62,15 +63,15 @@
<td><s:property value="amount"/></td>
<td>
<div class="btn-group">
<a href="orders/${id}" class="btn btn-default"><span class="glyphicon glyphicon-eye-open"></span> View</a>
<a href="orders/${id}/edit" class="btn btn-default"><span class="glyphicon glyphicon-edit"></span> Edit</a>
<a href="orders/${id}/deleteConfirm" class="btn btn-danger"><span class="glyphicon glyphicon-trash"></span> Delete</a>
<a href="orders/${id}" class="btn btn-secondary"><i class="bi bi-eye"></i> View</a>
<a href="orders/${id}/edit" class="btn btn-secondary"><i class="bi bi-pencil"></i> Edit</a>
<a href="orders/${id}/deleteConfirm" class="btn btn-danger"><i class="bi bi-trash"></i> Delete</a>
</div>
</td>
</tr>
</s:iterator>
</table>
<a href="orders/new" class="btn btn-primary"><span class="glyphicon glyphicon-file"></span> Create a new order</a>
<a href="orders/new" class="btn btn-primary"><i class="bi bi-file-earmark"></i> Create a new order</a>
</div><!--/col-md-12--->
</div><!--/row-->
</div><!--/container-->
@@ -29,7 +29,8 @@
<title>Orders</title>
<!-- Using a standard HTML link tag with JSP EL to get the contextPath may be simpler, but this is an equivalent for s:link -->
<s:set var="pageContextPath"><%=((HttpServletRequest)request).getContextPath()%></s:set>
<s:link href="%{#pageContextPath}/css/bootstrap.min.css" rel="stylesheet"></s:link>
<link rel="stylesheet" href="<s:webjar path='bootstrap/css/bootstrap.min.css'/>"/>
<link rel="stylesheet" href="<s:webjar path='bootstrap-icons/font/bootstrap-icons.min.css'/>"/>
<s:link href="%{#pageContextPath}/css/app.css" rel="stylesheet"></s:link>
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
@@ -43,25 +44,25 @@
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Order ${id}</h1>
</div>
<table class="table table-striped">
<tr>
<td class="span3">ID</td>
<td class="span9"><s:property value="id"/></td>
<td class="col-3">ID</td>
<td class="col-9"><s:property value="id"/></td>
</tr>
<tr>
<td class="span3">Client</td>
<td class="span9"><s:property value="clientName"/></td>
<td class="col-3">Client</td>
<td class="col-9"><s:property value="clientName"/></td>
</tr>
<tr>
<td class="span3">Amount</td>
<td class="span9"><s:property value="amount"/></td>
<td class="col-3">Amount</td>
<td class="col-9"><s:property value="amount"/></td>
</tr>
</table>
<a href="${pageContext.request.contextPath}/orders" class="btn btn-info">
<span class="glyphicon glyphicon-arrow-left"></span> Back to Orders
<i class="bi bi-arrow-left"></i> Back to Orders
</a>
</div><!--/col-md-12--->
</div><!--/row-->
@@ -1,476 +0,0 @@
/*!
* Bootstrap v3.3.4 (http://getbootstrap.com)
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
}
.btn-default:active,
.btn-primary:active,
.btn-success:active,
.btn-info:active,
.btn-warning:active,
.btn-danger:active,
.btn-default.active,
.btn-primary.active,
.btn-success.active,
.btn-info.active,
.btn-warning.active,
.btn-danger.active {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn-default .badge,
.btn-primary .badge,
.btn-success .badge,
.btn-info .badge,
.btn-warning .badge,
.btn-danger .badge {
text-shadow: none;
}
.btn:active,
.btn.active {
background-image: none;
}
.btn-default {
text-shadow: 0 1px 0 #fff;
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #dbdbdb;
border-color: #ccc;
}
.btn-default:hover,
.btn-default:focus {
background-color: #e0e0e0;
background-position: 0 -15px;
}
.btn-default:active,
.btn-default.active {
background-color: #e0e0e0;
border-color: #dbdbdb;
}
.btn-default.disabled,
.btn-default:disabled,
.btn-default[disabled] {
background-color: #e0e0e0;
background-image: none;
}
.btn-primary {
background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #245580;
}
.btn-primary:hover,
.btn-primary:focus {
background-color: #265a88;
background-position: 0 -15px;
}
.btn-primary:active,
.btn-primary.active {
background-color: #265a88;
border-color: #245580;
}
.btn-primary.disabled,
.btn-primary:disabled,
.btn-primary[disabled] {
background-color: #265a88;
background-image: none;
}
.btn-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #3e8f3e;
}
.btn-success:hover,
.btn-success:focus {
background-color: #419641;
background-position: 0 -15px;
}
.btn-success:active,
.btn-success.active {
background-color: #419641;
border-color: #3e8f3e;
}
.btn-success.disabled,
.btn-success:disabled,
.btn-success[disabled] {
background-color: #419641;
background-image: none;
}
.btn-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #28a4c9;
}
.btn-info:hover,
.btn-info:focus {
background-color: #2aabd2;
background-position: 0 -15px;
}
.btn-info:active,
.btn-info.active {
background-color: #2aabd2;
border-color: #28a4c9;
}
.btn-info.disabled,
.btn-info:disabled,
.btn-info[disabled] {
background-color: #2aabd2;
background-image: none;
}
.btn-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #e38d13;
}
.btn-warning:hover,
.btn-warning:focus {
background-color: #eb9316;
background-position: 0 -15px;
}
.btn-warning:active,
.btn-warning.active {
background-color: #eb9316;
border-color: #e38d13;
}
.btn-warning.disabled,
.btn-warning:disabled,
.btn-warning[disabled] {
background-color: #eb9316;
background-image: none;
}
.btn-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #b92c28;
}
.btn-danger:hover,
.btn-danger:focus {
background-color: #c12e2a;
background-position: 0 -15px;
}
.btn-danger:active,
.btn-danger.active {
background-color: #c12e2a;
border-color: #b92c28;
}
.btn-danger.disabled,
.btn-danger:disabled,
.btn-danger[disabled] {
background-color: #c12e2a;
background-image: none;
}
.thumbnail,
.img-thumbnail {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
background-color: #e8e8e8;
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
background-color: #2e6da4;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
}
.navbar-default {
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
}
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
}
.navbar-brand,
.navbar-nav > li > a {
text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
}
.navbar-inverse {
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
}
.navbar-inverse .navbar-nav > .open > a,
.navbar-inverse .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
}
.navbar-inverse .navbar-brand,
.navbar-inverse .navbar-nav > li > a {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
}
.navbar-static-top,
.navbar-fixed-top,
.navbar-fixed-bottom {
border-radius: 0;
}
@media (max-width: 767px) {
.navbar .navbar-nav .open .dropdown-menu > .active > a,
.navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
color: #fff;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
}
}
.alert {
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
}
.alert-success {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
background-repeat: repeat-x;
border-color: #b2dba1;
}
.alert-info {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
background-repeat: repeat-x;
border-color: #9acfea;
}
.alert-warning {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
background-repeat: repeat-x;
border-color: #f5e79e;
}
.alert-danger {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
background-repeat: repeat-x;
border-color: #dca7a7;
}
.progress {
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar {
background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-striped {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.list-group {
border-radius: 4px;
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus {
text-shadow: 0 -1px 0 #286090;
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
background-repeat: repeat-x;
border-color: #2b669a;
}
.list-group-item.active .badge,
.list-group-item.active:hover .badge,
.list-group-item.active:focus .badge {
text-shadow: none;
}
.panel {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
}
.panel-default > .panel-heading {
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.panel-primary > .panel-heading {
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
background-repeat: repeat-x;
}
.panel-success > .panel-heading {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
background-repeat: repeat-x;
}
.panel-info > .panel-heading {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
background-repeat: repeat-x;
}
.panel-warning > .panel-heading {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
background-repeat: repeat-x;
}
.panel-danger > .panel-heading {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
background-repeat: repeat-x;
}
.well {
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
border-color: #dcdcdc;
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
}
/*# sourceMappingURL=bootstrap-theme.css.map */
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+13
View File
@@ -172,6 +172,19 @@
<artifactId>groovy-jsr223</artifactId>
<version>3.0.25</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
</dependency>
<dependency>
<groupId>org.webjars.npm</groupId>
<artifactId>bootstrap-icons</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>${webjars-jquery-showcase.version}</version>
</dependency>
</dependencies>
<build>
@@ -29,9 +29,11 @@
<Root level="info">
<AppenderRef ref="STDOUT"/>
</Root>
<!--
<Logger name="org.apache.struts2" level="info"/>
<Logger name="org.apache.struts2.showcase.fileupload" level="debug"/>
<Logger name="org.apache.struts2.inject" level="debug"/>
<Logger name="org.apache.struts2.interceptor.ActionFileUploadInterceptor" level="debug"/>
-->
</Loggers>
</Configuration>
+2 -1
View File
@@ -37,6 +37,7 @@
<constant name="struts.allowlist.enable" value="true"/>
<constant name="struts.parameters.requireAnnotations" value="true"/>
<constant name="struts.allowlist.packageNames" value="org.apache.struts2.showcase"/>
<constant name="struts.webjars.allowlist" value="jquery,bootstrap,bootstrap-icons"/>
<!-- Enable Spring AOP proxy support for action chaining test (WW-5514) -->
<constant name="struts.disallowProxyObjectAccess" value="false"/>
@@ -53,7 +54,7 @@
<constant name="struts.serve.static.browserCache" value="false"/>
<constant name="struts.action.excludePattern"
value=".*/images/.*\.gif,.*/img/.*\.gif,.*/styles/.*\.css,.*/js/.*\.js,/testServlet/.*"/>
value=".*/images/.*\.gif,.*/img/.*\.gif,/testServlet/.*"/>
<include file="struts-interactive.xml"/>
@@ -25,7 +25,7 @@
<title>Struts2 Showcase - Action Chaining Result</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Action Chaining Result:</h1>
</div>
@@ -26,7 +26,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Bean Validation Examples</h1>
</div>
@@ -24,7 +24,7 @@
<title>Struts2 Showcase - Conversion - Populate into Struts action class a Set of Address.java Object</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Conversion - Populate into Struts action class a Set of Address.java Object</h1>
</div>
@@ -24,7 +24,7 @@
<title>Struts2 Showcase - Conversion - Tiger 5 Enum</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Conversion - Tiger 5 Enum</h1>
</div>
@@ -24,7 +24,7 @@
<title>Struts2 Showcase - Conversion - Populate Object into Struts' action List</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Conversion - Populate Object into Struts' action List</h1>
</div>
@@ -43,8 +43,8 @@
<p/>
<s:actionerror cssClass="alert alert-error"/>
<s:fielderror cssClass="alert alert-error"/>
<s:actionerror cssClass="alert alert-danger"/>
<s:fielderror cssClass="alert alert-danger"/>
<s:form action="submitPersonInfo" namespace="/conversion" method="post">
<%--
@@ -25,7 +25,7 @@
<title>Struts2 Showcase - Conversion</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Conversion</h1>
</div>
@@ -24,7 +24,7 @@
<title>Struts2 Showcase - Conversion - Populate into Struts action class a Set of Address.java Object</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Conversion - Populate into Struts action class a Set of Address.java Object</h1>
</div>
@@ -24,7 +24,7 @@
<title>Struts2 Showcase - Conversion - Tiger 5 Enum</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Conversion - Tiger 5 Enum</h1>
</div>
@@ -24,7 +24,7 @@
<title>Struts2 Showcase - Conversion - Populate Object into Struts' action List</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Conversion - Populate Object into Struts' action List</h1>
</div>
@@ -61,20 +61,26 @@
<title><sitemesh:write property="title"/></title>
<s:url var="bootstrapCss" value='/styles/bootstrap.css' encode='false' includeParams='none'/>
<s:link href="%{bootstrapCss}" rel="stylesheet" type="text/css" media="all"/>
<link rel="stylesheet" type="text/css" media="all" href="<s:webjar path='bootstrap/css/bootstrap.min.css'/>"/>
<link rel="stylesheet" type="text/css" href="<s:webjar path='bootstrap-icons/font/bootstrap-icons.min.css'/>"/>
<s:url var="mainCss" value='/styles/main.css' encode='false' includeParams='none'/>
<s:link href="%{mainCss}" rel="stylesheet" type="text/css" media="all"/>
<s:url var="jqueryJs" value='/js/jquery-2.1.4.min.js' encode='false' includeParams='none'/>
<s:script src="%{jqueryJs}"/>
<s:url var="bootstrapJs" value='/js/bootstrap.min.js' encode='false' includeParams='none'/>
<s:script src="%{bootstrapJs}"/>
<script src="<s:webjar path='jquery/jquery.min.js'/>"></script>
<script defer src="<s:webjar path='bootstrap/js/bootstrap.bundle.min.js'/>"></script>
<s:script>
$(function () {
var alerts = $('ul.alert').wrap('<div />');
alerts.prepend('<a class="close" data-dismiss="alert" href="#">&times;</a>');
alerts.alert();
$('ul.alert').each(function () {
var ul = $(this);
// Move the alert* classes (base + variant, e.g. alert-danger) onto a
// dismissible wrapper so it becomes the single alert container, then
// strip them from the <ul> to avoid a nested, uncoloured alert box.
var alertClasses = (ul.attr('class').match(/\balert\S*/g) || []).join(' ');
ul.removeClass(alertClasses);
var wrapper = $('<div class="alert-dismissible" />').addClass(alertClasses);
ul.before(wrapper);
wrapper.append('<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>').append(ul);
});
});
</s:script>
@@ -97,113 +103,107 @@
<body id="page-home">
<nav class="navbar navbar-default navbar-fixed-top">
<nav class="navbar navbar-expand-lg bg-light fixed-top" data-bs-theme="light">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<s:url var="home" action="showcase" namespace="/" includeContext="false" />
<s:a value="%{home}" cssClass="navbar-brand">
Struts2 Showcase
</s:a>
</div>
<s:url var="home" action="showcase" namespace="/" includeContext="false" />
<s:a value="%{home}" cssClass="navbar-brand">
Struts2 Showcase
</s:a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-main" aria-controls="navbar-main" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div id="navbar" class="navbar-collapse collapse">
<div class="collapse navbar-collapse" id="navbar-main">
<ul class="nav navbar-nav">
<li><s:a value="%{home}"><i class="glyphicon glyphicon-home"></i> Home</s:a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="glyphicon glyphicon-cog"></i> Configuration
<b class="caret"></b></a>
<li class="nav-item"><s:a value="%{home}" cssClass="nav-link"><i class="bi bi-house"></i> Home</s:a></li>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">
<i class="bi bi-gear"></i> Configuration</a>
<ul class="dropdown-menu" role="menu">
<li><s:a action="actionChain1!input" namespace="/actionchaining"
includeParams="none">Action Chaining</s:a></li>
includeParams="none" cssClass="dropdown-item">Action Chaining</s:a></li>
<li><s:a action="index" namespace="/config-browser"
includeParams="none">Config Browser</s:a></li>
includeParams="none" cssClass="dropdown-item">Config Browser</s:a></li>
<s:url var="conversion" action="index" namespace="/conversion" includeContext="false" />
<li><s:a value="%{conversion}">Conversion</s:a></li>
<li><s:a value="/person/index.html">Person Manager ( by Conventions )</s:a></li>
<li><s:a value="%{conversion}" cssClass="dropdown-item">Conversion</s:a></li>
<li><s:a value="/person/index.html" cssClass="dropdown-item">Person Manager ( by Conventions )</s:a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Non UI Tags<b class="caret"></b></a>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">Non UI Tags</a>
<ul class="dropdown-menu" role="menu">
<li><s:url var="url" action="showActionTagDemo" namespace="/tags/non-ui/actionTag"/>
<s:a href="%{url}">Action Tag</s:a></li>
<s:a href="%{url}" cssClass="dropdown-item">Action Tag</s:a></li>
<li><s:url var="url" namespace="/tags/non-ui" action="date"/>
<s:a href="%{url}">Date Tag</s:a></li>
<s:a href="%{url}" cssClass="dropdown-item">Date Tag</s:a></li>
<li><s:url var="url" action="debugTagDemo" namespace="/tags/non-ui"/>
<s:a href="%{url}">Debug Tag</s:a></li>
<s:a href="%{url}" cssClass="dropdown-item">Debug Tag</s:a></li>
<li><s:url var="url" action="showGeneratorTagDemo" namespace="/tags/non-ui/iteratorGeneratorTag"/>
<s:a href="%{url}">Iterator Generator Tag</s:a></li>
<s:a href="%{url}" cssClass="dropdown-item">Iterator Generator Tag</s:a></li>
<li>
<s:url var="url" action="showAppendTagDemo" namespace="/tags/non-ui/appendIteratorTag"/>
<s:a href="%{#url}">Append Iterator Tag</s:a>
<s:a href="%{#url}" cssClass="dropdown-item">Append Iterator Tag</s:a>
<li>
<s:url var="url" action="showMergeTagDemo" namespace="/tags/non-ui/mergeIteratorTag"/>
<s:a href="%{#url}">Merge Iterator Demo</s:a>
<s:a href="%{#url}" cssClass="dropdown-item">Merge Iterator Demo</s:a>
<li>
<s:url var="url" action="showSubsetTagDemo" namespace="/tags/non-ui/subsetIteratorTag"/>
<s:a href="%{#url}">Subset Tag</s:a>
<s:a href="%{#url}" cssClass="dropdown-item">Subset Tag</s:a>
<li><s:url var="url" action="actionPrefixExampleUsingFreemarker" namespace="/tags/non-ui/actionPrefix"/>
<s:a href="%{#url}">Action Prefix Example (Freemarker)</s:a></li>
<s:a href="%{#url}" cssClass="dropdown-item">Action Prefix Example (Freemarker)</s:a></li>
<li><s:url var="url" action="testIfTagJsp" namespace="/tags/non-ui/ifTag"/>
<s:a href="%{#url}">If Tag (JSP)</s:a></li>
<s:a href="%{#url}" cssClass="dropdown-item">If Tag (JSP)</s:a></li>
<li><s:url var="url" action="testIfTagFreemarker" namespace="/tags/non-ui/ifTag"/>
<s:a href="%{#url}">If Tag (Freemarker)</s:a></li>
<s:a href="%{#url}" cssClass="dropdown-item">If Tag (Freemarker)</s:a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">UI Tags<b class="caret"></b></a>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">UI Tags</a>
<ul class="dropdown-menu" role="menu">
<li><s:url var="url" namespace="/tags/ui" action="example" method="input"/>
<s:a href="%{url}">UI Example</s:a></li>
<s:a href="%{url}" cssClass="dropdown-item">UI Example</s:a></li>
<li><s:url var="url" namespace="/tags/ui" action="exampleVelocity" method="input"/>
<s:a href="%{url}">UI Example (Velocity)</s:a></li>
<s:a href="%{url}" cssClass="dropdown-item">UI Example (Velocity)</s:a></li>
<li><s:url var="url" namespace="/tags/ui" action="lotsOfOptiontransferselect" method="input"/>
<s:a href="%{url}">Option Transfer Select UI Example</s:a></li>
<s:a href="%{url}" cssClass="dropdown-item">Option Transfer Select UI Example</s:a></li>
<li><s:url var="url" namespace="/tags/ui" action="moreSelects" method="input"/>
<s:a href="%{url}">More Select Box UI Examples</s:a></li>
<s:a href="%{url}" cssClass="dropdown-item">More Select Box UI Examples</s:a></li>
<li>
<s:url var="url" namespace="/tags/ui" action="componentTagExample"/>
<s:a href="%{#url}">Component Tag Example</s:a></li>
<s:a href="%{#url}" cssClass="dropdown-item">Component Tag Example</s:a></li>
<li><s:url var="url" namespace="/tags/ui" action="actionTagExample" method="input"/>
<s:a href="%{url}">Action Tag Example</s:a></li>
<s:a href="%{url}" cssClass="dropdown-item">Action Tag Example</s:a></li>
<li><s:url var="url" action="index" namespace="/html5"/>
<s:a href="%{#url}">Html 5 theme</s:a></li>
<s:a href="%{#url}" cssClass="dropdown-item">Html 5 theme</s:a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="glyphicon glyphicon-file"></i> File
<b class="caret"></b></a>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">
<i class="bi bi-file-earmark"></i> File</a>
<ul class="dropdown-menu" role="menu">
<li><s:a namespace="/filedownload" action="index">File Download</s:a></li>
<li><s:a namespace="/filedownload" action="index" cssClass="dropdown-item">File Download</s:a></li>
<li>
<s:url var="url" action="upload" namespace="/fileupload"/>
<s:a href="%{#url}">Single File Upload</s:a>
<s:a href="%{#url}" cssClass="dropdown-item">Single File Upload</s:a>
</li>
<li>
<s:url var="url" action="dynamicUpload" namespace="/fileupload"/>
<s:a href="%{#url}">Single File Upload - dynamic config</s:a>
<s:a href="%{#url}" cssClass="dropdown-item">Single File Upload - dynamic config</s:a>
</li>
<li>
<s:url var="url" action="multipleUploadUsingList" namespace="/fileupload"/>
<s:a href="%{#url}">Multiple File Upload (List)</s:a>
<s:a href="%{#url}" cssClass="dropdown-item">Multiple File Upload (List)</s:a>
</li>
<li>
<s:url var="url" action="multipleUploadUsingArray" namespace="/fileupload"/>
<s:a href="%{#url}">Multiple File Upload (Array)</s:a>
<s:a href="%{#url}" cssClass="dropdown-item">Multiple File Upload (Array)</s:a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Validation<b class="caret"></b></a>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">Validation</a>
<ul class="dropdown-menu" role="menu">
<s:url var="quizBasic" namespace="/validation" action="quizBasic" method="input"/>
<s:url var="quizClient" namespace="/validation" action="quizClient" method="input"/>
@@ -216,65 +216,64 @@
<s:url var="storeMessageAcrossRequestExample" namespace="/validation" action="storeErrorsAcrossRequestExample"/>
<s:url var="beanValidationUrl" action="bean-validation" namespace="/bean-validation"/>
<s:url var="ajaxFormSubmitUrl" action="ajaxFormSubmit" namespace="/validation" method="input"/>
<li><s:a href="%{beanValidationUrl}">Bean Validation</s:a></li>
<li><s:a href="%{fieldValidatorUrl}">Field Validators</s:a></li>
<li><s:a href="%{clientSideValidationUrl}">Field Validators with client-side JavaScript</s:a></li>
<li><s:a href="%{nonFieldValidatorUrl}">Non Field Validator</s:a></li>
<li><s:a href="%{storeMessageAcrossRequestExample}">Store across request using MessageStoreInterceptor (Example)</s:a></li>
<li><s:a href="%{quizBasic}">Validation (basic)</s:a></li>
<li><s:a href="%{quizClient}">Validation (client)</s:a></li>
<li><s:a href="%{quizClientCss}">Validation (client using css_xhtml theme)</s:a></li>
<li><s:a href="%{visitorValidatorUrl}">Visitor Validator</s:a></li>
<li><s:a href="%{ajaxFormSubmitUrl}">AJAX Form Submit</s:a></li>
<li><s:a href="%{beanValidationUrl}" cssClass="dropdown-item">Bean Validation</s:a></li>
<li><s:a href="%{fieldValidatorUrl}" cssClass="dropdown-item">Field Validators</s:a></li>
<li><s:a href="%{clientSideValidationUrl}" cssClass="dropdown-item">Field Validators with client-side JavaScript</s:a></li>
<li><s:a href="%{nonFieldValidatorUrl}" cssClass="dropdown-item">Non Field Validator</s:a></li>
<li><s:a href="%{storeMessageAcrossRequestExample}" cssClass="dropdown-item">Store across request using MessageStoreInterceptor (Example)</s:a></li>
<li><s:a href="%{quizBasic}" cssClass="dropdown-item">Validation (basic)</s:a></li>
<li><s:a href="%{quizClient}" cssClass="dropdown-item">Validation (client)</s:a></li>
<li><s:a href="%{quizClientCss}" cssClass="dropdown-item">Validation (client using css_xhtml theme)</s:a></li>
<li><s:a href="%{visitorValidatorUrl}" cssClass="dropdown-item">Visitor Validator</s:a></li>
<li><s:a href="%{ajaxFormSubmitUrl}" cssClass="dropdown-item">AJAX Form Submit</s:a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Examples<b class="caret"></b></a>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">Examples</a>
<ul class="dropdown-menu" role="menu">
<li class="dropdown-submenu">
<li>
<s:url var="url" namespace="/hangman" action="hangmanNonAjax"/>
<s:a href="%{url}">Hangman</s:a>
<s:a href="%{url}" cssClass="dropdown-item">Hangman</s:a>
</li>
<li><s:a value="/person/index.html">Person Manager</s:a></li>
<li><s:a value="/skill/index.html">CRUD</s:a></li>
<li><s:a value="/wait/index">Execute &amp; Wait</s:a></li>
<li><s:a value="/token/index.html">Token</s:a></li>
<li><s:url var="url" namespace="/modelDriven" action="modelDriven"/><s:a
<li><s:a value="/person/index.html" cssClass="dropdown-item">Person Manager</s:a></li>
<li><s:a value="/skill/index.html" cssClass="dropdown-item">CRUD</s:a></li>
<li><s:a value="/wait/index" cssClass="dropdown-item">Execute &amp; Wait</s:a></li>
<li><s:a value="/token/index.html" cssClass="dropdown-item">Token</s:a></li>
<li><s:url var="url" namespace="/modelDriven" action="modelDriven"/><s:a cssClass="dropdown-item"
href="%{url}">Model Driven</s:a></li>
<li><s:a value="/async/index.html">Async</s:a></li>
<li><s:a value="/dispatcher/dispatch.action">Dispatcher result - dispatch</s:a></li>
<li><s:a value="/dispatcher/forward.action">Dispatcher result - forward</s:a></li>
<li><s:a value="/async/index.html" cssClass="dropdown-item">Async</s:a></li>
<li><s:a value="/dispatcher/dispatch.action" cssClass="dropdown-item">Dispatcher result - dispatch</s:a></li>
<li><s:a value="/dispatcher/forward.action" cssClass="dropdown-item">Dispatcher result - forward</s:a></li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Integration<b class="caret"></b></a>
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">Integration</a>
<ul class="dropdown-menu" role="menu">
<li>
<s:url var="url" action="customFreemarkerManagerDemo" namespace="/freemarker"/>
<s:a href="%{#url}">Demo of usage of a Custom Freemarker Manager</s:a>
<s:a href="%{#url}" cssClass="dropdown-item">Demo of usage of a Custom Freemarker Manager</s:a>
</li>
<li>
<s:url var="url" action="standardTags" namespace="/freemarker"/>
<s:a href="%{#url}">Demo of Standard Struts Freemarker Tags</s:a>
<s:a href="%{#url}" cssClass="dropdown-item">Demo of Standard Struts Freemarker Tags</s:a>
</li>
<li><s:a value="/tiles/index.action">Tiles</s:a></li>
<li><s:a value="/tiles/index.action" cssClass="dropdown-item">Tiles</s:a></li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav pull-right">
<li class="dropdown last">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="glyphicon glyphicon-question-sign"></i> Help<b class="caret"></b></a>
<ul class="nav navbar-nav ms-auto">
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">
<i class="bi bi-question-circle"></i> Help</a>
<ul class="dropdown-menu">
<s:url var="help" action="help" namespace="/" includeContext="false" />
<li><s:a value="%{help}">Help</s:a></li>
<li><a href="http://struts.apache.org/mail.html"><i class="icon-share"></i> User Mailing
<li><s:a value="%{help}" cssClass="dropdown-item">Help</s:a></li>
<li><a href="http://struts.apache.org/mail.html" class="dropdown-item"><i class="bi bi-share"></i> User Mailing
List</a></li>
<li><a href="http://struts.apache.org"><i class="icon-share"></i> Struts2 Website</a>
<li><a href="http://struts.apache.org" class="dropdown-item"><i class="bi bi-share"></i> Struts2 Website</a>
</li>
<li><a href="http://struts.apache.org/docs/home.html"><i class="icon-share"></i>
<li><a href="http://struts.apache.org/docs/home.html" class="dropdown-item"><i class="bi bi-share"></i>
Documentation</a></li>
</ul>
</li>
@@ -295,7 +294,7 @@
</div>
<div class="pull-right">
<div class="float-end">
<div>
<s:action var="dateAction" name="date" namespace="/" executeResult="true"/>
</div>
@@ -310,7 +309,7 @@
<!-- end search -->
</div>
<div class="pull-left">
<div class="float-start">
Copyright &copy; 2003-<s:property value="#dateAction.now.year + 1900"/>
<a href="https://www.apache.org">The Apache Software Foundation.</a>
</div>
@@ -27,7 +27,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Dispatcher Result Example</h1>
</div>
@@ -31,7 +31,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1><s:property value="#title"/></h1>
</div>
@@ -32,7 +32,7 @@
<title>Struts2 Showcase - CRUD Example - <s:property value="#title"/></title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1><s:property value="#title"/></h1>
</div>
@@ -24,7 +24,7 @@
<title>Struts2 Showcase - CRUD Example</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Available Employees</h1>
</div>
@@ -40,7 +40,7 @@
</div>
<div class="col-md-9">
<table class="table table-striped table-bordered table-hover table-condensed">
<table class="table table-striped table-bordered table-hover table-sm">
<tr>
<th>Id</th>
<th>First Name</th>
@@ -24,7 +24,7 @@
<title>Struts2 Showcase - CRUD Example</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Available Skills</h1>
</div>
@@ -40,7 +40,7 @@
</div>
<div class="col-md-9">
<table class="table table-striped table-bordered table-hover table-condensed">
<table class="table table-striped table-bordered table-hover table-sm">
<tr>
<th>Name</th><th>Description</th>
</tr>
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>File Download Example</h1>
</div>
@@ -39,7 +39,7 @@
</div>
<s:url var="url" action="download"/>
<s:a href="%{url}" cssClass="btn btn-large btn-info"><i class="icon-picture"></i> Download image file.</s:a>
<s:a href="%{url}" cssClass="btn btn-lg btn-info"><i class="bi bi-image"></i> Download image file.</s:a>
</div>
<div class="col-md-6" style="text-align: center;">
<div class="alert alert-info">
@@ -47,7 +47,7 @@
</div>
<s:url var="url" action="download2"/>
<s:a href="%{url}" cssClass="btn btn-large btn-info"><i class="icon-download-alt"></i> Download ZIP file.</s:a>
<s:a href="%{url}" cssClass="btn btn-lg btn-info"><i class="bi bi-download"></i> Download ZIP file.</s:a>
</div>
</div>
</div>
@@ -30,7 +30,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>File Upload Successful</h1>
<p class="lead">Your file was validated and uploaded successfully</p>
</div>
@@ -42,50 +42,50 @@
<strong>Success!</strong> Your file passed all validation checks.
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Upload Details</h3>
<div class="card">
<div class="card-header">
<h3 class="card-title">Upload Details</h3>
</div>
<div class="panel-body">
<dl class="dl-horizontal">
<dt>Upload Type:</dt>
<dd><s:property value="uploadType == 'image' ? 'Image' : 'Document'"/></dd>
<div class="card-body">
<dl class="row">
<dt class="col-sm-3">Upload Type:</dt>
<dd class="col-sm-9"><s:property value="uploadType == 'image' ? 'Image' : 'Document'"/></dd>
<dt>Content Type:</dt>
<dd><code><s:property value="contentType"/></code></dd>
<dt class="col-sm-3">Content Type:</dt>
<dd class="col-sm-9"><code><s:property value="contentType"/></code></dd>
<dt>File Name:</dt>
<dd><s:property value="fileName"/></dd>
<dt class="col-sm-3">File Name:</dt>
<dd class="col-sm-9"><s:property value="fileName"/></dd>
<dt>Original Name:</dt>
<dd><s:property value="originalName"/></dd>
<dt class="col-sm-3">Original Name:</dt>
<dd class="col-sm-9"><s:property value="originalName"/></dd>
<dt>File Size:</dt>
<dd><s:property value="uploadSize"/> bytes</dd>
<dt class="col-sm-3">File Size:</dt>
<dd class="col-sm-9"><s:property value="uploadSize"/> bytes</dd>
<dt>Input Name:</dt>
<dd><s:property value="inputName"/></dd>
<dt class="col-sm-3">Input Name:</dt>
<dd class="col-sm-9"><s:property value="inputName"/></dd>
<dt>File Object:</dt>
<dd><code><s:property value="uploadedFile"/></code></dd>
<dt class="col-sm-3">File Object:</dt>
<dd class="col-sm-9"><code><s:property value="uploadedFile"/></code></dd>
</dl>
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">Validation Rules Applied</h3>
<div class="card border-info">
<div class="card-header text-bg-info">
<h3 class="card-title">Validation Rules Applied</h3>
</div>
<div class="panel-body">
<dl class="dl-horizontal">
<dt>Allowed MIME Types:</dt>
<dd><code><s:property value="uploadConfig.allowedMimeTypes"/></code></dd>
<div class="card-body">
<dl class="row">
<dt class="col-sm-3">Allowed MIME Types:</dt>
<dd class="col-sm-9"><code><s:property value="uploadConfig.allowedMimeTypes"/></code></dd>
<dt>Allowed Extensions:</dt>
<dd><code><s:property value="uploadConfig.allowedExtensions"/></code></dd>
<dt class="col-sm-3">Allowed Extensions:</dt>
<dd class="col-sm-9"><code><s:property value="uploadConfig.allowedExtensions"/></code></dd>
<dt>Maximum Size:</dt>
<dd><s:property value="uploadConfig.maxFileSizeFormatted"/></dd>
<dt class="col-sm-3">Maximum Size:</dt>
<dd class="col-sm-9"><s:property value="uploadConfig.maxFileSizeFormatted"/></dd>
</dl>
<p class="text-muted">
<small>
@@ -98,7 +98,7 @@
<div class="btn-group">
<s:a action="dynamicUpload" cssClass="btn btn-primary">
<i class="glyphicon glyphicon-upload"></i> Upload Another File
<i class="bi bi-upload"></i> Upload Another File
</s:a>
</div>
</div>
@@ -26,7 +26,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Dynamic File Upload Validation</h1>
<p class="lead">Demonstrates WithLazyParams for runtime validation rules</p>
</div>
@@ -73,14 +73,14 @@
<s:file name="upload" label="Select File" cssClass="form-control"/>
<s:submit value="Upload File" cssClass="btn btn-primary"/>
<s:submit value="Refresh Rules" action="dynamicUpload" cssClass="btn btn-default"/>
<s:submit value="Refresh Rules" action="dynamicUpload" cssClass="btn btn-secondary"/>
</s:form>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="well">
<div class="bg-light border rounded p-3">
<h4>How It Works</h4>
<p>In <code>struts.xml</code>, the interceptor parameters use expressions:</p>
<pre>&lt;interceptor-ref name="actionFileUpload"&gt;
@@ -29,7 +29,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Fileupload sample - Multiple fileupload</h1>
</div>
@@ -29,7 +29,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Fileupload sample - Multiple fileupload using Array</h1>
</div>
@@ -29,7 +29,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Fileupload sample - Multiple fileupload using List</h1>
</div>
@@ -29,7 +29,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Fileupload sample</h1>
</div>
@@ -25,15 +25,15 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Fileupload sample</h1>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<s:actionerror cssClass="alert alert-error"/>
<s:fielderror cssClass="alert alert-error"/>
<s:actionerror cssClass="alert alert-danger"/>
<s:fielderror cssClass="alert alert-danger"/>
<s:form action="doUpload" method="POST" enctype="multipart/form-data">
<s:file name="upload" label="File"/>
<s:textfield name="caption" label="Caption"/>
@@ -24,7 +24,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Custom Freemarker Manager Usage</h1>
</div>
@@ -24,7 +24,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Standard Struts Freemarker Tags</h1>
</div>
@@ -23,7 +23,7 @@
<title>Struts2 Showcase - Hangman</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Hangman</h1>
</div>
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Getting support</h1>
</div>
@@ -39,13 +39,13 @@
<div class="alert alert-info">
Use this mailing list if you encounter problems while developing and using with Struts.
</div>
<a href="http://struts.apache.org/mail.html" class="btn btn-large btn-info"><i class="glyphicon glyphicon-share"></i> User List</a>
<a href="http://struts.apache.org/mail.html" class="btn btn-lg btn-info"><i class="bi bi-share"></i> User List</a>
</div>
<div class="col-md-4" style="text-align: center;">
<div class="alert alert-info">
The Struts 2 website.
</div>
<a href="http://struts.apache.org" class="btn btn-large btn-info"><i class="glyphicon glyphicon-share"></i> Struts 2</a>
<a href="http://struts.apache.org" class="btn btn-lg btn-info"><i class="bi bi-share"></i> Struts 2</a>
</div>
</div>
</body>
@@ -23,8 +23,7 @@
<s:compress>
<html lang="en">
<head>
<s:url var="bootstrapCss" value="/styles/bootstrap.css" encode="false" includeParams="none"/>
<s:link theme="html5" href="%{bootstrapCss}"/>
<link rel="stylesheet" href="<s:webjar path='bootstrap/css/bootstrap.min.css'/>"/>
<s:url var="mainCss" value="/styles/main.css" encode="false" includeParams="none"/>
<s:link theme="html5" href="%{mainCss}" />
<s:head theme="html5"/>
@@ -35,7 +34,7 @@
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="hero-unit">
<div class="p-5 mb-4 bg-light rounded-3">
<h1>Html 5 tags demo</h1>
<p>All the tags on this page are from <i>html5</i> theme. <s:a theme="html5" action="showcase" namespace="/">Back</s:a> to main Showcase App page</p>
</div>
@@ -45,7 +44,7 @@
<!-- Section 1: Link Components -->
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h2>Link Components</h2>
</div>
</div>
@@ -62,7 +61,7 @@
<!-- Section 2: Error & Message Components -->
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h2>Error &amp; Message Components</h2>
</div>
</div>
@@ -95,7 +94,7 @@
<!-- Section 3: Form Components -->
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h2>Form Components</h2>
</div>
</div>
@@ -212,7 +211,7 @@
<!-- Section 4: Advanced Selection Components -->
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h2>Advanced Selection Components</h2>
</div>
</div>
@@ -229,7 +228,7 @@
<!-- Section 5: Utility & Display Components -->
<div class="row">
<div class="col-md-12">
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h2>Utility &amp; Display Components</h2>
</div>
</div>
@@ -27,7 +27,7 @@
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Model Driven Example</h1>
</div>
@@ -34,7 +34,7 @@
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Model Driven Example - Result</h1>
</div>
@@ -24,7 +24,7 @@
<title>Struts2 Showcase - Person Manager Example</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Person Manager Example</h1>
</div>
@@ -43,7 +43,7 @@
<div class="col-md-9">
<s:form action="edit-person" theme="simple" validate="false">
<table class="table table-striped table-bordered table-hover table-condensed">
<table class="table table-striped table-bordered table-hover table-sm">
<tr>
<th>ID</th>
<th>First Name</th>
@@ -23,7 +23,7 @@
<title>Struts2 Showcase - Person Manager Example - All People</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>All People</h1>
</div>
@@ -43,7 +43,7 @@
<p>There are ${peopleCount} people...</p>
<table class="table table-striped table-bordered table-hover table-condensed">
<table class="table table-striped table-bordered table-hover table-sm">
<tr>
<th>ID</th>
<th>Name</th>
@@ -23,7 +23,7 @@
<title>Struts2 Showcase - Person Manager Example - New Person</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>New Person</h1>
</div>
@@ -40,25 +40,21 @@
</ul>
</div>
<div class="col-md-9">
<@s.actionerror cssClass="alert alert-error"/>
<@s.actionerror cssClass="alert alert-danger"/>
<@s.actionmessage cssClass="alert alert-info"/>
<@s.fielderror cssClass="alert alert-error"/>
<@s.fielderror cssClass="alert alert-danger"/>
<@s.form action="new-person" theme="simple" cssClass="form-horizontal">
<@s.form action="new-person" theme="simple">
<legend>Create a new Person</legend>
<div class="control-group">
<label class="control-label" for="name">First Name<span class="required">*</span></label>
<div class="controls">
<@s.textfield id="name" name="person.name" placeholder="First Name"/>
</div>
<div class="mb-3">
<label class="form-label" for="name">First Name<span class="required">*</span></label>
<@s.textfield id="name" name="person.name" placeholder="First Name" cssClass="form-control"/>
</div>
<div class="control-group">
<label class="control-label" for="lastName">Last Name<span class="required">*</span></label>
<div class="controls">
<@s.textfield id="lastName" name="person.lastName" placeholder="Last Name"/>
</div>
<div class="mb-3">
<label class="form-label" for="lastName">Last Name<span class="required">*</span></label>
<@s.textfield id="lastName" name="person.lastName" placeholder="Last Name" cssClass="form-control"/>
</div>
<div class="form-actions">
<div class="mb-3">
<@s.submit value="Create person" cssClass="btn btn-primary"/>
</div>
</@s.form>
@@ -36,10 +36,10 @@
<div class="row">
<div class="col-md-12">
<div class="hero-unit">
<div class="p-5 mb-4 bg-light rounded-3">
<h1>Welcome!</h1>
<p>The Struts Showcase demonstrates a variety of use cases and tag usages. Essentially, the application exercises various framework features in isolation. The Showcase is not meant as a "best practices" example.</p>
<p>For more "by example" solutions, see the <a href="https://github.com/apache/struts-examples" class="btn btn-primary btn-large">Struts Examples &raquo;</a> pages.</p>
<p>For more "by example" solutions, see the <a href="https://github.com/apache/struts-examples" class="btn btn-primary btn-lg">Struts Examples &raquo;</a> pages.</p>
</div>
</div>
@@ -23,7 +23,7 @@
<title>Struts2 Showcase - Non UI Tags - Action Prefix (Freemarker)</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - Action Prefix (Freemarker)</h1>
</div>
@@ -35,7 +35,7 @@
<p>The text you've entered is ${text!''}<p/>
<@s.a href="javascript:history.back();" cssClass="btn btn-info"><i class="icon icon-arrow-left"></i> Back</@s.a>
<@s.a href="javascript:history.back();" cssClass="btn btn-info"><i class="bi bi-arrow-left"></i> Back</@s.a>
</div>
</div>
</div>
@@ -23,7 +23,7 @@
<title>Struts2 Showcase - Non UI Tags - Action Prefix (Freemarker)</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - Action Prefix (Freemarker)</h1>
</div>
@@ -23,7 +23,7 @@
<title>Struts2 Showcase - Non UI Tags - Action Prefix (Freemarker)</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - Action Prefix (Freemarker)</h1>
</div>
@@ -35,7 +35,7 @@
<p>The text you've enter is ${text!''}<p/>
<@s.a href="javascript:history.back();" cssClass="btn btn-info"><i class="icon icon-arrow-left"></i> Back</@s.a>
<@s.a href="javascript:history.back();" cssClass="btn btn-info"><i class="bi bi-arrow-left"></i> Back</@s.a>
</div>
</div>
</div>
@@ -23,7 +23,7 @@
<title>Struts2 Showcase - Non UI Tags - Action Prefix (Freemarker)</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - Action Prefix (Freemarker)</h1>
</div>
@@ -35,7 +35,7 @@
<p>The text you've enter is %{text}<p/>
<@s.a href="javascript:history.back();" cssClass="btn btn-info"><i class="icon icon-arrow-left"></i> Back</@s.a>
<@s.a href="javascript:history.back();" cssClass="btn btn-info"><i class="bi bi-arrow-left"></i> Back</@s.a>
</div>
</div>
</div>
@@ -23,7 +23,7 @@
<title>Struts2 Showcase - Non UI Tags - Action Prefix (Freemarker)</title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - Action Prefix (Freemarker)</h1>
</div>
@@ -38,7 +38,7 @@
The text you've enter is ${text!''}<p/>
<@s.a href="javascript:history.back();" cssClass="btn btn-info"><i class="icon icon-arrow-left"></i> Back</@s.a>
<@s.a href="javascript:history.back();" cssClass="btn btn-info"><i class="bi bi-arrow-left"></i> Back</@s.a>
</div>
</div>
</div>
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non-Ui Tag - Action Tag</h1>
</div>
@@ -33,13 +33,13 @@
<div class="row">
<div class="col-md-12">
<div class="well">
<div class="bg-light border rounded p-3">
<h2> This is Not - Included by the Action Tag</h2>
</div>
<!-- lets include the first page many times -->
<div class="well">
<div class="bg-light border rounded p-3">
<s:action name="includePage" namespace="/tags/non-ui/actionTag" executeResult="true" />
<s:action name="includePage" namespace="/tags/non-ui/actionTag" executeResult="true" />
<s:action name="includePage" namespace="/tags/non-ui/actionTag" executeResult="true" />
@@ -47,7 +47,7 @@
<!-- lets include the second page many times -->
<div class="well">
<div class="bg-light border rounded p-3">
<s:action name="includePage2" namespace="/tags/non-ui/actionTag" executeResult="true" />
<s:action name="includePage2" namespace="/tags/non-ui/actionTag" executeResult="true" />
<s:action name="includePage2" namespace="/tags/non-ui/actionTag" executeResult="true" />
@@ -55,7 +55,7 @@
<!-- lets include the third page many time -->
<div class="well">
<div class="bg-light border rounded p-3">
<s:action name="includePage3" namespace="/tags/non-ui/actionTag" executeResult="true" />
<s:action name="includePage3" namespace="/tags/non-ui/actionTag" executeResult="true" />
<s:action name="includePage3" namespace="/tags/non-ui/actionTag" executeResult="true" />
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non UI Tags Example - Date</h1>
</div>
@@ -35,7 +35,7 @@
<s:action var="myDate" name="date" namespace="/" executeResult="false" />
<table class="table table-striped table-bordered table-hover table-condensed">
<table class="table table-striped table-bordered table-hover table-sm">
<tr>
<th>Name</th>
<th>Format</th>
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Debug Tag Usage</h1>
</div>
@@ -24,7 +24,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - Test If Tag (Freemarker)</h1>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - Test If Tag</h1>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - AppendIterator Tag Demo</h1>
</div>
@@ -46,7 +46,7 @@
</s:iterator>
<s:url var="url" action="showAppendTagDemo" namespace="/tags/non-ui/appendIteratorTag" />
<s:a href="%{#url}" cssClass="btn btn-info"><i class="icon icon-arrow-left"></i> Back To Input</s:a>
<s:a href="%{#url}" cssClass="btn btn-info"><i class="bi bi-arrow-left"></i> Back To Input</s:a>
</div>
</div>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - Iterator Generator Tag Demo</h1>
</div>
@@ -41,7 +41,7 @@
<s:url var="url" action="showGeneratorTagDemo" namespace="/tags/non-ui/iteratorGeneratorTag" />
<s:a href="%{#url}" cssClass="btn btn-info"><i class="icon icon-arrow-left"></i> Back To Input</s:a>
<s:a href="%{#url}" cssClass="btn btn-info"><i class="bi bi-arrow-left"></i> Back To Input</s:a>
</div>
</div>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - MergeIterator Tag</h1>
</div>
@@ -45,7 +45,7 @@
</s:iterator>
<s:url var="url" action="showMergeTagDemo" namespace="/tags/non-ui/mergeIteratorTag" />
<s:a href="%{#url}" cssClass="btn btn-info"><i class="icon icon-arrow-left"></i> Back To Input</s:a>
<s:a href="%{#url}" cssClass="btn btn-info"><i class="bi bi-arrow-left"></i> Back To Input</s:a>
</div>
</div>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - AppendIterator Tag Demo</h1>
</div>
@@ -33,8 +33,8 @@
<div class="row">
<div class="col-md-12">
<s:actionerror cssClass="alert alert-error"/>
<s:fielderror cssClass="alert alert-error"/>
<s:actionerror cssClass="alert alert-danger"/>
<s:fielderror cssClass="alert alert-danger"/>
<s:form action="submitAppendTagDemo" namespace="/tags/non-ui/appendIteratorTag" method="POST">
<s:textfield label="iterator 1 values (comma separated)" name="iteratorValue1" />
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - Iterator Generator Tag Demo</h1>
</div>
@@ -33,8 +33,8 @@
<div class="row">
<div class="col-md-12">
<s:actionerror cssClass="alert alert-error"/>
<s:fielderror cssClass="alert alert-error"/>
<s:actionerror cssClass="alert alert-danger"/>
<s:fielderror cssClass="alert alert-danger"/>
<s:form action="submitGeneratorTagDemo" namespace="/tags/non-ui/iteratorGeneratorTag" method="POST">
<s:textfield label="Value" name="value" />
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - MergeIterator Tag</h1>
</div>
@@ -33,8 +33,8 @@
<div class="row">
<div class="col-md-12">
<s:actionerror cssClass="alert alert-error"/>
<s:fielderror cssClass="alert alert-error"/>
<s:actionerror cssClass="alert alert-danger"/>
<s:fielderror cssClass="alert alert-danger"/>
<s:form action="submitMergeTagDemo" namespace="/tags/non-ui/mergeIteratorTag" method="POST">
<s:textfield label="Iterator 1 Value (Comma Separated)" name="iteratorValue1" />
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - SubsetTag Demo</h1>
</div>
@@ -33,8 +33,8 @@
<div class="row">
<div class="col-md-12">
<s:actionerror cssClass="alert alert-error"/>
<s:fielderror cssClass="alert alert-error"/>
<s:actionerror cssClass="alert alert-danger"/>
<s:fielderror cssClass="alert alert-danger"/>
<s:form action="submitSubsetTagDemo" namespace="/tags/non-ui/subsetIteratorTag" method="POST">
<s:textfield label="Iterator value (comma separated)" name="iteratorValue" />
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Ui Tag - SubsetTag Demo</h1>
</div>
@@ -42,7 +42,7 @@
</s:subset>
<s:url var="url" action="showSubsetTagDemo" namespace="/tags/non-ui/subsetIteratorTag" />
<s:a href="%{#url}" cssClass="btn btn-info"><i class="icon icon-arrow-left"></i> Back To Input</s:a>
<s:a href="%{#url}" cssClass="btn btn-info"><i class="bi bi-arrow-left"></i> Back To Input</s:a>
</div>
</div>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags - Action Tag</h1>
</div>
@@ -34,7 +34,7 @@
<div class="col-md-12">
<b>Example 1:</b>
This example calls an action and includes the output on the page
<p id="example1" class="well">
<p id="example1" class="bg-light border rounded p-3">
<s:action namespace="/tags/ui" name="actionTagExample" executeResult="true"/>
</p>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags - Component Tag</h1>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags Example</h1>
</div>
@@ -33,9 +33,9 @@
<div class="row">
<div class="col-md-12">
<s:actionerror cssClass="alert alert-error"/>
<s:actionerror cssClass="alert alert-danger"/>
<s:actionmessage cssClass="alert alert-info"/>
<s:fielderror cssClass="alert alert-error"/>
<s:fielderror cssClass="alert alert-danger"/>
<s:form action="exampleSubmit" enctype="multipart/form-data" method="POST" javascriptTooltip="true">
@@ -22,7 +22,7 @@
#shead()
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags Example (Velocity)</h1>
</div>
@@ -25,14 +25,14 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags Example - Example Submited</h1>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<table class="table table-striped table-bordered table-hover table-condensed">
<table class="table table-striped table-bordered table-hover table-sm">
<s:label label="Name" name="name" />
<s:label label="Birthday" name="birthday" />
<tr>
@@ -21,7 +21,7 @@
<title>Struts2 Showcase - UI Tags Example (Velocity) - Example Submited </title>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags Example (Velocity) - Example Submited</h1>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags - Optiontransferselect</h1>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags - Optiontransferselect Result</h1>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags - More Select Box UI Examples</h1>
</div>
@@ -25,7 +25,7 @@
<s:head/>
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>UI Tags - More Select Box UI Examples - Result</h1>
</div>
@@ -18,6 +18,6 @@
* under the License.
*/
-->
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>${title}</h1>
</div>
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Token Examples - Double post</h1>
</div>
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Token Examples - Example 1</h1>
</div>
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Token Examples - Example 2</h1>
</div>
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Token Examples - Example 3</h1>
</div>
@@ -24,7 +24,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Token Examples - Example 4</h1>
</div>
@@ -25,7 +25,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Token Examples - Transfer is Done</h1>
</div>
@@ -39,7 +39,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>AJAX Form Submit</h1>
</div>
@@ -26,7 +26,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Success !</h1>
</div>
@@ -34,7 +34,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Client Side Validation Examples</h1>
</div>
@@ -34,7 +34,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Field Validation Examples</h1>
</div>
@@ -35,7 +35,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Non Field Validator Example</h1>
</div>
@@ -30,7 +30,7 @@
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Basic validation Example</h1>
</div>
@@ -30,7 +30,7 @@
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Basic validation Example (CSS Theme)</h1>
</div>
@@ -30,7 +30,7 @@
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Basic validation Example</h1>
</div>
@@ -27,7 +27,7 @@
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Quiz submitted!</h1>
</div>
@@ -27,7 +27,7 @@
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Application Canceled</h1>
</div>
@@ -36,8 +36,8 @@
<div class="col-md-12">
<s:actionmessage cssClass="alert alert-info"/>
<s:actionerror cssClass="alert alert-error"/>
<s:fielderror cssClass="alert alert-error"/>
<s:actionerror cssClass="alert alert-danger"/>
<s:fielderror cssClass="alert alert-danger"/>
<s:url var="url" value="/validation/storeErrorsAcrossRequestExample.jsp" />
<s:a href="%{#url}">Try Again</s:a>
@@ -27,7 +27,7 @@
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Store Errors Across Request Example</h1>
</div>
@@ -27,7 +27,7 @@
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Ok !</h1>
</div>
@@ -36,8 +36,8 @@
<div class="col-md-12">
<s:actionmessage cssClass="alert alert-info"/>
<s:actionerror cssClass="alert alert-error"/>
<s:fielderror cssClass="alert alert-error"/>
<s:actionerror cssClass="alert alert-danger"/>
<s:fielderror cssClass="alert alert-danger"/>
<s:url var="url" value="/validation/storeErrorsAcrossRequestExample.jsp" />
<s:a href="%{#id}">Try Again</s:a>
@@ -33,7 +33,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Success !</h1>
</div>
@@ -41,7 +41,7 @@
<div class="row">
<div class="col-md-12">
<table class="table table-striped table-bordered table-hover table-condensed">
<table class="table table-striped table-bordered table-hover table-sm">
<tr>
<td>Required Validator Field:</td>
<td><s:property value="requiredValidatorField" /></td>
@@ -34,7 +34,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Success !</h1>
</div>
@@ -42,7 +42,7 @@
<div class="row">
<div class="col-md-12">
<table class="table table-striped table-bordered table-hover table-condensed">
<table class="table table-striped table-bordered table-hover table-sm">
<tr>
<td>Required Validator Field:</td>
<td><s:property value="requiredValidatorField" /></td>
@@ -34,7 +34,7 @@
</head>
<body>
<div class="page-header">
<div class="border-bottom pb-2 mb-3">
<h1>Success !</h1>
</div>
@@ -42,7 +42,7 @@
<div class="row">
<div class="col-md-12">
<table class="table table-striped table-bordered table-hover table-condensed">
<table class="table table-striped table-bordered table-hover table-sm">
<tr>
<td>Some Text: </td>
<td><s:property value="someText" /></td>

Some files were not shown because too many files have changed in this diff Show More