为什么 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?
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?