doGet और doPost सर्वलेट्स में


105

मैंने एक HTML पृष्ठ विकसित किया है जो एक सर्वलेट में सूचना भेजता है। सर्वलेट में, मैं विधियों का उपयोग कर रहा हूं 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");
}

HTML पेज कोड में जो सर्वलेट कहता है वह है:

<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> 

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

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


आप HTML में पोस्ट विधि का उपयोग कैसे कर रहे हैं?
इगोर आर्टमोनोव

और यह भी, क्या आप के लिए पैरामीटर नामों पर इतना अजीब लूप की आवश्यकता है?
इगोर आर्टमोनोव

1
क्या आपने `enctype = multipart / form-data` को हटाने की कोशिश की है? मुझे संदेह है कि आपकी समस्या है।
जैक लेव

वह यह था। जब यह मौजूद है तो पोस्ट काम क्यों नहीं करता है? आपकी सहायताके लिए धन्यवाद!
15

जवाबों:


197

परिचय

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

प्राप्त

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

@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>

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

@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 POST अनुरोध बेकार नहीं हैं। यदि एंड्यूसर ने पहले से एक URL पर एक POST फॉर्म जमा किया है, जिसने रीडायरेक्ट नहीं किया है, तो URL आवश्यक रूप से उल्लेखनीय नहीं है। प्रस्तुत प्रपत्र डेटा URL में परिलक्षित नहीं होता है। URL को एक नई ब्राउज़र विंडो / टैब में कॉपी करने से जरूरी नहीं कि फॉर्म सबमिट होने के बाद ठीक वैसा ही परिणाम मिले। ऐसा URL तब बुकमार्क करने योग्य नहीं है। यदि कोई सर्वलेट URL पर प्रश्न में सुन रहा है, तो doPost()उसे कहा जाएगा। यह आमतौर पर अनुरोध को पोस्टप्रोसेस करने के लिए उपयोग किया जाता है । यानी सबमिट किए गए HTML फॉर्म से डेटा इकट्ठा करना और उसके साथ कुछ व्यापारिक चीजें करना (रूपांतरण, सत्यापन, DB में बचत, वगैरह)। अंत में आमतौर पर परिणाम को अग्रेषित JSP पेज से 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), अन्यथा यह एक त्रुटि संदेश सेट करेगा और अनुरोध को उसी JSP पृष्ठ पर वापस भेज देगा ताकि संदेश द्वारा प्रदर्शित हो जाए ${error}

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

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

(और उसी लाइन को doPost()तदनुसार अपडेट करें )

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

यह सभी देखें:


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


2

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

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

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

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

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

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

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

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

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

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

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


0

सर्वलेट कंटेनर के HttpServlet.service () विधि के कार्यान्वयन के रूप में आवश्यक रूप से doGet () या doPost () के लिए स्वचालित रूप से आगे होगा, इसलिए आपको सेवा पद्धति को ओवरराइड करने की आवश्यकता नहीं होनी चाहिए।


0

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

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

0

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

मेरे html से उदाहरण:

<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");

.........
.........
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.