दिलचस्प पोस्ट
प्रत्येक नियंत्रक / क्रिया विधि से सत्र स्थिति सक्षम / अक्षम करें जावास्क्रिप्ट टर्नरी ऑपरेटर के साथ ऑपरेटर का अग्रभाग % W (अर्रे) का क्या अर्थ है? एक ArrayList का उपयोग कर एक ListView जनसंख्या? ऑब्जेक्ट में JSON स्ट्रिंग को पार्स करने के लिए सरल सी # फ़ंक्शन क्या है? जावा में एक सिंक्रनाइज़ किए गए विधि और सिंक्रनाइज़ ब्लॉक के बीच अंतर क्या है? एंड्रॉइड एचटीटीपी पोस्ट: परिणाम कैसे प्राप्त करें सी ++ मल्टीलाइन स्ट्रिंग शाब्दिक R: gsub का उपयोग कर वर्णों को प्रतिस्थापित करना, फ़ंक्शन कैसे बनाएं? लिंक किए गए सर्वर MySQL कैसे बनाएँ मैं Windows के लिए विज़ुअल स्टूडियो कोड में कोड के वर्गों को कैसे संक्षिप्त कर सकता हूं निर्भरता रीसॉल्वर। सेटरॉल्वर और एचटीटीपी कॉन्फ़िगरेशन के बीच अंतर क्या है। WebAPI में निर्भरता रीसोलर चेतावनी: फ़ंक्शन खतरनाक हो जाता है स्विफ्ट वैकल्पिक वैकल्पिक पैरामीटर और शून्य YUV को बिटमैप सरणी कनवर्ट करें (YCbCr NV21)

Servlets में doGet और doPost

मैंने एक एचटीएमएल पृष्ठ विकसित किया है जो सबलेट को जानकारी भेजता है सर्विस में, मैं doGet() और doPost() के तरीकों का उपयोग कर रहा हूं:

 public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String id = req.getParameter("realname"); String password = req.getParameter("mypassword"); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String id = req.getParameter("realname"); String password = req.getParameter("mypassword"); } 

सर्विस पृष्ठ को कॉल करने वाले एचटीएल पृष्ठ कोड में:

 <form action="identification" method="post" enctype="multipart/form-data"> User Name: <input type="text" name="realname"> Password: <input type="password" name="mypassword"> <input type="submit" value="Identification"> </form> 

जब मैं Servlet में method = "get" का उपयोग करता हूं, मुझे आईडी और पासवर्ड का मान मिलता है, हालांकि method = "post" , आईडी और पासवर्ड का उपयोग करते समय null सेट किया जाता है। मुझे इस मामले में मान क्यों नहीं मिलते?

एक अन्य बात मैं जानना चाहूंगा कि Servlet द्वारा उत्पन्न या मान्य डेटा का उपयोग कैसे करना है। उदाहरण के लिए, यदि उपर्युक्त सर्वोलेट उपयोगकर्ता को प्रमाणित करता है, तो मैं अपने HTML पृष्ठ में यूजर आईडी को प्रिंट करना चाहता हूं। मुझे स्ट्रिंग 'आईडी' को प्रतिक्रिया के रूप में भेजने में सक्षम होना चाहिए और मेरे एचटीएमएल पेज में इस जानकारी का इस्तेमाल करना चाहिए। क्या यह संभव है?

Solutions Collecting From Web of "Servlets में doGet और doPost"

परिचय

