HTML5 ఫారమ్స్ ఆర్కిటెక్చర్: form, action, method (GET vs POST), label & fieldset
నిజ జీవితంలో ఒక బ్యాంక్ అకౌంట్ ఓపెన్ చేయాలన్నా, కాలేజీ అడ్మిషన్ తీసుకోవాలన్నా, లేదా పాస్పోర్ట్ దరఖాస్తు చేసుకోవాలన్నా మనం ముందుగా ఒక దరఖాస్తు ఫారమ్ను (Application Form) పూర్తి చేస్తాం. వెబ్ ప్రపంచంలో కూడా యూజర్ నుండి సమాచారాన్ని (User Input) సేకరించడానికి అత్యంత కీలకమైన వారధి HTML Forms (వెబ్ ఫారమ్లు)!
గూగుల్లో శోధించే సెర్చ్ బాక్స్ నుండి, ఫేస్బుక్/ఇన్స్టాగ్రామ్ లాగిన్ స్క్రీన్, అమెజాన్ చెక్అవుట్ అడ్రస్ పేజీ, మరియు స్విగ్గీ/జొమాటో ఫుడ్ ఆర్డర్ల వరకు — ఇంటర్నెట్లోని ప్రతి ఇంటరాక్టివ్ లావాదేవీ ఒక HTML ఫారమ్ ద్వారానే ప్రారంభమవుతుంది. ఫారమ్స్ లేకపోతే వెబ్ కేవలం చదవడానికి మాత్రమే పరిమితమైన ఒక నిర్జీవమైన పుస్తకంలా ఉండేది!
అయితే ఫారమ్స్ నిర్మించేటప్పుడు కేవలం ఇన్పుట్ బాక్సులు పెట్టడం మాత్రమే సరిపోదు. యూజర్ టైప్ చేసిన డేటా సర్వర్కు సురక్షితంగా ఎలా చేరుతుంది? GET మరియు POST మెథడ్స్ మధ్య తేడా ఏమిటి? పాస్వర్డ్లు URL లో కనిపించకుండా ఎలా దాచాలి? స్క్రీన్ రీడర్స్ మరియు మొబైల్ యూజర్ల కోసం <label> ఎందుకు ప్రాణాధారమో ఈ పదమూడవ అధ్యాయంలో లోతుగా నేర్చుకుందాం!
- వెబ్ ఫారమ్ అనాటమీ & లైఫ్సైకిల్: బ్రౌజర్ నుండి సర్వర్కు డేటా ఎలా ప్రయాణిస్తుంది?
- <form> ఎలిమెంట్: action URL మరియు HTTP method యొక్క ప్రాథమిక భావన.
- ఇంటర్వ్యూ హాట్ టాపిక్ — GET vs POST: ఏది ఎప్పుడు వాడాలి? సెక్యూరిటీ మరియు డేటా లిమిట్స్.
- URL Encoding & Query String:
?username=rahul&email=...ఎలా ఏర్పడుతుంది? - <label> ఎలిమెంట్: for ఆట్రిబ్యూట్, మొబైల్ ట్యాప్ ఏరియా పెంపుదల, మరియు Accessibility (a11y).
- <fieldset> మరియు <legend>: పెద్ద ఫారమ్లను ప్రొఫెషనల్ గ్రూప్స్గా విభజించే విధానం.
- name vs id ఆట్రిబ్యూట్ల వ్యత్యాసం: సర్వర్కు ఏది వెళ్తుంది? CSS/JS కు ఏది కావాలి?
- బటన్ల వర్గీకరణ: submit vs reset vs సాధారణ button తేడాలు.
ఒక యూజర్ వెబ్సైట్లో ఫారమ్ నింపి "Submit" బటన్ నొక్కినప్పుడు బ్యాక్గ్రౌండ్లో ఏం జరుగుతుందో క్రింది లైఫ్సైకిల్ డయాగ్రమ్ ద్వారా అర్థం చేసుకుందాం:
<form> ఎలిమెంట్ అనేది అన్ని ఇన్పుట్ కంట్రోల్స్ను (టెక్స్ట్బాక్స్, చెక్బాక్స్, రేడియో బటన్, సబ్మిట్ బటన్) తన లోపల భద్రపరిచే ప్రధాన కంటైనర్. దీనికి రెండు అత్యంత కీలకమైన ఆట్రిబ్యూట్లు ఉంటాయి:
action="URL": ఫారమ్ సబ్మిట్ అయిన తర్వాత డేటాను ఏ సర్వర్ ఎండ్పాయింట్కు (Backend API / URL) పంపాలో నిర్దేశిస్తుంది (ఉదా:action="/api/register"). ఒకవేళ ఇది ఇవ్వకపోతే, ఫారమ్ అదే పేజీకి మళ్ళీ సబ్మిట్ అవుతుంది.method="GET | POST": డేటాను సర్వర్కు ఏ HTTP ప్రోటోకాల్ పద్ధతి ద్వారా పంపాలో నిర్ణయిస్తుంది.
<form action="/login" method="POST" style="max-width: 400px; padding: 20px; border: 1px solid #cbd5e1; border-radius: 8px;">
<h3 style="margin-top:0;">యూజర్ లాగిన్</h3>
<p>
<label for="user">యూజర్నేమ్:</label><br>
<input type="text" id="user" name="username" placeholder="మీ పేరు నమోదు చేయండి" style="width: 100%; padding: 8px; margin-top: 4px;">
</p>
<p>
<label for="pass">పాస్వర్డ్:</label><br>
<input type="password" id="pass" name="password" placeholder="••••••••" style="width: 100%; padding: 8px; margin-top: 4px;">
</p>
<button type="submit" style="background: #10b981; color: white; border: none; padding: 10px 20px; border-radius: 6px; font-weight: bold; cursor: pointer;">
లాగిన్ అవ్వండి
</button>
</form>
సాఫ్ట్వేర్ ఇండస్ట్రీలో ప్రతి వెబ్ డెవలపర్ ఇంటర్వ్యూలో తప్పకుండా అడిగే ప్రశ్న: "GET మరియు POST మధ్య తేడాలు ఏమిటి? పాస్వర్డ్ కోసం GET ఎందుకు వాడకూడదు?"
| ఫీచర్ / అంశం | GET మెథడ్ | POST మెథడ్ |
|---|---|---|
| డేటా ఎలా వెళ్తుంది? | URL చివర క్వెరీ స్ట్రింగ్గా కనిపిస్తూ వెళ్తుంది (Visible in Address Bar). | HTTP Request Body లోపల దాగి వెళ్తుంది (Hidden from URL). |
| భద్రత (Security) | ❌ తక్కువ భద్రత. పాస్వర్డ్స్, క్రెడిట్ కార్డుల కోసం ఎప్పుడూ వాడకూడదు! | ✅ సురక్షితమైనది. సున్నితమైన సమాచారం కోసం తప్పనిసరి. |
| డేటా పరిమాణ పరిమితి | పరిమితం (సాధారణంగా గరిష్టంగా ~2,048 అక్షరాలు). | అపరిమితం (ఫైల్స్, ఇమేజెస్, పెద్ద టెక్స్ట్ పంపవచ్చు). |
| బుక్మార్కింగ్ & హిస్టరీ | బ్రౌజర్ హిస్టరీలో సేవ్ అవుతుంది, బుక్మార్క్ చేసుకోవచ్చు. | హిస్టరీలో సేవ్ కాదు, బుక్మార్క్ చేయలేము. |
| ఐడెంపోటెంట్ (Idempotent) | సర్వర్ డేటాను మార్చదు (కేవలం శోధించడానికి/ఫెచ్ చేయడానికి). | సర్వర్లో కొత్త రికార్డులను సృష్టిస్తుంది లేదా మారుస్తుంది. |
| వాడే సందర్భాలు | గూగుల్ సెర్చ్, ఫిల్టర్లు, పేజినేషన్ (Search, Filter). | లాగిన్, సైన్అప్, పేమెంట్స్, ప్రొఫైల్ అప్డేట్ (Forms with sensitive data). |
ఒకవేళ మీరు లాగిన్ ఫారమ్కు
method="GET" అని రాస్తే, యూజర్ టైప్ చేసిన పాస్వర్డ్ బ్రౌజర్ అడ్రస్ బార్లో https://example.com/login?username=rahul&password=secret123 అని బహిరంగంగా కనిపిస్తుంది! పక్కన కూర్చున్న ఎవరైనా పాస్వర్డ్ చూసేయడమే కాకుండా, బ్రౌజర్ హిస్టరీలో మరియు సర్వర్ లాగ్స్లో శాశ్వతంగా రికార్డయిపోతుంది. కాబట్టి ఫారమ్లలో ఎల్లప్పుడూ POST మాత్రమే వాడాలి.
ఒక ఫారమ్ను GET మెథడ్తో సబ్మిట్ చేసినప్పుడు బ్రౌజర్ డేటాను "క్వెరీ స్ట్రింగ్" (Query String) రూపంలోకి మారుస్తుంది:
స్పేస్లు మరియు ప్రత్యేక అక్షరాలు:
URL లో ఖాళీ స్థలాలు (Spaces) ఉండకూడదు. కాబట్టి బ్రౌజర్ స్పేస్ను + లేదా %20 గా మారుస్తుంది. దీన్నే URL Encoding (Percent-encoding) అంటారు.
ఒక ఇన్పుట్ ఫీల్డ్ పక్కన సాధారణంగా టెక్స్ట్ రాయడానికి <p>పేరు:</p> లేదా <span>పేరు:</span> వాడకూడదు! ఎల్లప్పుడూ అధికారిక <label> ట్యాగ్ను మాత్రమే ఉపయోగించాలి.
<label for="..."> వాడటం వల్ల లభించే 2 విప్లవాత్మక ప్రయోజనాలు:
స్మార్ట్ఫోన్లలో చెక్బాక్స్ లేదా చిన్న రేడియో బటన్ను వేలితో నొక్కడం చాలా కష్టం. కానీ మీరు
<label for="terms"> అని ఇస్తే — యూజర్ ఆ చిన్న బాక్స్ మీద నొక్కాల్సిన పని లేదు; పక్కన ఉన్న అక్షరాల మీద నొక్కినా కూడా చెక్బాక్స్ ఆటోమేటిక్గా టిక్ అవుతుంది!
దృష్టి లోపం ఉన్న యూజర్ కీబోర్డ్ ద్వారా ఇన్పుట్ బాక్స్లోకి వెళ్ళినప్పుడు, స్క్రీన్ రీడర్ ఆ ఇన్పుట్కు లింక్ అయిన లేబుల్ పేరును ("మీ ఈమెయిల్ నమోదు చేయండి") స్పష్టంగా చదివి వినిపిస్తుంది.
<!-- పద్ధతి 1: 'for' మరియు 'id' తో అనుసంధానం (సిఫార్సు చేయబడినది) -->
<label for="user-email">ఈమెయిల్ చిరునామా:</label>
<input type="email" id="user-email" name="email">
<!-- పద్ధతి 2: లేబుల్ లోపల ఇన్పుట్ను చుట్టడం (Implicit Association) -->
<label>
<input type="checkbox" name="agree">
నేను నిబంధనలు మరియు షరతులను అంగీకరిస్తున్నాను (ఈ అక్షరాలపై క్లిక్ చేసినా టిక్ అవుతుంది!)
</label>
పెద్ద పెద్ద రిజిస్ట్రేషన్ లేదా జాబ్ అప్లికేషన్ ఫారమ్లలో 20 నుండి 30 ఇన్పుట్ ఫీల్డ్లు ఉంటాయి. వాటన్నింటినీ ఒకేచోట గజిబిజిగా ఉంచితే యూజర్ కంగారుపడతాడు. సంబంధిత ఇన్పుట్లను అందమైన గ్రూపులుగా విభజించడానికి <fieldset> మరియు దానికి టైటిల్ ఇవ్వడానికి <legend> ఉపయోగిస్తాం:
<form action="/profile" method="POST" style="max-width: 500px;">
<!-- గ్రూప్ 1: వ్యక్తిగత వివరాలు -->
<fieldset style="border: 1px solid #10b981; border-radius: 8px; padding: 16px; margin-bottom: 20px;">
<legend style="color: #059669; font-weight: bold; padding: 0 8px;">వ్యక్తిగత సమాచారం</legend>
<label for="fullname">పూర్తి పేరు:</label><br>
<input type="text" id="fullname" name="name" style="width:100%; margin-bottom:12px;"><br>
<label for="dob">పుట్టిన తేదీ:</label><br>
<input type="date" id="dob" name="birthdate">
</fieldset>
<!-- గ్రూప్ 2: చిరునామా వివరాలు -->
<fieldset style="border: 1px solid #3b82f6; border-radius: 8px; padding: 16px;">
<legend style="color: #2563eb; font-weight: bold; padding: 0 8px;">నివాస చిరునామా</legend>
<label for="city">నగరం:</label><br>
<input type="text" id="city" name="city" style="width:100%; margin-bottom:12px;"><br>
<label for="pincode">పిన్కోడ్:</label><br>
<input type="text" id="pincode" name="zip">
</fieldset>
</form>
ప్రతి ఇన్పుట్ ఎలిమెంట్కు name మరియు id రాస్తుంటాం. చాలా మంది బిగినర్స్ ఈ రెండూ ఒకటే అని భ్రమపడుతుంటారు. కానీ వీటి పని పూర్తిగా వేర్వేరు:
| ఆట్రిబ్యూట్ | ఎవరికి అవసరం? | ప్రధాన ప్రయోజనం | ఉదాహరణ |
|---|---|---|---|
name |
బ్యాకెండ్ సర్వర్ (Server-side) | ఫారమ్ సబ్మిట్ చేసినప్పుడు సర్వర్కు డేటా కీ-వ్యాల్యూ జతగా (name=value) వెళ్ళడానికి ఇది తప్పనిసరి. name లేకపోతే సర్వర్కు డేటా చేరదు! |
name="user_email" |
id |
బ్రౌజర్ క్లయింట్ (CSS, JS, <label>) | పేజీలో ఆ ఎలిమెంట్ను ప్రత్యేకంగా గుర్తించడానికి (Unique ID). CSS స్టైలింగ్, JavaScript డాక్యుమెంట్ సెలెక్టర్ మరియు <label for="..."> కనెక్ట్ చేయడానికి వాడతారు. |
id="email-field" |
ఫారమ్ను సబ్మిట్ చేయడానికి HTML లో రెండు రకాల ట్యాగ్లు ఉన్నాయి:
<button type="submit">: ఆధునిక ప్రామాణిక పద్ధతి! దీని లోపల టెక్స్ట్తో పాటు ఐకాన్లు (SVG, ఈమోజీలు), ఇమేజ్లు మరియు స్టైలింగ్ను సులభంగా పెట్టవచ్చు (ఉదా:<button>🚀 రిజిస్టర్ చేసుకోండి</button>).<input type="submit" value="సబ్మిట్">: 1995 నాటి పాత శైలి. ఇందులో కేవలం ప్లెయిన్ టెక్స్ట్ మాత్రమే ఇవ్వగలం; ఐకాన్లు పెట్టలేము.
<button> అయినా బై-డిఫాల్ట్గా type="submit" స్వభావాన్ని కలిగి ఉంటుంది! మీరు పొరపాటున type="button" అని పేర్కొనకపోతే — ఆ బటన్ నొక్కగానే ఫారమ్ ఆటోమేటిక్గా సబ్మిట్ అయి పేజీ రీఫ్రెష్ అయిపోతుంది.
ఫారమ్స్ను మరింత యూజర్-ఫ్రెండ్లీగా మరియు సురక్షితంగా మార్చే రెండు ఆధునిక ఆట్రిబ్యూట్లు:
autocomplete="on | off": యూజర్ గతంలో టైప్ చేసిన సమాచారాన్ని బ్రౌజర్ ఆటో-ఫిల్ చేయాలా వద్దా అని నిర్ణయిస్తుంది. క్రెడిట్ కార్డులు, సీక్రెట్ OTP ఫీల్డ్స్ కోసంautocomplete="off"పెట్టడం శ్రేయస్కరం.novalidate: బ్రౌజర్ యొక్క డిఫాల్ట్ HTML5 వాలిడేషన్ పాపప్లను ఆపివేసి, డెవలపర్ తన స్వంత జావాస్క్రిప్ట్ కస్టమ్ వాలిడేషన్ రాసుకోవడానికి అనుమతిస్తుంది.
ఇన్పుట్కు id రాసి name రాయకపోవడం. దీనివల్ల సబ్మిట్ బటన్ నొక్కినప్పుడు సర్వర్కు ఆ ఫీల్డ్ డేటా అసలు వెళ్ళనే వెళ్ళదు! సర్వర్ దృష్టిలో ఆ ఇన్పుట్ లేనట్లే.
GET వాడటం వల్ల యూజర్ పాస్వర్డ్ బ్రౌజర్ అడ్రస్ బార్లో అందరికీ కనిపించేలా పబ్లిక్ అయిపోతుంది. లాగిన్/పేమెంట్ ఫారమ్స్కు ఎల్లప్పుడూ method="POST" మాత్రమే వాడాలి.
for ఆట్రిబ్యూట్ ఎల్లప్పుడూ ఇన్పుట్ యొక్క id తో మాత్రమే మ్యాచ్ అవ్వాలి, name తో కాదు! <label for="user"> <input id="user"> సరైన పద్ధతి.
ఒక ఫారమ్లో "OTP పంపండి" అని ఒక బటన్ పెట్టి దానికి type="button" ఇవ్వకపోతే — అది సబ్మిట్ బటన్లా ప్రవర్తించి పూర్తి ఫారమ్ను సబ్మిట్ చేసేస్తుంది.
లేబుల్ లేకుండా కేవలం ప్లేస్హోల్డర్ మాత్రమే ఇవ్వడం. యూజర్ టైప్ చేయడం ప్రారంభించగానే ప్లేస్హోల్డర్ అదృశ్యమవుతుంది; ఫలితంగా యూజర్ తాను ఏ బాక్స్లో ఏం టైప్ చేస్తున్నాడో మర్చిపోతాడు.
ఈ అధ్యాయంలో మీరు నేర్చుకున్న విషయాలను స్వయంగా పరీక్షించుకోండి. ప్రతి ప్రశ్నను చదివి సమాధానం ఆలోచించిన తర్వాత "సమాధానం చూడండి" పై క్లిక్ చేయండి:
❓ ప్రశ్న 1: సర్వర్కు డేటా చేరాలంటే ఇన్పుట్ ట్యాగ్కు ఏ ఆట్రిబ్యూట్ తప్పనిసరి?
name ఆట్రిబ్యూట్. బ్రౌజర్ సర్వర్కు డేటాను name=value జంటలుగా పంపుతుంది. name లేని ఇన్పుట్ డేటాను సర్వర్ అందుకోలేదు.
❓ ప్రశ్న 2: GET మరియు POST మెథడ్స్ మధ్య ప్రధాన భద్రతా వ్యత్యాసం ఏమిటి?
❓ ప్రశ్న 3: <label> లోని 'for' ఆట్రిబ్యూట్ ఇన్పుట్ యొక్క దేనితో సరిపోలాలి?
id ఆట్రిబ్యూట్ విలువతో ఖచ్చితంగా సరిపోలాలి.
❓ ప్రశ్న 4: సంబంధిత ఫారమ్ ఫీల్డ్లను గ్రూప్ చేసి శీర్షిక ఇవ్వడానికి ఏ ట్యాగ్లను వాడతారు?
<fieldset> (కంటైనర్ బాక్స్ కోసం) మరియు <legend> (ఆ బాక్స్ శీర్షిక కోసం).
❓ ప్రశ్న 5: ఫారమ్ లోపల ఉన్న బటన్కు ఎటువంటి 'type' ఇవ్వకపోతే దాని డిఫాల్ట్ ప్రవర్తన ఏమిటి?
type="submit" లాగా పనిచేసి ఫారమ్ను సబ్మిట్ చేయడానికి ప్రయత్నిస్తుంది.
పైన వివరించిన form, label, fieldset, legend, మరియు బటన్లతో కూడిన కోడ్ను మన ఆన్లైన్ ఎడిటర్లో ఓపెన్ చేసి, విభిన్న ఇన్పుట్లను టెస్ట్ చేసి లైవ్ ఫలితాన్ని చూడండి!
📌 క్విక్ సారాంశం (Key Takeaways):
- <form>: యూజర్ ఇన్పుట్ను సర్వర్కు పంపే ప్రధాన కంటైనర్.
- action & method: ఎక్కడికి పంపాలో action చెబుతుంది, ఎలా పంపాలో (GET/POST) method చెబుతుంది.
- భద్రత: పాస్వర్డ్లకు మరియు మార్పులు చేసే లావాదేవీలకు ఎల్లప్పుడూ POST వాడాలి.
- <label>:
forతో లింక్ చేయడం ద్వారా మొబైల్ ట్యాప్ ఏరియా మరియు యాక్సెసిబిలిటీ పెరుగుతాయి. - name vs id: సర్వర్ కోసం
name, బ్రౌజర్/CSS/JS కోసంid.