This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/struts-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 05a3c83e8 Automatic Site Publish by Buildbot
05a3c83e8 is described below

commit 05a3c83e801e85168f98cb61e383adcd055fb07a
Author: buildbot <[email protected]>
AuthorDate: Thu Aug 27 15:18:43 2026 +0000

    Automatic Site Publish by Buildbot
---
 output/.htaccess                                   |   4 +
 .../ajax-client-side-validation.html               |   5 +-
 output/core-developers/client-side-validation.html | 239 +++++++++++++++++----
 .../core-developers/client-validation-example.html |   8 +
 output/core-developers/default-properties.html     |   9 +
 .../pure-java-script-client-side-validation.html   | 235 --------------------
 output/tag-developers/css-xhtml-theme.html         |  24 ++-
 output/tag-developers/form-tag.html                |   9 +
 output/tag-developers/xhtml-theme.html             |  14 +-
 9 files changed, 253 insertions(+), 294 deletions(-)

diff --git a/output/.htaccess b/output/.htaccess
index 53769b998..c2a3c5370 100644
--- a/output/.htaccess
+++ b/output/.htaccess
@@ -25,6 +25,10 @@ RedirectMatch \/2.*\/(.*)?                          
http://struts.apache.org/$1
 # page downloads.html was renamed to releases.html
 RedirectMatch \/downloads /releases
 
