परिचय
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 / सर्वलेट का उपयोग करके सर्वर पर फाइलें कैसे अपलोड करें?