为什么 JSF 除了生成 ID 之外还要生成名称?

Why does JSF generate names in addition to IDs?

ID 的生成/使用相当清楚,用于将提交的组件重新关联到视图树。

但为什么 JSF 也会生成名称?它在内部使用它们吗?

它是 Servlet API 的 required by HTML specification and used。 Web 浏览器使用输入字段名称作为 HTTP 请求参数名称。他们不为此使用输入字段 ID,否则不可能为每个名称发送多个值(select 多个、复选框组等)。

<h:inputText id="foo">

生成

<input type="text" id="formId:foo" name="formId:foo" />

客户端在 HTTP 请求中准备(通过网络浏览器的内部代码)为

element.getAttribute("name") + "=" + element.getAttribute("value")

并在服务器端从 HTTP 请求中提取(通过 UIComponent#decode())作为

String foo = request.getParameter(component.getClientId());

另请参阅:

  • Difference between id and name attributes in HTML
  • How to transfer data from JSP to servlet when submitting HTML form
  • ServletRequest.getParameterMap() returns Map<String, String[]> and ServletRequest.getParameter() returns String?