+# page pure-java-script-client-side-validation was folded into 
client-side-validation as a
+# deprecated section, see WW-5694
+RedirectMatch permanent 
\/core\-developers\/pure\-java\-script\-client\-side\-validation(\.html)?$ 
/core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated
+
 # always points to the most recent announce-YYYY page, no manual update needed
 RedirectMatch \/announce.html(#a[0-9]+)? /announce-2026.html$1
 
diff --git a/output/core-developers/ajax-client-side-validation.html 
b/output/core-developers/ajax-client-side-validation.html
index 08964c6f1..91ffb3df0 100644
--- a/output/core-developers/ajax-client-side-validation.html
+++ b/output/core-developers/ajax-client-side-validation.html
@@ -173,8 +173,9 @@
 
 <h2 id="description">Description</h2>
 
-<p>AJAX-based client side validation improves upon <a 
href="pure-java-script-client-side-validation">Pure JavaScript Client Side 
Validation</a> 
-by using a combination of JavaScript, DOM manipulation, and remote server 
communication. Unlike the pure client side 
+<p>AJAX-based client side validation improves upon <a 
href="client-side-validation#pure-javascript-client-side-validation-deprecated">Pure
 JavaScript Client Side Validation</a> 
+(deprecated since 7.4.0 <a 
href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>, removed in 
8.0.0
+<a href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>) by using 
a combination of JavaScript, DOM manipulation, and remote server communication. 
Unlike the pure client side 
 implementation, AJAX-based validation communicates with the server. This means 
all your validation rules that worked 
 when submitting a form will still work within the browser.</p>
 
diff --git a/output/core-developers/client-side-validation.html 
b/output/core-developers/client-side-validation.html
index 0acb7ac6a..e1d719646 100644
--- a/output/core-developers/client-side-validation.html
+++ b/output/core-developers/client-side-validation.html
@@ -156,80 +156,233 @@
 
 <ul id="markdown-toc">
   <li><a href="#basics" id="markdown-toc-basics">Basics</a></li>
-  <li><a href="#referencing-submitprofile-in-the-user-namespace" 
id="markdown-toc-referencing-submitprofile-in-the-user-namespace">Referencing 
“submitProfile” in the “/user” namespace</a></li>
-  <li><a href="#wont-work-with-client-side-validation" 
id="markdown-toc-wont-work-with-client-side-validation">Won’t work with 
client-side validation!</a></li>
-  <li><a href="#the-left-hand-doesnt-know-" 
id="markdown-toc-the-left-hand-doesnt-know-">The left hand doesn’t know 
…</a></li>
+  <li><a href="#html5-constraint-validation" 
id="markdown-toc-html5-constraint-validation">HTML5 Constraint Validation</a>   
 <ul>
+      <li><a href="#enabling-it" id="markdown-toc-enabling-it">Enabling 
it</a></li>
+      <li><a href="#the-governing-rule-never-false-reject" 
id="markdown-toc-the-governing-rule-never-false-reject">The governing rule: 
never false-reject</a></li>
+      <li><a href="#mapping-table" id="markdown-toc-mapping-table">Mapping 
table</a></li>
+      <li><a href="#data-msg--attributes" 
id="markdown-toc-data-msg--attributes"><code class="language-plaintext 
highlighter-rouge">data-msg-*</code> attributes</a></li>
+      <li><a href="#requiredlabel-is-unrelated-to-the-required-attribute" 
id="markdown-toc-requiredlabel-is-unrelated-to-the-required-attribute"><code 
class="language-plaintext highlighter-rouge">requiredLabel</code> is unrelated 
to the <code class="language-plaintext highlighter-rouge">required</code> 
attribute</a></li>
+      <li><a href="#extension-point-htmlconstraintprovider" 
id="markdown-toc-extension-point-htmlconstraintprovider">Extension point: <code 
class="language-plaintext 
highlighter-rouge">HtmlConstraintProvider</code></a></li>
+    </ul>
+  </li>
+  <li><a href="#pure-javascript-client-side-validation-deprecated" 
id="markdown-toc-pure-javascript-client-side-validation-deprecated">Pure 
JavaScript Client Side Validation (deprecated)</a></li>
   <li><a href="#example" id="markdown-toc-example">Example</a></li>
-  <li><a href="#client-side-validation-types" 
id="markdown-toc-client-side-validation-types">Client Side Validation 
Types</a></li>
 </ul>
 
 <h2 id="basics">Basics</h2>
 
-<p>The framework adds support for client-side validation on top of the 
standard validation framework.</p>
+<p>Since Struts 7.4.0, the <a href="../tag-developers/html5-theme">html5 
theme</a> can derive HTML5 constraint-validation
+attributes (<code class="language-plaintext 
highlighter-rouge">required</code>, <code class="language-plaintext 
highlighter-rouge">minlength</code>, <code class="language-plaintext 
highlighter-rouge">maxlength</code>, <code class="language-plaintext 
highlighter-rouge">pattern</code>, <code class="language-plaintext 
highlighter-rouge">min</code>, <code class="language-plaintext 
highlighter-rouge">max</code>) directly from a field’s
+server-side <a href="validation">validators</a>, so the browser rejects 
obviously-invalid input before the form is
+even submitted. This replaces the older, generated-JavaScript validator used 
by the <em>xhtml theme</em> and
+<em>css_xhtml theme</em>, which is now deprecated — see <a 
href="#pure-javascript-client-side-validation-deprecated">Pure JavaScript 
Client Side Validation
+(deprecated)</a> below.</p>
 
-<p>Client-side validation can be enabled on a per-form basis by specifying 
<code class="language-plaintext highlighter-rouge">validate="true"</code> in 
the <em>form</em> tag.</p>
+<p>There is also <a href="ajax-client-side-validation">AJAX Client Side 
Validation</a>, which runs the full server-side
+validation stack (including visitor validators and <code 
class="language-plaintext highlighter-rouge">validate()</code>) over AJAX and 
is unaffected by any of this.</p>
 
-<div class="language-jsp highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="nt">&lt;s:form </span><span 
class="na">name=</span><span class="s">"test"</span><span class="na"> 
action=</span><span class="s">"javascriptValidation"</span><span class="na"> 
validate=</span><span class="s">"true"</span><span class="nt">&gt;</span>
-  ...
-<span class="nt">&lt;/s:form&gt;</span>
-</code></pre></div></div>
-
-<p>If a <code class="language-plaintext highlighter-rouge">name</code> for the 
form is not given, the action mapping name will be used as the form name. 
Otherwise, a correct 
-<code class="language-plaintext highlighter-rouge">action</code> and <code 
class="language-plaintext highlighter-rouge">namespace</code> attributes must 
be provided to the <code class="language-plaintext 
highlighter-rouge">&lt;saf:form&gt;</code> tag.</p>
-
-<h2 id="referencing-submitprofile-in-the-user-namespace">Referencing 
“submitProfile” in the “/user” namespace</h2>
-
-<div class="language-jsp highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="nt">&lt;s:form </span><span 
class="na">namespace=</span><span class="s">"/user"</span><span class="na"> 
action=</span><span class="s">"submitProfile"</span><span class="na"> 
validate=</span><span class="s">"true"</span><span class="nt">&gt;</span>
-  ...
-<span class="nt">&lt;/s:form&gt;</span>
-</code></pre></div></div>
+<h2 id="html5-constraint-validation">HTML5 Constraint Validation</h2>
 
-<p>Technically, the form’s action attribute can refer to a “path” that 
includes the namespace and action as a URI. 
-But, client-side validation <strong>requires</strong> that the action name and 
namespeact to be set separately.</p>
+<h3 id="enabling-it">Enabling it</h3>
 
-<h2 id="wont-work-with-client-side-validation">Won’t work with client-side 
validation!</h2>
-
-<div class="language-jsp highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="nt">&lt;s:form </span><span 
class="na">action=</span><span 
class="s">"/user/submitProfile.action"</span><span class="na"> 
validate=</span><span class="s">"true"</span><span class="nt">&gt;</span>
-  ...
-<span class="nt">&lt;/s:form&gt;</span>
+<p>HTML5 constraint validation is off by default. Turn it on with the <code 
class="language-plaintext highlighter-rouge">struts.ui.html5.constraints</code> 
constant:</p>
 
+<div class="language-properties highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span 
class="py">struts.ui.html5.constraints</span><span class="p">=</span><span 
class="s">true</span>
 </code></pre></div></div>
 
-<p>All the usual <a href="validation">validation configuration</a> steps apply 
to client-side validation. Client-side validation 
-uses the same validation rules as server-side validation. If server-side 
validation doesn’t work, then client-side 
-validation won’t work either.</p>
-
-<h2 id="the-left-hand-doesnt-know-">The left hand doesn’t know …</h2>
+<p>It only has an effect on fields rendered with the <code 
class="language-plaintext highlighter-rouge">html5</code> theme (see <a 
href="../tag-developers/html5-theme#using-the-html5-theme">Using the HTML5
+theme</a>). There is no per-form opt-in attribute —
+unlike the deprecated JavaScript validator, this feature does not use <code 
class="language-plaintext highlighter-rouge">&lt;s:form 
validate="true"&gt;</code>. Once the
+constant is on and a field’s theme is <code class="language-plaintext 
highlighter-rouge">html5</code>, its validators are consulted automatically.</p>
 
 <blockquote>
-  <p>The required attribute on many <em>Struts Tags</em> is not integrated 
with client-side validation! The tag attribute is used 
-by certain themes (like xhtml) to put a visual marker (usually ‘*’) next to 
the field. The tag doesn’t know 
-if the validation system actually “requires” the field or not.</p>
+  <p>The constant defaults to <code class="language-plaintext 
highlighter-rouge">false</code> so existing <code class="language-plaintext 
highlighter-rouge">html5</code>-theme forms keep rendering unchanged. The 
default is
+expected to flip to <code class="language-plaintext 
highlighter-rouge">true</code> in a future major release, tracked by
+<a href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>.</p>
 </blockquote>
 
-<h2 id="example">Example</h2>
+<h3 id="the-governing-rule-never-false-reject">The governing rule: never 
false-reject</h3>
+
+<p>The mapping is deliberately conservative. A constraint is emitted only when 
the browser cannot reject
+input the server would have accepted. If the browser rejected something the 
server allows, the user would
+be stuck with a form that will not submit and no explanation why. Being 
conservative simply costs a field
+its client-side check — that’s a harmless, quiet failure mode, so the mapping 
always chooses it over the
+alternative.</p>
 
-<p>See <a href="client-validation-example">Client Validation example</a> for a 
complete example of client-side validation.</p>
+<p>The clearest consequence of this rule: <strong>Struts never sets or changes 
an input’s <code class="language-plaintext 
highlighter-rouge">type</code>.</strong> A field stays
+whatever <code class="language-plaintext highlighter-rouge">type</code> the 
developer gave it. In particular:</p>
+
+<ul>
+  <li>Switching a field to <code class="language-plaintext 
highlighter-rouge">type="number"</code> would reject a value like <code 
class="language-plaintext highlighter-rouge">1234,50</code>, which the 
framework’s
+locale-aware numeric conversion happily accepts in a comma-decimal locale.</li>
+  <li>The browsers’ <code class="language-plaintext 
highlighter-rouge">email</code> and <code class="language-plaintext 
highlighter-rouge">url</code> input grammars don’t match <code 
class="language-plaintext highlighter-rouge">EmailValidator</code> and <code 
class="language-plaintext highlighter-rouge">UrlValidator</code>.</li>
+</ul>
 
-<h2 id="client-side-validation-types">Client Side Validation Types</h2>
+<p>So <code class="language-plaintext highlighter-rouge">min</code>/<code 
class="language-plaintext highlighter-rouge">max</code> range constraints are 
only ever added to a control the developer <em>already</em> made numeric
+(<code class="language-plaintext highlighter-rouge">type="number"</code> or 
<code class="language-plaintext highlighter-rouge">type="range"</code>) — 
Struts will never promote a plain text field into one just because
+an <code class="language-plaintext highlighter-rouge">int</code> or <code 
class="language-plaintext highlighter-rouge">double</code> validator is 
attached to it.</p>
 
-<p>There are two styles of client side validation.</p>
+<h3 id="mapping-table">Mapping table</h3>
 
 <table>
   <thead>
     <tr>
-      <th><a href="pure-java-script-client-side-validation">Pure JavaScript 
Client Side Validation</a></th>
-      <th>Used by the <em>xhtml theme</em> and <em>css_xhtml theme</em></th>
+      <th>Validator</th>
+      <th>Emits</th>
+      <th>Condition</th>
     </tr>
   </thead>
   <tbody>
     <tr>
-      <td><a href="ajax-client-side-validation">AJAX Client Side 
Validation</a></td>
-      <td>Use to used by the <em>ajax theme</em></td>
+      <td><code class="language-plaintext 
highlighter-rouge">requiredstring</code></td>
+      <td><code class="language-plaintext 
highlighter-rouge">required</code></td>
+      <td>on text-entry controls (<code class="language-plaintext 
highlighter-rouge">text</code>, <code class="language-plaintext 
highlighter-rouge">search</code>, <code class="language-plaintext 
highlighter-rouge">tel</code>, <code class="language-plaintext 
highlighter-rouge">password</code>, <code class="language-plaintext 
highlighter-rouge">email</code>, <code class="language-plaintext 
highlighter-rouge">url</code>) and <code class="language-plaintext 
highlighter-rouge">textarea</code></td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext 
highlighter-rouge">required</code></td>
+      <td><code class="language-plaintext 
highlighter-rouge">required</code></td>
+      <td>only on <code class="language-plaintext 
highlighter-rouge">radio</code> and <code class="language-plaintext 
highlighter-rouge">file</code></td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext 
highlighter-rouge">stringlength</code></td>
+      <td><code class="language-plaintext highlighter-rouge">minlength</code> 
/ <code class="language-plaintext highlighter-rouge">maxlength</code></td>
+      <td>on text-entry or <code class="language-plaintext 
highlighter-rouge">textarea</code>, and only if the validator has <code 
class="language-plaintext highlighter-rouge">trim="false"</code>; each 
attribute is added only if actually configured</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">regex</code></td>
+      <td><code class="language-plaintext 
highlighter-rouge">pattern</code></td>
+      <td>on text-entry controls only, and only if <code 
class="language-plaintext highlighter-rouge">caseSensitive="true"</code>, <code 
class="language-plaintext highlighter-rouge">trim="false"</code>, the regex is 
ECMAScript-safe (see below), and the validator is not an <code 
class="language-plaintext highlighter-rouge">email</code> or <code 
class="language-plaintext highlighter-rouge">creditcard</code> validator (both 
extend <code class="language-plaintext highlighter-rouge">RegexFiel [...]
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">int</code>, <code 
class="language-plaintext highlighter-rouge">short</code>, <code 
class="language-plaintext highlighter-rouge">long</code></td>
+      <td><code class="language-plaintext highlighter-rouge">min</code> / 
<code class="language-plaintext highlighter-rouge">max</code></td>
+      <td>only when the control is already <code class="language-plaintext 
highlighter-rouge">type="number"</code> or <code class="language-plaintext 
highlighter-rouge">type="range"</code></td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">double</code></td>
+      <td><code class="language-plaintext highlighter-rouge">min</code> / 
<code class="language-plaintext highlighter-rouge">max</code></td>
+      <td>same as above; only inclusive bounds are emitted — exclusive bounds 
have no HTML equivalent and are omitted</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">date</code></td>
+      <td>—</td>
+      <td>nothing yet; temporal <code class="language-plaintext 
highlighter-rouge">min</code>/<code class="language-plaintext 
highlighter-rouge">max</code> is deferred to a future release</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext highlighter-rouge">email</code>, 
<code class="language-plaintext highlighter-rouge">url</code>, <code 
class="language-plaintext highlighter-rouge">creditcard</code></td>
+      <td>—</td>
+      <td>never emitted</td>
+    </tr>
+    <tr>
+      <td><code class="language-plaintext 
highlighter-rouge">fieldexpression</code>, <code class="language-plaintext 
highlighter-rouge">expression</code>, <code class="language-plaintext 
highlighter-rouge">conversion</code>, visitor validators</td>
+      <td>—</td>
+      <td>never emitted</td>
+    </tr>
+    <tr>
+      <td>any validator carrying a message</td>
+      <td><code class="language-plaintext 
highlighter-rouge">data-msg-&lt;validatorType&gt;</code></td>
+      <td>always added, including for validators that emit no constraint 
attribute at all</td>
     </tr>
   </tbody>
 </table>
 
+<p>Two of these conditions are easy to miss and sharply limit how often <code 
class="language-plaintext highlighter-rouge">required</code>, <code 
class="language-plaintext highlighter-rouge">minlength</code>/<code 
class="language-plaintext highlighter-rouge">maxlength</code>,
+and <code class="language-plaintext highlighter-rouge">pattern</code> actually 
show up:</p>
+
+<p><strong><code class="language-plaintext highlighter-rouge">required</code> 
is split across two validators, and they don’t behave alike.</strong> <code 
class="language-plaintext highlighter-rouge">requiredstring</code> fails on
+null, empty, and (by default) blank values, so it is strictly stricter than 
the browser’s <code class="language-plaintext 
highlighter-rouge">required</code> — safe
+to emit on any text-entry control. Plain <code class="language-plaintext 
highlighter-rouge">required</code>, however, only fails on a null value, an 
empty array,
+or an empty collection. That means an empty text input (which submits <code 
class="language-plaintext highlighter-rouge">""</code>, not nothing), a <code 
class="language-plaintext highlighter-rouge">select</code> with
+an empty-valued option, and an <strong>unticked checkbox</strong> (<code 
class="language-plaintext highlighter-rouge">CheckboxInterceptor</code> 
substitutes the parameter
+<code class="language-plaintext highlighter-rouge">"false"</code> for it) all 
pass server-side validation while a browser <code class="language-plaintext 
highlighter-rouge">required</code> attribute would block them.
+Only <code class="language-plaintext highlighter-rouge">radio</code> and <code 
class="language-plaintext highlighter-rouge">file</code> controls omit their 
parameter entirely when left empty, so those are the only two
+control types where plain <code class="language-plaintext 
highlighter-rouge">required</code> agrees with the server — which is why the 
table above emits <code class="language-plaintext 
highlighter-rouge">required</code>
+for the <code class="language-plaintext highlighter-rouge">required</code> 
validator on those two types alone.</p>
+
+<p><strong>Both <code class="language-plaintext 
highlighter-rouge">minlength</code>/<code class="language-plaintext 
highlighter-rouge">maxlength</code> and <code class="language-plaintext 
highlighter-rouge">pattern</code> need <code class="language-plaintext 
highlighter-rouge">trim="false"</code>, which is not the default.</strong> Both
+<code class="language-plaintext 
highlighter-rouge">StringLengthFieldValidator.trim</code> and <code 
class="language-plaintext highlighter-rouge">RegexFieldValidator.trim</code> 
default to <code class="language-plaintext highlighter-rouge">true</code>, so 
the server measures
+or matches the field’s <em>trimmed</em> value while the HTML attribute 
constrains the <em>raw</em> one. A <code class="language-plaintext 
highlighter-rouge">stringlength</code>
+validator with <code class="language-plaintext 
highlighter-rouge">maxLength="4"</code> accepts <code class="language-plaintext 
highlighter-rouge">"abcd "</code> — it trims to four characters, which is 
within the limit —
+but a browser enforcing <code class="language-plaintext 
highlighter-rouge">maxlength="4"</code> would stop the user typing the fifth 
character at all. Likewise, a
+<code class="language-plaintext highlighter-rouge">regex</code> of <code 
class="language-plaintext highlighter-rouge">[a-z]+</code> accepts <code 
class="language-plaintext highlighter-rouge">"abc "</code> server-side (it 
trims to <code class="language-plaintext highlighter-rouge">"abc"</code> first) 
while the browser, matching the
+raw value, blocks it. Because of this, <code class="language-plaintext 
highlighter-rouge">minlength</code>/<code class="language-plaintext 
highlighter-rouge">maxlength</code> and <code class="language-plaintext 
highlighter-rouge">pattern</code> are only ever emitted
+for validators explicitly configured with <code class="language-plaintext 
highlighter-rouge">trim="false"</code> — which most existing <code 
class="language-plaintext highlighter-rouge">stringlength</code> and <code 
class="language-plaintext highlighter-rouge">regex</code>
+validators are not. In practice, expect both to show up rarely until 
applications start setting
+<code class="language-plaintext highlighter-rouge">trim="false"</code> 
deliberately for fields where it’s safe.</p>
+
+<p><strong>ECMAScript-safe</strong> means the regex uses only constructs that 
mean the same thing in Java’s regex engine
+and in the browser’s: literals, <code class="language-plaintext 
highlighter-rouge">\d</code>/<code class="language-plaintext 
highlighter-rouge">\w</code> and their negations, character classes without 
POSIX or Unicode
+property syntax, grouping, alternation, anchors, and bounded quantifiers. 
Notably, <strong><code class="language-plaintext highlighter-rouge">\s</code> 
and <code class="language-plaintext highlighter-rouge">\S</code> are
+excluded</strong> — Java’s <code class="language-plaintext 
highlighter-rouge">\s</code> is ASCII-only by default while ECMAScript’s <code 
class="language-plaintext highlighter-rouge">\s</code> covers the wider Unicode
+whitespace set, so a pattern like <code class="language-plaintext 
highlighter-rouge">^\S+$</code> would accept a value containing a non-breaking 
space server-side
+and reject it in the browser. Any regex using a construct outside this 
allowlist simply gets no <code class="language-plaintext 
highlighter-rouge">pattern</code>
+attribute at all — it is never rejected loudly, it just quietly doesn’t get a 
client-side check.</p>
+
+<h3 id="data-msg--attributes"><code class="language-plaintext 
highlighter-rouge">data-msg-*</code> attributes</h3>
+
+<p>Every validator carrying a message — even one that emits no HTML constraint 
attribute at all — adds a
+<code class="language-plaintext 
highlighter-rouge">data-msg-&lt;validatorType&gt;</code> attribute (for example 
<code class="language-plaintext highlighter-rouge">data-msg-email</code>, <code 
class="language-plaintext highlighter-rouge">data-msg-regex</code>) holding the
+validator’s fully resolved, internationalized message. <strong>Struts ships no 
JavaScript that reads these.</strong>
+They exist purely as a hook: an application can write its own script to read 
<code class="language-plaintext highlighter-rouge">data-msg-*</code> and show
+whichever messages it wants, in whatever way it wants, including for 
validators (like <code class="language-plaintext 
highlighter-rouge">email</code> or
+<code class="language-plaintext highlighter-rouge">creditcard</code>) that 
never get a native browser check.</p>
+
+<h3 id="requiredlabel-is-unrelated-to-the-required-attribute"><code 
class="language-plaintext highlighter-rouge">requiredLabel</code> is unrelated 
to the <code class="language-plaintext highlighter-rouge">required</code> 
attribute</h3>
+
+<p>This is a common point of confusion: the <code class="language-plaintext 
highlighter-rouge">requiredLabel</code> tag attribute only controls whether a 
visual
+marker (usually <code class="language-plaintext highlighter-rouge">*</code>) 
is drawn next to a field’s label. It has no connection to the HTML <code 
class="language-plaintext highlighter-rouge">required</code>
+attribute described above, and setting <code class="language-plaintext 
highlighter-rouge">requiredLabel="true"</code> does not make a field required 
in the
+browser — the two are decided completely independently.</p>
+
+<h3 id="extension-point-htmlconstraintprovider">Extension point: <code 
class="language-plaintext highlighter-rouge">HtmlConstraintProvider</code></h3>
+
+<p>The mapping above is implemented by <code class="language-plaintext 
highlighter-rouge">StrutsHtmlConstraintProvider</code>, the default 
implementation of the
+<code class="language-plaintext 
highlighter-rouge">HtmlConstraintProvider</code> interface, registered under 
the <code class="language-plaintext 
highlighter-rouge">struts.htmlConstraintProvider</code> constant:</p>
+
+<div class="language-properties highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span 
class="py">struts.htmlConstraintProvider</span><span class="p">=</span><span 
class="s">struts</span>
+</code></pre></div></div>
+
+<p>An application that wants a less conservative mapping — for example, 
treating an <code class="language-plaintext highlighter-rouge">email</code> 
validator as
+<code class="language-plaintext highlighter-rouge">type="email"</code>, or 
emitting <code class="language-plaintext highlighter-rouge">pattern</code> for 
case-insensitive regexes by rewriting them — can register its own
+<code class="language-plaintext 
highlighter-rouge">HtmlConstraintProvider</code> implementation under this 
constant instead of the default. This is the escape
+hatch for every limitation described above: the framework’s own mapping stays 
deliberately conservative,
+but nothing stops an application from replacing it with one that fits its own 
validators and locales.</p>
+
+<h2 id="pure-javascript-client-side-validation-deprecated">Pure JavaScript 
Client Side Validation (deprecated)</h2>
+
+<blockquote>
+  <p><strong>Deprecated since Struts 7.4.0 (<a 
href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>), removed in
+Struts 8.0.0 (<a 
href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>).</strong> New 
applications should use
+the <a href="#html5-constraint-validation">html5 theme’s constraint 
validation</a> described above instead.</p>
+</blockquote>
+
+<p>The <code class="language-plaintext highlighter-rouge">&lt;s:form 
validate="true"&gt;</code> attribute enables an older client-side validation 
mechanism, used by the
+<em>xhtml theme</em> and <em>css_xhtml theme</em>. It uses 100% client-side 
JavaScript, generated from the same
+validation configuration used server-side, to try to reject bad input before 
the form is submitted:</p>
+
+<div class="language-jsp highlighter-rouge"><div class="highlight"><pre 
class="highlight"><code><span class="nt">&lt;s:form </span><span 
class="na">name=</span><span class="s">"test"</span><span class="na"> 
action=</span><span class="s">"javascriptValidation"</span><span class="na"> 
validate=</span><span class="s">"true"</span><span class="nt">&gt;</span>
+  ...
+<span class="nt">&lt;/s:form&gt;</span>
+</code></pre></div></div>
+
+<p>If a <code class="language-plaintext highlighter-rouge">name</code> for the 
form is not given, the action mapping name is used as the form name. Otherwise, 
a
+correct <code class="language-plaintext highlighter-rouge">action</code> and 
<code class="language-plaintext highlighter-rouge">namespace</code> attribute 
must be provided to the <code class="language-plaintext 
highlighter-rouge">&lt;s:form&gt;</code> tag — client-side validation
+requires the action name and namespace to be resolvable separately, so a form 
whose <code class="language-plaintext highlighter-rouge">action</code> is given 
as a
+full URI (for example <code class="language-plaintext 
highlighter-rouge">&lt;s:form action="/user/submitProfile.action" 
validate="true"&gt;</code>) will not get
+client-side validation, even though the form still works.</p>
+
+<p>Because the validation logic is repeated in generated JavaScript, only a 
subset of validators is
+supported (<code class="language-plaintext highlighter-rouge">required</code>, 
<code class="language-plaintext highlighter-rouge">requiredstring</code>, <code 
class="language-plaintext highlighter-rouge">stringlength</code>, <code 
class="language-plaintext highlighter-rouge">regex</code>, <code 
class="language-plaintext highlighter-rouge">email</code>, <code 
class="language-plaintext highlighter-rouge">url</code>, <code 
class="language-plaintext highlighter-rouge">int</code>, <code class [...]
+not available for visitor validators at all, and — being a separate 
implementation of each validator’s
+logic — some values the JavaScript accepts may still be rejected server-side, 
or vice versa. This is one of
+the reasons it is being replaced: the html5 theme’s constraint validation 
above is derived directly from
+the real validators, rather than reimplementing them in JavaScript.</p>
+
+<h2 id="example">Example</h2>
+
+<p>See <a href="client-validation-example">Client Validation example</a> for a 
complete, though now-deprecated, example
+of the JavaScript-based client-side validation described above.</p>
+
   </section>
 </article>
 
diff --git a/output/core-developers/client-validation-example.html 
b/output/core-developers/client-validation-example.html
index c552a99f7..1f1641458 100644
--- a/output/core-developers/client-validation-example.html
+++ b/output/core-developers/client-validation-example.html
@@ -154,6 +154,14 @@
     
     <h1 id="client-validation-example">Client Validation Example</h1>
 
+<blockquote>
+  <p><strong>Deprecated since Struts 7.4.0 (<a 
href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>), removed in
+Struts 8.0.0 (<a 
href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>).</strong> 
This example walks through the
+generated-JavaScript client-side validator (<code class="language-plaintext 
highlighter-rouge">&lt;s:form validate="true"&gt;</code>) used by the <em>xhtml 
theme</em> and
+<em>css_xhtml theme</em>. New applications should use the <a 
href="client-side-validation#html5-constraint-validation">html5 theme’s 
constraint
+validation</a> instead.</p>
+</blockquote>
+
 <p>Let’s create a Client-Side validation workflow, step by step. The <code 
class="language-plaintext highlighter-rouge">validate</code> attribute is set 
to <code class="language-plaintext highlighter-rouge">true</code>.</p>
 
 <blockquote>
diff --git a/output/core-developers/default-properties.html 
b/output/core-developers/default-properties.html
index d73264040..3c8a45fb2 100644
--- a/output/core-developers/default-properties.html
+++ b/output/core-developers/default-properties.html
@@ -339,11 +339,20 @@ struts.ui.theme.expansion.token=~~~
 ### Sets the default template type. Either ftl, vm, or jsp
 struts.ui.templateSuffix=ftl
 
+### Whether the html5 theme emits HTML5 constraint attributes (required, 
minlength,
+### maxlength, pattern, min, max) derived from the action's validators.
+### Defaults to false so existing html5-theme forms render unchanged; the 
default is
+### expected to flip in a future major release.
+struts.ui.html5.constraints=false
+
 ### Sets a global flag which will escape html body of Anchor, Submit and 
Component tag
 ### You can control this flag per tag, e.g.: &lt;s:a ... 
escapeHtmlTag="true"&gt;...&lt;/s:a&gt;
 ### and this take precedence over the global flag
 # struts.ui.escapeHtmlBody=true
 
+### The HtmlConstraintProvider implementation used to derive HTML5 constraint 
attributes
+struts.htmlConstraintProvider=struts
+
 ### Configuration reloading
 ### This will cause the configuration to reload struts.xml when it is changed
 # struts.configuration.xml.reload=false
diff --git 
a/output/core-developers/pure-java-script-client-side-validation.html 
b/output/core-developers/pure-java-script-client-side-validation.html
deleted file mode 100644
index 96d998426..000000000
--- a/output/core-developers/pure-java-script-client-side-validation.html
+++ /dev/null
@@ -1,235 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8"/>
-  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
-  <meta name="Date-Revision-yyyymmdd" content="20140918"/>
-  <meta http-equiv="Content-Language" content="en"/>
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-
-  <title>Pure JavaScript Client Side Validation</title>
-
-  <link href="/css/source-sans-pro.css" rel="stylesheet" type="text/css">
-  <link href="/css/font-awesome.css" rel="stylesheet">
-  <link href="/css/main.css" rel="stylesheet">
-  <link href="/css/custom.css" rel="stylesheet">
-  <link href="/css/syntax.css" rel="stylesheet">
-
-  <script src="/js/jquery-1.11.0.min.js"></script>
-  <script type="text/javascript" src="/bootstrap/js/bootstrap.js"></script>
-  <script type="text/javascript" src="/js/community.js"></script>
-
-  <!-- Matomo -->
-  <script>
-    var _paq = window._paq = window._paq || [];
-    /* tracker methods like "setCustomDimension" should be called before 
"trackPageView" */
-    /* We explicitly disable cookie tracking to avoid privacy issues */
-    _paq.push(['disableCookies']);
-    _paq.push(['trackPageView']);
-    _paq.push(['enableLinkTracking']);
-    (function() {
-      var u="//analytics.apache.org/";
-      _paq.push(['setTrackerUrl', u+'matomo.php']);
-      _paq.push(['setSiteId', '41']);
-      var d=document, g=d.createElement('script'), 
s=d.getElementsByTagName('script')[0];
-      g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
-    })();
-  </script>
-  <!-- End Matomo Code -->
-</head>
-<body>
-
-<a href="https://github.com/apache/struts"; class="github-ribbon">
-  <img decoding="async" loading="lazy" style="position: absolute; right: 0; 
border: 0;" width="149" height="149" 
src="/img/forkme_right_red_aa0000.webp?resize=149%2C149" class="attachment-full 
size-full" alt="Fork me on GitHub" data-recalc-dims="1">
-</a>
-
-<header>
-  <nav>
-    <div role="navigation" class="navbar navbar-default navbar-fixed-top">
-      <div class="container">
-        <div class="navbar-header">
-          <button type="button" data-toggle="collapse" 
data-target="#struts-menu" class="navbar-toggle">
-            Menu
-            <span class="sr-only">Toggle navigation</span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-          </button>
-          <a href="/index.html" class="navbar-brand logo"><img 
src="/img/struts-logo.svg"></a>
-        </div>
-        <div id="struts-menu" class="navbar-collapse collapse">
-          <ul class="nav navbar-nav">
-            <li class="dropdown">
-              <a data-toggle="dropdown" href="#" class="dropdown-toggle">
-                Home<b class="caret"></b>
-              </a>
-              <ul class="dropdown-menu">
-                <li><a href="/index.html">Welcome</a></li>
-                <li><a href="/download.cgi">Download</a></li>
-                <li><a href="/releases.html">Releases</a></li>
-                <li><a href="/announce-2026.html">Announcements</a></li>
-                <li><a href="http://www.apache.org/licenses/";>License</a></li>
-                <li><a 
href="https://www.apache.org/foundation/thanks.html";>Thanks!</a></li>
-                <li><a 
href="https://www.apache.org/foundation/sponsorship.html";>Sponsorship</a></li>
-                <li><a 
href="https://privacy.apache.org/policies/privacy-policy-public.html";>Privacy 
Policy</a></li>
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a data-toggle="dropdown" href="#" class="dropdown-toggle">
-                Support<b class="caret"></b>
-              </a>
-              <ul class="dropdown-menu">
-                <li><a href="/mail.html">User Mailing List</a></li>
-                <li><a href="https://issues.apache.org/jira/browse/WW";>Issue 
Tracker</a></li>
-                <li><a href="/security.html">Reporting Security Issues</a></li>
-                <li><a href="/commercial-support.html">Commercial 
Support</a></li>
-                <li><a href="/eol-versions.html">End-of-Life Versions</a></li>
-                <li class="divider"></li>
-                <li><a 
href="https://cwiki.apache.org/confluence/display/WW/Migration+Guide";>Version 
Notes</a></li>
-                <li><a 
href="https://cwiki.apache.org/confluence/display/WW/Security+Bulletins";>Security
 Bulletins</a></li>
-                <li><a href="/idea-plugin">IntelliJ IDEA plugin</a></li>
-                <li class="divider"></li>
-                <li><a href="/maven/project-info.html">Maven Project 
Info</a></li>
-                <li><a href="/maven/struts2-core/dependencies.html">Struts 
Core Dependencies</a></li>
-                <li><a href="/maven/struts2-plugins/modules.html">Plugin 
Dependencies</a></li>
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a data-toggle="dropdown" href="#" class="dropdown-toggle">
-                Documentation<b class="caret"></b>
-              </a>
-              <ul class="dropdown-menu">
-                <li><a href="/birdseye.html">Birds Eye</a></li>
-                <li><a href="/primer.html">Key Technologies</a></li>
-                <li><a href="/kickstart.html">Kickstart FAQ</a></li>
-                <li><a 
href="https://cwiki.apache.org/confluence/display/WW/Home";>Wiki</a></li>
-                <li class="divider"></li>
-                <li><a href="/getting-started/">Getting Started</a></li>
-                <li><a href="/security/">Security Guide</a></li>
-                <li><a href="/core-developers/">Core Developers Guide</a></li>
-                <li><a href="/tag-developers/">Tag Developers Guide</a></li>
-                <li><a href="/maven-archetypes/">Maven Archetypes</a></li>
-                <li><a href="/plugins/">Plugins</a></li>
-                <li><a href="/maven/struts2-core/apidocs/index.html">Struts 
Core API</a></li>
-                <li><a href="/tag-developers/tag-reference.html">Tag 
reference</a></li>
-                <li><a 
href="https://cwiki.apache.org/confluence/display/WW/FAQs";>FAQs</a></li>
-                <li><a 
href="http://cwiki.apache.org/S2PLUGINS/home.html";>Plugin registry</a></li>
-              </ul>
-            </li>
-            <li class="dropdown">
-              <a data-toggle="dropdown" href="#" class="dropdown-toggle">
-                Contributing<b class="caret"></b>
-              </a>
-              <ul class="dropdown-menu">
-                <li><a href="/youatstruts.html">You at Struts</a></li>
-                <li><a href="/helping.html">How to Help FAQ</a></li>
-                <li><a href="/dev-mail.html">Development Lists</a></li>
-                <li class="divider"></li>
-                <li><a href="/submitting-patches.html">Submitting 
patches</a></li>
-                <li><a href="/builds.html">Source Code and Builds</a></li>
-                <li><a href="/coding-standards.html">Coding standards</a></li>
-                <li><a href="/contributors/">Contributors Guide</a></li>
-                <li class="divider"></li>
-                <li><a href="/release-guidelines.html">Release 
Guidelines</a></li>
-                <li><a href="/bylaws.html">PMC Charter</a></li>
-                <li><a href="/volunteers.html">Volunteers</a></li>
-                <li><a 
href="https://gitbox.apache.org/repos/asf?p=struts.git";>Source 
Repository</a></li>
-                <li><a href="/updating-website.html">Updating the 
website</a></li>
-              </ul>
-            </li>
-            <li class="apache"><a href="http://www.apache.org/";><img 
src="/img/apache.png"></a></li>
-          </ul>
-        </div>
-      </div>
-    </div>
-  </nav>
-</header>
-
-
-<article class="container">
-  <section class="col-md-12">
-    <a class="edit-on-gh" 
href="https://github.com/apache/struts-site/edit/main/source/core-developers/pure-java-script-client-side-validation.md";
 title="Edit this page on GitHub">Edit on GitHub</a>
-    
-    <a href="client-side-validation" title="back to Client Side Validation"><< 
back to Client Side Validation</a>
-    
-    <h1 class="no_toc" id="pure-javascript-client-side-validation">Pure 
JavaScript Client Side Validation</h1>
-
-<ul id="markdown-toc">
-  <li><a href="#description" id="markdown-toc-description">Description</a></li>
-  <li><a href="#error-reporting" id="markdown-toc-error-reporting">Error 
reporting</a></li>
-  <li><a href="#additional-validator-support" 
id="markdown-toc-additional-validator-support">Additional Validator 
Support</a></li>
-</ul>
-
-<h2 id="description">Description</h2>
-
-<p>Pure JavaScript client side validation is the simplest but least 
feature-rich type of <a href="client-side-validation">Client Side 
Validation</a>. 
-This type of validation uses 100% client-side JavaScript code to try to 
validate the values entered by the user. 
-Because the validation logic is actually repeated in the JavaScript code, it 
is important to understand that 
-some values will be considered acceptable by the JavaScript code but will be 
marked as unacceptable by the server-side <a 
href="validation">Validation</a>.</p>
-
-<p>Only the following validators are supported:</p>
-
-<ul>
-  <li>required validator</li>
-  <li>requiredstring validator</li>
-  <li>stringlength validator</li>
-  <li>regex validator</li>
-  <li>email validator</li>
-  <li>url validator</li>
-  <li>int validator</li>
-  <li>double validator</li>
-</ul>
-
-<blockquote>
-  <p>JavaScript client validation is not available for visitor validations.</p>
-</blockquote>
-
-<h2 id="error-reporting">Error reporting</h2>
-
-<p>Because client side validation does not talk to the server, the theme 
(<em>xhtml theme</em>  or <em>css_xhtml theme</em> ) is responsible 
-for properly manipulating the HTML DOM to display the error message inline. 
The JavaScript that is responsible for doing 
-this logic is <code class="language-plaintext 
highlighter-rouge">validation.js</code> and can be found in each theme.</p>
-
-<blockquote>
-  <p>Errors are reported using the default validation message, not the 
internationalized version that the server-side might
-be aware of. This is a known issue. You may want to try the <a 
href="ajax-client-side-validation">AJAX Client Side Validation</a> 
-for messages that are fully internationalized.</p>
-</blockquote>
-
-<h2 id="additional-validator-support">Additional Validator Support</h2>
-
-<p>If you wish to add additional validator support beyond those listed, you 
may override the <em>xhtml theme</em>  template 
-<code class="language-plaintext 
highlighter-rouge">form-close-validate.ftl</code>. This file contains the 
JavaScript that tries to validate each user-entered value from within 
-the browser. The <em>css_xhtml theme</em>  extends the <em>xhtml theme</em>  
and therefore doesn’t have its own <code class="language-plaintext 
highlighter-rouge">form-close-validate.ftl</code>
-template.</p>
-
-  </section>
-</article>
-
-
-<footer class="container">
-  <div class="col-md-12">
-    Copyright &copy; 2000-2025 <a href="https://www.apache.org/";>The Apache 
Software Foundation</a>.
-    Apache Struts, Struts, Apache, the Apache feather logo, and the Apache 
Struts project logos are
-    trademarks of The Apache Software Foundation. All Rights Reserved.
-  </div>
-  <div class="col-md-12">Logo and website design donated by <a 
href="https://softwaremill.com/";>SoftwareMill</a>.</div>
-</footer>
-
-<a href="https://twitter.com/x?ref_src=twsrc%5Etfw"; 
class="twitter-follow-button" data-show-count="false">Follow @x</a>
-<script async src="/js/twitter-widgets.js" charset="utf-8"></script>
-
-<div id="fb-root"></div>
-
-<script>(function (d, s, id) {
-  var js, fjs = d.getElementsByTagName(s)[0];
-  if (d.getElementById(id)) return;
-  js = d.createElement(s);
-  js.id = id;
-  js.src = "/js/facebook-all.js";
-  fjs.parentNode.insertBefore(js, fjs);
-}(document, 'script', 'facebook-jssdk'));</script>
-
-
-</body>
-</html>
diff --git a/output/tag-developers/css-xhtml-theme.html 
b/output/tag-developers/css-xhtml-theme.html
index dbc090fff..9f19dabec 100644
--- a/output/tag-developers/css-xhtml-theme.html
+++ b/output/tag-developers/css-xhtml-theme.html
@@ -161,8 +161,10 @@
 <a href="textfield-tag">textfield</a>, <a href="select-tag">select</a>, 
etc)</li>
   <li>Labels for each of the HTML <a href="struts-tags">Struts Tags</a>, 
placed according to the CSS stylesheet</li>
   <li><a href="../core-developers/validation">Validation</a> and error 
reporting</li>
-  <li><a 
href="../core-developers/pure-java-script-client-side-validation">Pure 
JavaScript Client Side Validation</a> using 100% 
-JavaScript on the browser</li>
+  <li><a 
href="../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated">Pure
 JavaScript Client Side Validation</a> 
+using 100% JavaScript on the browser — deprecated since 7.4.0
+(<a href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>), removed 
in 8.0.0
+(<a href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>); use the 
<a href="html5-theme">html5 theme</a> instead</li>
 </ul>
 
 <h2 id="wrapping-the-simple-theme">Wrapping the Simple Theme</h2>
@@ -394,18 +396,20 @@ to provide the layout. The contents of 
<strong>head.ftl</strong> are:</p>
 <h3 id="form-template">Form template</h3>
 
 <p>The css_xhtml <a href="form-tag">form</a> template is almost exactly like 
the <em>xhtml form template</em> , including support for 
-<a href="../core-developers/pure-java-script-client-side-validation">Pure 
JavaScript Client Side Validation</a>. The difference 
-is that instead of printing out an opening and closing <code 
class="language-plaintext highlighter-rouge">&lt;table&gt;</code> element, 
there are no elements. Instead, the CSS rules 
-for the individual HTML tags are assumed to handle all display logic. However, 
as noted, client-side validation is still 
-supported.</p>
+<a 
href="../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated">Pure
 JavaScript Client Side Validation</a>
+(deprecated since 7.4.0 <a 
href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>, removed in 
8.0.0
+<a href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>). The 
difference is that instead of printing out an opening and closing 
+<code class="language-plaintext highlighter-rouge">&lt;table&gt;</code> 
element, there are no elements. Instead, the CSS rules for the individual HTML 
tags are assumed to handle all 
+display logic. However, as noted, client-side validation is still 
supported.</p>
 
 <h3 id="css_xhtml-form-template">css_xhtml form template</h3>
 
 <p>The css_xhtml <a href="form-tag">form</a> template is almost exactly like 
the <em>xhtml form template</em> , including support for 
-<a href="../core-developers/pure-java-script-client-side-validation">Pure 
JavaScript Client Side Validation</a>. The only 
-difference is that instead of printing out an opening and closing <code 
class="language-plaintext highlighter-rouge">&lt;table&gt;</code> element, 
there are no elements. Instead, 
-the CSS rules for the individual HTML tags are assumed to handle all display 
logic. However, as noted, client side 
-validation is still supported.</p>
+<a 
href="../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated">Pure
 JavaScript Client Side Validation</a>
+(deprecated since 7.4.0 <a 
href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>, removed in 
8.0.0
+<a href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>). The only 
difference is that instead of printing out an opening and 
+closing <code class="language-plaintext 
highlighter-rouge">&lt;table&gt;</code> element, there are no elements. 
Instead, the CSS rules for the individual HTML tags are assumed to 
+handle all display logic. However, as noted, client side validation is still 
supported.</p>
 
   </section>
 </article>
diff --git a/output/tag-developers/form-tag.html 
b/output/tag-developers/form-tag.html
index b75440a24..d64a5dc6a 100644
--- a/output/tag-developers/form-tag.html
+++ b/output/tag-developers/form-tag.html
@@ -662,6 +662,15 @@ are using (xhtml, ajax, etc). If you are using the <a 
href="xhtml-theme">xhtml t
 pure client side validation will be used. Read the <a 
href="../core-developers/client-side-validation">Client Side Validation</a>
 docs for more information.</p>
 
+<blockquote>
+  <p><strong><code class="language-plaintext 
highlighter-rouge">validate</code> is deprecated since Struts 7.4.0 and will be 
removed in 8.0.0</strong> 
+(<a href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>, 
+<a href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>). It only 
controls the older, generated-JavaScript 
+client-side validator used by the xhtml and css_xhtml themes. It has no effect 
on the <a 
href="../core-developers/client-side-validation#html5-constraint-validation">html5
 theme’s constraint 
+validation</a>, which applications should 
+use instead.</p>
+</blockquote>
+
   </section>
 </article>
 
diff --git a/output/tag-developers/xhtml-theme.html 
b/output/tag-developers/xhtml-theme.html
index 7550997b6..f4587651c 100644
--- a/output/tag-developers/xhtml-theme.html
+++ b/output/tag-developers/xhtml-theme.html
@@ -174,8 +174,10 @@
   <li>Labels for each of the HTML <a href="struts-tags">Struts Tags</a> on the 
left hand side (or top, depending on 
 the <code class="language-plaintext highlighter-rouge">labelposition</code> 
attribute)</li>
   <li><a href="../core-developers/validation">Validation</a> and error 
reporting</li>
-  <li><a 
href="../core-developers/pure-java-script-client-side-validation">Pure 
JavaScript Client Side Validation</a> using 
-100% JavaScript on the browser</li>
+  <li><a 
href="../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated">Pure
 JavaScript Client Side Validation</a> 
+using 100% JavaScript on the browser — deprecated since 7.4.0
+(<a href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>), removed 
in 8.0.0
+(<a href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>); use the 
<a href="html5-theme">html5 theme</a> instead</li>
 </ul>
 
 <h2 id="wrapping-the-simple-theme">Wrapping the Simple Theme</h2>
@@ -467,7 +469,9 @@ render the form elements.</p>
 
 <p>The xhtml form template sets up the wrapping table around all the other  
form elements. In addition to creating this 
 wrapping table, the opening and closing templates also, if the <code 
class="language-plaintext highlighter-rouge">validate</code> parameter is set 
to true, enable 
-<a href="../core-developers/pure-java-script-client-side-validation">Pure 
JavaScript Client Side Validation</a>.</p>
+<a 
href="../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated">Pure
 JavaScript Client Side Validation</a>
+(deprecated since 7.4.0 <a 
href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>, removed in 
8.0.0
+<a href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>).</p>
 
 <figure class="highlight"><pre><code class="language-freemarker" 
data-lang="freemarker">&lt;#--
 /*
@@ -541,7 +545,9 @@ wrapping table, the opening and closing templates also, if 
the <code class="lang
 
 <p>The xhtml form template sets up the wrapping table around all the other <a 
href="xhtml-theme">xhtml theme</a> form elements. 
 In addition to creating this wrapping table, the opening and closing templates 
also, if the <code class="language-plaintext highlighter-rouge">validate</code> 
parameter is set 
-to <code class="language-plaintext highlighter-rouge">true</code>, enable <a 
href="../core-developers/pure-java-script-client-side-validation.htmk">Pure 
JavaScript Client Side Validation</a>.</p>
+to <code class="language-plaintext highlighter-rouge">true</code>, enable <a 
href="../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated">Pure
 JavaScript Client Side Validation</a>
+(deprecated since 7.4.0 <a 
href="https://issues.apache.org/jira/browse/WW-5694";>WW-5694</a>, removed in 
8.0.0
+<a href="https://issues.apache.org/jira/browse/WW-5696";>WW-5696</a>).</p>
 
 <p>See the <strong>form.ftl</strong> contents:</p>
 

Reply via email to