जब आप HTTP GET अनुरोधों पर रोकना चाहते हैं, तो आपको doGet() उपयोग करना चाहिए। जब आप HTTP POST अनुरोधों पर रोकना चाहते हैं, तो आपको doPost() उपयोग करना चाहिए। बस इतना ही। एक को दूसरे या इसके विपरीत (जैसे नेटबीन्स 'दुर्भाग्यपूर्ण ऑटो-जेनरेट की गई processRequest() तरीके से पोर्ट न करें। यह कोई स्पष्ट अर्थ नहीं है।

प्राप्त

आमतौर पर, HTTP प्राप्त अनुरोध idempotent हैं । यदि आप अनुरोध पर हर बार ठीक उसी परिणाम प्राप्त करते हैं (प्राधिकरण / प्रमाणीकरण और पृष्ठ के समय-संवेदनशील प्रकृति को छोड़कर -सर्क परिणाम, आखिरी खबर, आदि-बाहरी विचार)। हम एक बुकमार्क करने योग्य अनुरोध के बारे में बात कर सकते हैं किसी लिंक को क्लिक करने, एक बुकमार्क क्लिक करने, ब्राउज़र पता बार में कच्चे यूआरएल दर्ज करने आदि वगैरह एक HTTP GET अनुरोध को आग लगा देगा अगर कोई सर्विसलेट यूआरएल पर सवाल सुन रहा है, तो इसके doGet() विधि को कॉल किया जाएगा। यह आम तौर पर एक अनुरोध को प्री-प्रोसेस करने के लिए उपयोग किया जाता है एक जेएसपी से एचटीएमएल आउटपुट प्रस्तुत करने से पहले, जैसे कि टेबल में डिस्प्ले के लिए डेटा इकट्ठा करना, कुछ व्यावसायिक सामान करना।

 @WebServlet("/products") public class ProductsServlet extends HttpServlet { @EJB private ProductService productService; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Product> products = productService.list(); request.setAttribute("products", products); // Will be available as ${products} in JSP request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); } } 
 <table> <c:forEach items="${products}" var="product"> <tr> <td>${product.name}</td> <td><a href="product?id=${product.id}">detail</a></td> </tr> </c:forEach> </table> 

उपरोक्त अंतिम कॉलम में दिखाए गए अनुसार लिंक भी देखें / संपादित करें आमतौर पर idempotent हैं।

 @WebServlet("/product") public class ProductServlet extends HttpServlet { @EJB private ProductService productService; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Product product = productService.find(request.getParameter("id")); request.setAttribute("product", product); // Will be available as ${product} in JSP request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response); } } 
 <dl> <dt>ID</dt> <dd>${product.id}</dd> <dt>Name</dt> <dd>${product.name}</dd> <dt>Description</dt> <dd>${product.description}</dd> <dt>Price</dt> <dd>${product.price}</dd> <dt>Image</dt> <dd><img src="productImage?id=${product.id}" /></dd> </dl> 

पद

HTTP पोस्ट अनुरोध idempotent नहीं हैं यदि एंड यूज़र ने एक यूआरएल पर एक पोस्ट फॉर्म पहले से जमा कर दिया है, जिसने एक रीडायरेक्ट नहीं किया है, तो यूआरएल जरूरी नहीं कि बुकमार्क करने योग्य है प्रस्तुत फ़ॉर्म डेटा URL में प्रतिबिंबित नहीं होता है यूआरएल को एक नई ब्राउज़र विंडो / टैब में कॉपी करने से जरूरी नहीं कि जरूरी रूप में एक ही नतीजे के रूप में फार्म जमा करें। ऐसा यूआरएल तब बुकमार्क करने योग्य नहीं है अगर कोई सर्वलेट प्रश्न में यूआरएल को सुन रहा है, तो इसके doPost() को कॉल किया जाएगा यह आम तौर पर एक अनुरोध पोस्ट प्रोसेस करने के लिए उपयोग किया जाता है। Ie जमा किए गए HTML फ़ॉर्म से डेटा एकत्र करना और इसके साथ कुछ व्यावसायिक सामग्री (रूपांतरण, सत्यापन, डीबी, आदि में बचत) करना। अंत में आमतौर पर परिणाम को अग्रेषित जेएसपी पेज से HTML के रूप में प्रस्तुत किया जाता है।

 <form action="login" method="post"> <input type="text" name="username"> <input type="password" name="password"> <input type="submit" value="login"> <span class="error">${error}</span> </form> 

… जो सर्लेट के इस टुकड़े के साथ संयोजन में इस्तेमाल किया जा सकता है:

 @WebServlet("/login") public class LoginServlet extends HttpServlet { @EJB private UserService userService; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); User user = userService.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); response.sendRedirect("home"); } else { request.setAttribute("error", "Unknown user, please try again"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } } 

यदि आप User डीबी (यानी उपयोगकर्ता नाम और पासवर्ड मान्य हैं) में पाएंगे, तो User को सत्र के क्षेत्र में रखा जाएगा (अर्थात "लॉग इन") और सर्वलेट कुछ मुख्य पेज पर रीडायरेक्ट हो जाएगा (यह उदाहरण http://example.com/contextname/home जाता है http://example.com/contextname/home ), अन्यथा यह एक त्रुटि संदेश सेट करेगा और अनुरोध को उसी जेएसपी पृष्ठ पर वापस भेज देगा ताकि संदेश ${error} द्वारा प्रदर्शित हो सके।

यदि आवश्यक हो तो login.jsp में भी "छिपाना" कर सकते हैं ताकि उपयोगकर्ता केवल सर्वलेट द्वारा इसे एक्सेस कर सकें। यह यूआरएल को साफ रखता है http://example.com/contextname/login आपको बस इतना करना है कि इस तरह से doGet() एक doGet() जोड़ना है:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); } 

(और तदनुसार doPost() में एक ही पंक्ति अपडेट करें)

उसने कहा, मुझे यकीन नहीं है कि यह सिर्फ अंधेरे में खेल रहा है और शूटिंग कर रहा है, लेकिन जो कोड आपने पोस्ट किया वह अच्छा नहीं दिखता (जैसे compareTo() में equals() बजाय और parameternames के बजाय खुदाई के बजाय getParameter() का उपयोग करते हुए और id और password सर्वलेट इंस्टेंस वैरिएबल के रूप में घोषित किया जाता है – जो getParameter() नहीं है)। इसलिए मैं दृढ़ता से अनुशंसा करता हूं कि ओरेकल ट्यूटोरियल्स का प्रयोग करके मूल जावा एसई एपीआई के बारे में और कुछ सीखना (अध्याय "ट्रेल्स कवरिंग द बेसिक्स" की जांच करें) और इन ट्यूटोरियल का उपयोग करने के लिए जेएसपी / सेलेट्स का सही तरीके से उपयोग कैसे करें।

यह भी देखें:

  • हमारे सर्वलेट विकी पृष्ठ
  • जावा ईई वेब विकास, मैं कहां से शुरू कर सकता हूं और मुझे किस कौशल की ज़रूरत है?
  • सर्वलेट रिटर्न "HTTP स्थिति 404 अनुरोधित संसाधन (/ servlet) उपलब्ध नहीं है"
  • जेएसडीपी में जेडीपी पेज में एमडीसी और डीएओ पैटर्न का उपयोग करते हुए JDBC ResultSet सेट करें

अपडेट करें : आपके प्रश्न के अपडेट के अनुसार (जो बहुत बड़ा है, आपको अपने मूल प्रश्न के कुछ हिस्सों को नहीं निकालना चाहिए, इससे उत्तर बेकार हो जाएगा .. बल्कि एक नए ब्लॉक में जानकारी जोड़ें ), यह पता चला है कि आप अनावश्यक रूप से प्रपत्र के एन्कोडिंग प्रकार को multipart/form-data सेट करना यह (डिफ़ॉल्ट) application/x-www-form-urlencoded तुलना में एक अलग संरचना में अनुरोध पैरामीटर भेजेगा जो क्वेरी स्ट्रिंग के रूप में अनुरोध पैरामीटर भेजता है (जैसे name1=value1&name2=value2&name3=value3 )। जब भी आपके पास <input type="file"> में अपलोड करने के लिए फ़ॉर्म में <input type="file"> तत्व होता है, जो गैर-वर्ण डेटा (बाइनरी डेटा) हो सकता है। यह आपके मामले में मामला नहीं है, इसलिए इसे हटा दें और यह अपेक्षा के अनुरूप काम करेगा। यदि आपको कभी भी फाइल अपलोड करने की आवश्यकता है, तो आपको एन्कोडिंग प्रकार को सेट करना होगा और अनुरोध निकाय को स्वयं पार्स करना होगा। आम तौर पर आप वहां अपाचे कॉमन्स फाइल का इस्तेमाल करते हैं, लेकिन अगर आप पहले से ही नए सर्विसेट 3.0 एपीआई पर हैं, तो आप बस HttpServletRequest#getPart() शुरू होने वाली HttpServletRequest#getPart() सुविधा का उपयोग कर सकते हैं। एक ठोस उदाहरण के लिए यह जवाब भी देखें: JSP / Servlet का उपयोग कर सर्वर पर फाइल कैसे अपलोड करें?

सर्वर से एकल संसाधन का अनुरोध करने के लिए ब्राउज़र द्वारा GET और POST दोनों का उपयोग किया जाता है प्रत्येक संसाधन को अलग GET या POST अनुरोध की आवश्यकता है।

  1. सर्वर से जानकारी प्राप्त करने के लिए ब्राउज़र द्वारा उपयोग की जाने वाली GET विधि सबसे सामान्य (और वह डिफ़ॉल्ट विधि है) अनुरोध विधि का तीसरा खंड GET विधि का उपयोग करते समय, जो अनुरोध शरीर है, खाली रहता है।

GET पद्धति का उपयोग दो तरीकों में किया जाता है: जब कोई भी विधि निर्दिष्ट नहीं होती है, तब वह तब होता है जब आप या ब्राउज़र एक सरल संसाधन जैसे कि एक HTML पृष्ठ, एक छवि आदि का अनुरोध कर रहे हैं। जब एक फ़ॉर्म सबमिट किया जाता है, और आप विधि चुनते हैं = HTML टैग पर प्राप्त करें अगर GET विधि का उपयोग किसी एचटीएमएल फॉर्म के साथ किया जाता है, तो फॉर्म के माध्यम से इकट्ठा किए गए डेटा को "?" यूआरएल के अंत में, और फिर सभी नाम = वैल्यू युग्ज (html फार्म फ़ील्ड का नाम और उस फ़ील्ड में डाली गई वैल्यू का नाम) "और" उदाहरण से अलग करें: GET /sultans/shop//form1.jsp?name= सैम% 20 सुल्तान और आइसक्रीम = वेनिला HTTP / 1.0 वैकल्पिक हैडरपैथमल हैडर << खाली पंक्ति >>>

नाम = मान फ़ॉर्म डेटा को QUERY_STRING नामक एक पर्यावरण चर में संग्रहीत किया जाएगा। यह चर एक प्रसंस्करण प्रोग्राम (जैसे जेएसपी, जावा सर्वलेट, PHP आदि) को भेजा जाएगा।

  1. जब आप एक HTML फॉर्म बनाते हैं, और टैग के भाग के रूप में अनुरोध विधि = POST बनाते हैं तो POST विधि का उपयोग किया जाता है। पोस्ट पद्धति क्लाइंट को सर्वर से फ़ॉर्म डेटा भेजने का अनुरोध अनुरोध अनुभाग अनुभाग (जैसा कि पहले चर्चा की गई थी) में भेजने की अनुमति देता है। डेटा को एन्कोड किया गया है और इसे GET विधि के समान स्वरूपित किया जाता है, सिवाय इसके कि मानक इनपुट के माध्यम से डेटा को प्रोग्राम भेजा जाता है।

उदाहरण: POST /sultans/shop//form1.jsp HTTP / 1.0 वैकल्पिक हैडरपैथमल शीर्षलेख << खाली पंक्ति >>> नाम = सैम% 20 सुल्तान और आइसक्रीम = वेनिला

पोस्ट विधि का उपयोग करते समय, QUERY_STRING परिवेश चर खाली होगा। जीपीटी बनाम पद के फायदे / नुकसान

जीईटी पद्धति के लाभ: थोड़ा सा तेज पैरामीटर एक फार्म के माध्यम से या यूआरएल पेज के बाद उन्हें जोड़कर दर्ज किया जा सकता है इसके मापदंडों के साथ बुकमार्क किया जा सकता है

GET विधि का नुकसान: केवल 4 के लायक डेटा भेज सकते हैं (पाठ का क्षेत्र का उपयोग करते समय इसका उपयोग नहीं करना चाहिए) पैरामीटर यूआरएल के अंत में दिखाई देते हैं

POST विधि के लाभ: पैरामीटर यूआरएल के अंत में दिखाई नहीं दे रहे हैं। (संवेदनशील डेटा के लिए उपयोग करें) सर्वर पर 4K मूल्य का अधिक डेटा भेज सकते हैं

POST विधि का नुकसान: इसके डेटा के साथ बुकमार्क नहीं किया जा सकता है

Servlet कंटेनर के एचटीपीपीएस (सेवा) के कार्यान्वयन को स्वचालित रूप से doGet () या doPost () के लिए आवश्यक रूप से आगे बढ़ाया जाएगा, ताकि आपको सेवा विधि को ओवरराइड करने की आवश्यकता न हो।

क्या यह हो सकता है कि आप डेटा प्राप्त करें, पोस्ट न करें?

 <form method="get" ..> .. </form> 

यदि आप अपने एचटीएमएल फार्म के लिए <form action="identification" > करते हैं, तो डेटा को 'गेट' का इस्तेमाल करके डिफ़ॉल्ट रूप से पास किया जाएगा और इसलिए आप अपने जावा सर्विसलेट कोड में डोगेट फ़ंक्शन का उपयोग कर इसे पकड़ सकते हैं। इस तरह से डेटा एचटीएमएल हैडर के तहत पारित किया जाएगा और इसलिए सबमिट किए गए यूआरएल में दिखाई देगा। दूसरी तरफ अगर आप HTML बॉडी में डेटा पास करना चाहते हैं, तो यूईई पोस्ट: <form action="identification" method="post"> और डॉट पीस्ट फ़ंक्शन में इस डेटा को पकड़ना। यह था, एचटीएमएल बॉडी के तहत डेटा एचटीएमएल हेडर के तहत पारित किया जाएगा, और आपको फार्म जमा करने के बाद यूआरएल में डेटा नहीं दिखाई देगा।

मेरे एचटीएमएल से उदाहरण:

 <body> <form action="StartProcessUrl" method="post"> ..... ..... 

मेरे जाव सर्वलेट कोड से उदाहरण:

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub PrintWriter out = response.getWriter(); String surname = request.getParameter("txtSurname"); String firstname = request.getParameter("txtForename"); String rqNo = request.getParameter("txtRQ6"); String nhsNo = request.getParameter("txtNHSNo"); String attachment1 = request.getParameter("base64textarea1"); String attachment2 = request.getParameter("base64textarea2"); ......... .........