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

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


The following commit(s) were added to refs/heads/main by this push:
     new 46b81fd5f docs: HTML5 constraint validation, deprecate the JavaScript 
validator (#326)
46b81fd5f is described below

commit 46b81fd5f7a05d104f7fd654e5a315dc14ed98a1
Author: Lukasz Lenart <[email protected]>
AuthorDate: Thu Aug 27 17:17:43 2026 +0200

    docs: HTML5 constraint validation, deprecate the JavaScript validator (#326)
    
    * docs: document html5 constraint validation, deprecate the JS validator
    
    Rewrites client-side-validation.md around the html5 theme's new HTML5
    constraint-validation attributes (struts.ui.html5.constraints), including 
the
    never-false-reject rule, the full validator-to-attribute mapping, the
    trim="false"/caseSensitive="true" conditions on stringlength/regex, the
    never-change-the-type rule, data-msg-* hooks, the requiredLabel/required
    distinction, and the swappable HtmlConstraintProvider extension point.
    
    Deprecates the older generated-JavaScript client-side validator (xhtml/
    css_xhtml themes, <s:form validate="true">) per WW-5694, removed in 8.0.0 
per
    WW-5696: deletes pure-java-script-client-side-validation.md, repoints its
    inbound links (xhtml-theme.md, css-xhtml-theme.md, 
ajax-client-side-validation.md)
    to the deprecated section of the rewritten page, adds deprecation banners to
    client-validation-example.md and form-tag.md's validate attribute.
    
    Drops the deleted page's claim that client-side messages are not
    internationalized: ValidatorSupport.getMessage resolves through
    DelegatingValidatorContext and textProviderFactory, so they always were.
    
    Co-Authored-By: Claude Opus 5 <[email protected]>
    
    * docs: stop asserting a specific version for the html5.constraints default 
flip
    
    The shipped javadoc and default.properties deliberately say the
    struts.ui.html5.constraints default is "expected to flip in a future major
    release" rather than naming 8.0.0, since the release version is chosen at
    release time from the accumulated semver impact. The docs page asserted "in
    Struts 8.0.0" instead, which is a firmer commitment than the code itself
    makes. Softened to match the code's wording, with WW-5696 linked so the 
claim
    stays traceable.
    
    Also makes every other "removed in 8.0.0" claim (the JS validator's removal)
    cite WW-5694/WW-5696 inline rather than floating as a bare assertion. Naming
    8.0.0 for that removal is kept as-is: it's a major-version removal, already
    committed to in Form.java's own @Deprecated(since = "7.4.0", forRemoval =
    true) javadoc, and WW-5696 is filed against it.
    
    Co-Authored-By: Claude Opus 5 <[email protected]>
    
    * docs: add the regex validator's fourth pattern gate, generalize the trim 
note
    
    The regex row promised pattern whenever text-entry, caseSensitive="true",
    trim="false" and ECMAScript-safe held, but StrutsHtmlConstraintProvider has 
a
    fourth gate: email and creditcard validators are excluded even then, since
    both extend RegexFieldValidator but carry grammars the browser doesn't 
share.
    
    Also generalizes the trim="false" explanation: 
StringLengthFieldValidator.trim
    defaults to true just like RegexFieldValidator.trim, so minlength/maxlength 
are
    emitted just as rarely as pattern is, for the same reason (server measures/
    matches the trimmed value, browser sees the raw one). The page previously
    warned about this only for pattern, which understated stringlength's own
    reach. Reworked into one shared paragraph covering both.
    
    Co-Authored-By: Claude Opus 5 <[email protected]>
    
    * docs: fix the stringlength example's direction (server accepts, browser 
blocks)
    
    The previous sentence said a stringlength validator with maxLength="4" would
    reject "abcd " server-side after trimming — backwards. Trimmed to "abcd" (4
    chars), StringLengthFieldValidator.validateValue only rejects when
    trimmedLength > maxLengthToUse, and 4 > 4 is false, so the server accepts 
it.
    The paragraph exists to show the server-accepts/browser-blocks asymmetry 
that
    makes emitting the constraint attribute risky if trim isn't false; an 
example
    asserting the opposite direction illustrated nothing.
    
    Corrected to state the server accepts "abcd " while a browser maxlength="4"
    would stop the fifth character from ever being typed, matching the direction
    of the retained [a-z]+/"abc " regex example alongside it.
    
    Co-Authored-By: Claude Opus 5 <[email protected]>
    
    * docs: redirect the removed pure-javascript page to its new section
    
    The page was folded into client-side-validation.md as a deprecated section,
    which frees the URL but 404s external inbound links to a page that has been
    live for years. Internal links were already updated; this covers the ones we
    do not control.
    
    Uses .htaccess rather than leaving a stub page behind, following the 
existing
    "downloads was renamed to releases" precedent in the same file: no orphan 
page
    in the nav tree, and the reader lands on the section rather than on a 
pointer
    to it. Matches both the extensionless and .html forms.
    
    Issued as a permanent (301) redirect. The fold-in is not going to be undone,
    and 301 is what consolidates the old URL's link equity onto the new section;
    the surrounding rules only default to 302 because none of them ever 
specified.
    
    Pins the target heading's anchor explicitly with {#...} instead of relying 
on
    kramdown's auto_ids. The generated id is identical today, but eight internal
    links and the redirect now depend on it, so it should not be a side effect 
of
    the heading's wording.
    
    Co-Authored-By: Claude Opus 5 <[email protected]>
    
    ---------
    
    Co-authored-by: Claude Opus 5 <[email protected]>
---
 source/.htaccess                                   |   4 +
 .../core-developers/ajax-client-side-validation.md |   5 +-
 source/core-developers/client-side-validation.md   | 177 ++++++++++++++++-----
 .../core-developers/client-validation-example.md   |   6 +
 .../pure-java-script-client-side-validation.md     |  50 ------
 source/tag-developers/css-xhtml-theme.md           |  24 +--
 source/tag-developers/form-tag.md                  |   7 +
 source/tag-developers/xhtml-theme.md               |  14 +-
 8 files changed, 185 insertions(+), 102 deletions(-)

diff --git a/source/.htaccess b/source/.htaccess
index 41562793b..28cf19561 100644
--- a/source/.htaccess
+++ b/source/.htaccess
@@ -28,6 +28,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
 {% assign announcements = site.pages | where_exp: "page", "page.path contains 
'announce-'" | sort: "path" -%}
 RedirectMatch \/announce.html(#a[0-9]+)? {{ announcements.last.url }}$1
diff --git a/source/core-developers/ajax-client-side-validation.md 
b/source/core-developers/ajax-client-side-validation.md
index b9e47ed69..2f52ccff5 100644
--- a/source/core-developers/ajax-client-side-validation.md
+++ b/source/core-developers/ajax-client-side-validation.md
@@ -14,8 +14,9 @@ parent:
 
 ## Description 
 
-AJAX-based client side validation improves upon [Pure JavaScript Client Side 
Validation](pure-java-script-client-side-validation) 
-by using a combination of JavaScript, DOM manipulation, and remote server 
communication. Unlike the pure client side 
+AJAX-based client side validation improves upon [Pure JavaScript Client Side 
Validation](client-side-validation#pure-javascript-client-side-validation-deprecated)
 
+(deprecated since 7.4.0 
[WW-5694](https://issues.apache.org/jira/browse/WW-5694), removed in 8.0.0
+[WW-5696](https://issues.apache.org/jira/browse/WW-5696)) 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.
 
diff --git a/source/core-developers/client-side-validation.md 
b/source/core-developers/client-side-validation.md
index 20a8dabad..e3a2949a5 100644
--- a/source/core-developers/client-side-validation.md
+++ b/source/core-developers/client-side-validation.md
@@ -14,57 +14,162 @@ parent:
 
 ## Basics
 
-The framework adds support for client-side validation on top of the standard 
validation framework.
+Since Struts 7.4.0, the [html5 theme](../tag-developers/html5-theme) can 
derive HTML5 constraint-validation
+attributes (`required`, `minlength`, `maxlength`, `pattern`, `min`, `max`) 
directly from a field's
+server-side [validators](validation), so the browser rejects obviously-invalid 
input before the form is
+even submitted. This replaces the older, generated-JavaScript validator used 
by the _xhtml theme_ and
+_css_xhtml theme_, which is now deprecated — see [Pure JavaScript Client Side 
Validation
+(deprecated)](#pure-javascript-client-side-validation-deprecated) below.
 
-Client-side validation can be enabled on a per-form basis by specifying 
`validate="true"` in the _form_ tag.
+There is also [AJAX Client Side Validation](ajax-client-side-validation), 
which runs the full server-side
+validation stack (including visitor validators and `validate()`) over AJAX and 
is unaffected by any of this.
 
-```jsp
-<s:form name="test" action="javascriptValidation" validate="true">
-  ...
-</s:form>
-```
+## HTML5 Constraint Validation
 
-If a `name` for the form is not given, the action mapping name will be used as 
the form name. Otherwise, a correct 
-`action` and `namespace` attributes must be provided to the `<saf:form>` tag.
+### Enabling it
 
-## Referencing "submitProfile" in the "/user" namespace
+HTML5 constraint validation is off by default. Turn it on with the 
`struts.ui.html5.constraints` constant:
 
-```jsp
-<s:form namespace="/user" action="submitProfile" validate="true">
-  ...
-</s:form>
+```properties
+struts.ui.html5.constraints=true
+```
+
+It only has an effect on fields rendered with the `html5` theme (see [Using 
the HTML5
+theme](../tag-developers/html5-theme#using-the-html5-theme)). There is no 
per-form opt-in attribute —
+unlike the deprecated JavaScript validator, this feature does not use `<s:form 
validate="true">`. Once the
+constant is on and a field's theme is `html5`, its validators are consulted 
automatically.
+
+> The constant defaults to `false` so existing `html5`-theme forms keep 
rendering unchanged. The default is
+> expected to flip to `true` in a future major release, tracked by
+> [WW-5696](https://issues.apache.org/jira/browse/WW-5696).
+
+### The governing rule: never false-reject
+
+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.
+
+The clearest consequence of this rule: **Struts never sets or changes an 
input's `type`.** A field stays
+whatever `type` the developer gave it. In particular:
+
+- Switching a field to `type="number"` would reject a value like `1234,50`, 
which the framework's
+  locale-aware numeric conversion happily accepts in a comma-decimal locale.
+- The browsers' `email` and `url` input grammars don't match `EmailValidator` 
and `UrlValidator`.
+
+So `min`/`max` range constraints are only ever added to a control the 
developer *already* made numeric
+(`type="number"` or `type="range"`) — Struts will never promote a plain text 
field into one just because
+an `int` or `double` validator is attached to it.
+
+### Mapping table
+
+| Validator | Emits | Condition |
+|---|---|---|
+| `requiredstring` | `required` | on text-entry controls (`text`, `search`, 
`tel`, `password`, `email`, `url`) and `textarea` |
+| `required` | `required` | only on `radio` and `file` |
+| `stringlength` | `minlength` / `maxlength` | on text-entry or `textarea`, 
and only if the validator has `trim="false"`; each attribute is added only if 
actually configured |
+| `regex` | `pattern` | on text-entry controls only, and only if 
`caseSensitive="true"`, `trim="false"`, the regex is ECMAScript-safe (see 
below), and the validator is not an `email` or `creditcard` validator (both 
extend `RegexFieldValidator` but carry grammars the browser does not share) |
+| `int`, `short`, `long` | `min` / `max` | only when the control is already 
`type="number"` or `type="range"` |
+| `double` | `min` / `max` | same as above; only inclusive bounds are emitted 
— exclusive bounds have no HTML equivalent and are omitted |
+| `date` | — | nothing yet; temporal `min`/`max` is deferred to a future 
release |
+| `email`, `url`, `creditcard` | — | never emitted |
+| `fieldexpression`, `expression`, `conversion`, visitor validators | — | 
never emitted |
+| any validator carrying a message | `data-msg-<validatorType>` | always 
added, including for validators that emit no constraint attribute at all |
+
+Two of these conditions are easy to miss and sharply limit how often 
`required`, `minlength`/`maxlength`,
+and `pattern` actually show up:
+
+**`required` is split across two validators, and they don't behave alike.** 
`requiredstring` fails on
+null, empty, and (by default) blank values, so it is strictly stricter than 
the browser's `required` — safe
+to emit on any text-entry control. Plain `required`, however, only fails on a 
null value, an empty array,
+or an empty collection. That means an empty text input (which submits `""`, 
not nothing), a `select` with
+an empty-valued option, and an **unticked checkbox** (`CheckboxInterceptor` 
substitutes the parameter
+`"false"` for it) all pass server-side validation while a browser `required` 
attribute would block them.
+Only `radio` and `file` controls omit their parameter entirely when left 
empty, so those are the only two
+control types where plain `required` agrees with the server — which is why the 
table above emits `required`
+for the `required` validator on those two types alone.
+
+**Both `minlength`/`maxlength` and `pattern` need `trim="false"`, which is not 
the default.** Both
+`StringLengthFieldValidator.trim` and `RegexFieldValidator.trim` default to 
`true`, so the server measures
+or matches the field's *trimmed* value while the HTML attribute constrains the 
*raw* one. A `stringlength`
+validator with `maxLength="4"` accepts `"abcd "` — it trims to four 
characters, which is within the limit —
+but a browser enforcing `maxlength="4"` would stop the user typing the fifth 
character at all. Likewise, a
+`regex` of `[a-z]+` accepts `"abc "` server-side (it trims to `"abc"` first) 
while the browser, matching the
+raw value, blocks it. Because of this, `minlength`/`maxlength` and `pattern` 
are only ever emitted
+for validators explicitly configured with `trim="false"` — which most existing 
`stringlength` and `regex`
+validators are not. In practice, expect both to show up rarely until 
applications start setting
+`trim="false"` deliberately for fields where it's safe.
+
+**ECMAScript-safe** means the regex uses only constructs that mean the same 
thing in Java's regex engine
+and in the browser's: literals, `\d`/`\w` and their negations, character 
classes without POSIX or Unicode
+property syntax, grouping, alternation, anchors, and bounded quantifiers. 
Notably, **`\s` and `\S` are
+excluded** — Java's `\s` is ASCII-only by default while ECMAScript's `\s` 
covers the wider Unicode
+whitespace set, so a pattern like `^\S+$` 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 `pattern`
+attribute at all — it is never rejected loudly, it just quietly doesn't get a 
client-side check.
+
+### `data-msg-*` attributes
+
+Every validator carrying a message — even one that emits no HTML constraint 
attribute at all — adds a
+`data-msg-<validatorType>` attribute (for example `data-msg-email`, 
`data-msg-regex`) holding the
+validator's fully resolved, internationalized message. **Struts ships no 
JavaScript that reads these.**
+They exist purely as a hook: an application can write its own script to read 
`data-msg-*` and show
+whichever messages it wants, in whatever way it wants, including for 
validators (like `email` or
+`creditcard`) that never get a native browser check.
+
+### `requiredLabel` is unrelated to the `required` attribute
+
+This is a common point of confusion: the `requiredLabel` tag attribute only 
controls whether a visual
+marker (usually `*`) is drawn next to a field's label. It has no connection to 
the HTML `required`
+attribute described above, and setting `requiredLabel="true"` does not make a 
field required in the
+browser — the two are decided completely independently.
+
+### Extension point: `HtmlConstraintProvider`
+
+The mapping above is implemented by `StrutsHtmlConstraintProvider`, the 
default implementation of the
+`HtmlConstraintProvider` interface, registered under the 
`struts.htmlConstraintProvider` constant:
+
+```properties
+struts.htmlConstraintProvider=struts
 ```
 
-Technically, the form's action attribute can refer to a "path" that includes 
the namespace and action as a URI. 
-But, client-side validation **requires** that the action name and namespeact 
to be set separately.
+An application that wants a less conservative mapping — for example, treating 
an `email` validator as
+`type="email"`, or emitting `pattern` for case-insensitive regexes by 
rewriting them — can register its own
+`HtmlConstraintProvider` 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.
+
+## Pure JavaScript Client Side Validation (deprecated) 
{#pure-javascript-client-side-validation-deprecated}
+
+> **Deprecated since Struts 7.4.0 
([WW-5694](https://issues.apache.org/jira/browse/WW-5694)), removed in
+> Struts 8.0.0 ([WW-5696](https://issues.apache.org/jira/browse/WW-5696)).** 
New applications should use
+> the [html5 theme's constraint validation](#html5-constraint-validation) 
described above instead.
 
-## Won't work with client-side validation!
+The `<s:form validate="true">` attribute enables an older client-side 
validation mechanism, used by the
+_xhtml theme_ and _css_xhtml theme_. 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:
 
 ```jsp
-<s:form action="/user/submitProfile.action" validate="true">
+<s:form name="test" action="javascriptValidation" validate="true">
   ...
 </s:form>
-
 ```
 
-All the usual [validation configuration](validation) 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.
+If a `name` for the form is not given, the action mapping name is used as the 
form name. Otherwise, a
+correct `action` and `namespace` attribute must be provided to the `<s:form>` 
tag — client-side validation
+requires the action name and namespace to be resolvable separately, so a form 
whose `action` is given as a
+full URI (for example `<s:form action="/user/submitProfile.action" 
validate="true">`) will not get
+client-side validation, even though the form still works.
 
-## The left hand doesn't know ...
-
-> The required attribute on many _Struts Tags_ 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.
+Because the validation logic is repeated in generated JavaScript, only a 
subset of validators is
+supported (`required`, `requiredstring`, `stringlength`, `regex`, `email`, 
`url`, `int`, `double`), it is
+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.
 
 ## Example
 
-See [Client Validation example](client-validation-example) for a complete 
example of client-side validation.
-
-## Client Side Validation Types
-
-There are two styles of client side validation.
-
-|[Pure JavaScript Client Side 
Validation](pure-java-script-client-side-validation)|Used by the _xhtml theme_ 
and _css_xhtml theme_|
-|-----------------------------------------------------|--------------------------------------------------|
-|[AJAX Client Side Validation](ajax-client-side-validation)|Use to used by the 
_ajax theme_ |
+See [Client Validation example](client-validation-example) for a complete, 
though now-deprecated, example
+of the JavaScript-based client-side validation described above.
diff --git a/source/core-developers/client-validation-example.md 
b/source/core-developers/client-validation-example.md
index 751e08121..3e3d5573a 100644
--- a/source/core-developers/client-validation-example.md
+++ b/source/core-developers/client-validation-example.md
@@ -8,6 +8,12 @@ parent:
 
 # Client Validation Example
 
+> **Deprecated since Struts 7.4.0 
([WW-5694](https://issues.apache.org/jira/browse/WW-5694)), removed in
+> Struts 8.0.0 ([WW-5696](https://issues.apache.org/jira/browse/WW-5696)).** 
This example walks through the
+> generated-JavaScript client-side validator (`<s:form validate="true">`) used 
by the _xhtml theme_ and
+> _css_xhtml theme_. New applications should use the [html5 theme's constraint
+> validation](client-side-validation#html5-constraint-validation) instead.
+
 Let's create a Client-Side validation workflow, step by step. The `validate` 
attribute is set to `true`.
 
 > Note: Some themes do not support client-side validation.
diff --git a/source/core-developers/pure-java-script-client-side-validation.md 
b/source/core-developers/pure-java-script-client-side-validation.md
deleted file mode 100644
index 43fde3e84..000000000
--- a/source/core-developers/pure-java-script-client-side-validation.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-layout: default
-title: Pure JavaScript Client Side Validation
-parent:
-  title: Client Side Validation
-  url: client-side-validation
----
-
-# Pure JavaScript Client Side Validation
-{:.no_toc}
-
-* Will be replaced with the ToC, excluding a header
-{:toc}
-
-## Description
-
-Pure JavaScript client side validation is the simplest but least feature-rich 
type of [Client Side Validation](client-side-validation). 
-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 [Validation](validation).
-
-Only the following validators are supported:
-
-* required validator
-* requiredstring validator
-* stringlength validator
-* regex validator
-* email validator
-* url validator
-* int validator
-* double validator
-
-> JavaScript client validation is not available for visitor validations.
-
-## Error reporting
-
-Because client side validation does not talk to the server, the theme (_xhtml 
theme_  or _css_xhtml theme_ ) is responsible 
-for properly manipulating the HTML DOM to display the error message inline. 
The JavaScript that is responsible for doing 
-this logic is `validation.js` and can be found in each theme.
-
-> 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 [AJAX Client 
Side Validation](ajax-client-side-validation) 
-> for messages that are fully internationalized.
-
-## Additional Validator Support
-
-If you wish to add additional validator support beyond those listed, you may 
override the _xhtml theme_  template 
-`form-close-validate.ftl`. This file contains the JavaScript that tries to 
validate each user-entered value from within 
-the browser. The _css_xhtml theme_  extends the _xhtml theme_  and therefore 
doesn't have its own `form-close-validate.ftl`
-template.
diff --git a/source/tag-developers/css-xhtml-theme.md 
b/source/tag-developers/css-xhtml-theme.md
index a6d3e73e0..0cd207e23 100644
--- a/source/tag-developers/css-xhtml-theme.md
+++ b/source/tag-developers/css-xhtml-theme.md
@@ -14,8 +14,10 @@ The _css_xhtml theme_ provides all the basics that the 
[simple theme](simple-the
   [textfield](textfield-tag), [select](select-tag), etc)
 - Labels for each of the HTML [Struts Tags](struts-tags), placed according to 
the CSS stylesheet
 - [Validation](../core-developers/validation) and error reporting
-- [Pure JavaScript Client Side 
Validation](../core-developers/pure-java-script-client-side-validation) using 
100% 
-  JavaScript on the browser
+- [Pure JavaScript Client Side 
Validation](../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated)
 
+  using 100% JavaScript on the browser — deprecated since 7.4.0
+  ([WW-5694](https://issues.apache.org/jira/browse/WW-5694)), removed in 8.0.0
+  ([WW-5696](https://issues.apache.org/jira/browse/WW-5696)); use the [html5 
theme](html5-theme) instead
 
 ## Wrapping the Simple Theme
 
@@ -69,15 +71,17 @@ The head includes a style sheet. The contents of 
**styles.css** are:
 ### Form template
 
 The css_xhtml [form](form-tag) template is almost exactly like the _xhtml form 
template_ , including support for 
-[Pure JavaScript Client Side 
Validation](../core-developers/pure-java-script-client-side-validation). The 
difference 
-is that instead of printing out an opening and closing `<table>` 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.
+[Pure JavaScript Client Side 
Validation](../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated)
+(deprecated since 7.4.0 
[WW-5694](https://issues.apache.org/jira/browse/WW-5694), removed in 8.0.0
+[WW-5696](https://issues.apache.org/jira/browse/WW-5696)). The difference is 
that instead of printing out an opening and closing 
+`<table>` 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.
 
 ### css_xhtml form template
 
 The css_xhtml [form](form-tag) template is almost exactly like the _xhtml form 
template_ , including support for 
-[Pure JavaScript Client Side 
Validation](../core-developers/pure-java-script-client-side-validation). The 
only 
-difference is that instead of printing out an opening and closing `<table>` 
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.
+[Pure JavaScript Client Side 
Validation](../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated)
+(deprecated since 7.4.0 
[WW-5694](https://issues.apache.org/jira/browse/WW-5694), removed in 8.0.0
+[WW-5696](https://issues.apache.org/jira/browse/WW-5696)). The only difference 
is that instead of printing out an opening and 
+closing `<table>` 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.
diff --git a/source/tag-developers/form-tag.md 
b/source/tag-developers/form-tag.md
index 52684722e..c516e3730 100644
--- a/source/tag-developers/form-tag.md
+++ b/source/tag-developers/form-tag.md
@@ -41,3 +41,10 @@ There are two flavours [Client Side 
Validation](../core-developers/client-side-v
 are using (xhtml, ajax, etc). If you are using the [xhtml theme](xhtml-theme) 
or [css_xhtml theme](css-xhtml-theme), 
 pure client side validation will be used. Read the [Client Side 
Validation](../core-developers/client-side-validation)
 docs for more information.
+
+> **`validate` is deprecated since Struts 7.4.0 and will be removed in 8.0.0** 
+> ([WW-5694](https://issues.apache.org/jira/browse/WW-5694), 
+> [WW-5696](https://issues.apache.org/jira/browse/WW-5696)). It only controls 
the older, generated-JavaScript 
+> client-side validator used by the xhtml and css_xhtml themes. It has no 
effect on the [html5 theme's constraint 
+> 
validation](../core-developers/client-side-validation#html5-constraint-validation),
 which applications should 
+> use instead.
diff --git a/source/tag-developers/xhtml-theme.md 
b/source/tag-developers/xhtml-theme.md
index feb021489..50297eea9 100644
--- a/source/tag-developers/xhtml-theme.md
+++ b/source/tag-developers/xhtml-theme.md
@@ -19,8 +19,10 @@ The xhtml provides all the basics that the [simple 
theme](simple-theme) provides
 - Labels for each of the HTML [Struts Tags](struts-tags) on the left hand side 
(or top, depending on 
   the `labelposition` attribute)
 - [Validation](../core-developers/validation) and error reporting
-- [Pure JavaScript Client Side 
Validation](../core-developers/pure-java-script-client-side-validation) using 
-  100% JavaScript on the browser
+- [Pure JavaScript Client Side 
Validation](../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated)
 
+  using 100% JavaScript on the browser — deprecated since 7.4.0
+  ([WW-5694](https://issues.apache.org/jira/browse/WW-5694)), removed in 8.0.0
+  ([WW-5696](https://issues.apache.org/jira/browse/WW-5696)); use the [html5 
theme](html5-theme) instead
 
 ## Wrapping the Simple Theme
 
@@ -94,7 +96,9 @@ The head template imports a style sheet. The contents of 
**styles.css** are:
 
 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 `validate` 
parameter is set to true, enable 
-[Pure JavaScript Client Side 
Validation](../core-developers/pure-java-script-client-side-validation).
+[Pure JavaScript Client Side 
Validation](../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated)
+(deprecated since 7.4.0 
[WW-5694](https://issues.apache.org/jira/browse/WW-5694), removed in 8.0.0
+[WW-5696](https://issues.apache.org/jira/browse/WW-5696)).
 
 {% highlight freemarker %}
 {% remote_file_content 
https://raw.githubusercontent.com/apache/struts/main/core/src/main/resources/template/xhtml/form.ftl
 %}
@@ -110,7 +114,9 @@ The closing template, `form-close.ftl`:
 
 The xhtml form template sets up the wrapping table around all the other [xhtml 
theme](xhtml-theme) form elements. 
 In addition to creating this wrapping table, the opening and closing templates 
also, if the `validate` parameter is set 
-to `true`, enable [Pure JavaScript Client Side 
Validation](../core-developers/pure-java-script-client-side-validation.htmk). 
+to `true`, enable [Pure JavaScript Client Side 
Validation](../core-developers/client-side-validation#pure-javascript-client-side-validation-deprecated)
+(deprecated since 7.4.0 
[WW-5694](https://issues.apache.org/jira/browse/WW-5694), removed in 8.0.0
+[WW-5696](https://issues.apache.org/jira/browse/WW-5696)). 
 
 See the **form.ftl** contents:
 

Reply via email to