Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to specify name attribute in h:inputText?

Tags:

jsf

primefaces

I need to render h:inputText as following html output :

  <input id="yourName" type="text" name="name" />
  <input id="email" type="text" name="email" />

But h:inputText renders the name attribute same as client id of the component. I want to specify the name attribute myself, instead of putting client id in that, so that the input field can show meaningful autocomplete suggestions from previously submitted values for same field type on other sites. For e.g. when I use name="email" with input field for email, user is shown suggestions of emails ids he submitted previously on other websites.

like image 334
Rajat Gupta Avatar asked Apr 09 '13 05:04

Rajat Gupta


People also ask

What is the name attribute in input tag?

The name attribute specifies the name of an <input> element. The name attribute is used to reference elements in a JavaScript, or to reference form data after a form is submitted. Note: Only form elements with a name attribute will have their values passed when submitting a form.

What is the name attribute in HTML?

The name attribute specifies a name for an HTML element. This name attribute can be used to reference the element in a JavaScript. For a <form> element, the name attribute is used as a reference when the data is submitted. For an <iframe> element, the name attribute can be used to target a form submission.

What is ID and name in input tag?

name is the name that is used when the value is passed (in the URL or in the posted data). id is used to uniquely identify the element for CSS styling and JavaScript.

How do you name a text box in HTML?

The HTML <input> name Attribute is used to specify a name for an <input> element. It is used to reference the form-data after submitting the form or to reference the element in a JavaScript. Attribute Values: It contains a single value name which describes the name of the <input> element.


1 Answers

You can't achieve it using <h:inputText>. Its name is autogenerated by JSF based on the client ID (which is in turn based on component ID and all of its naming container parents).

You've basically 2 options to achieve the concrete functional requirement anyway:

  1. If there are no other naming container parents, instruct the parent form to not prepend its ID:

    <h:form prependId="false">
    

    This will however cause <f:ajax> to fail.

  2. Use plain HTML elements instead of JSF components:

    <input name="name" value="#{bean.name}" />
    <input name="email" value="#{bean.email}" />
    

    You only have to collect them yourself via @ManagedProperty on a request scoped bean:

    @ManagedProperty("#{param.name}")
    private String name;
    
    @ManagedProperty("#{param.email}")
    private String email;
    

    And you'll miss JSF builtin validation/conversion facility and ajax magic.

There's however a completely different alternative: use HTML5 <input type="email">. This way the browser will autosuggest all previously entered emails on inputs of the very same type. This is not natively supported by <h:inputText>. You can however use a custom render kit to get it to work, as answered in Adding custom attribute (HTML5) support to Primefaces (3.4):

<h:inputText type="email" ... />

Update as of JSF 2.2 you can finally easily declare passthrough attributes without needing a custom render kit.

<... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
...
<h:inputText a:type="email" ... />
like image 169
BalusC Avatar answered Oct 24 '22 00:10

BalusC