ভূমিকা
আপনি HTTP জিইটি অনুরোধগুলিতেdoGet()
বাধা দিতে চাইলে আপনার ব্যবহার করা উচিত । আপনি HTTP পোষ্ট অনুরোধগুলিতে বাধা দিতে চাইলে আপনার ব্যবহার করা উচিত । এখানেই শেষ. একে অন্যটিকে বা তার বিপরীতে পোর্ট করবেন না (যেমন নেটবিনের দুর্ভাগ্যজনক স্বয়ংক্রিয়ভাবে উত্পন্ন পদ্ধতিতে)। এটি সম্পূর্ণরূপে অর্থবোধ করে না।doPost()
processRequest()
পাওয়া
সাধারণত, এইচটিটিপি জিইটি অনুরোধগুলি আদর্শবান । অর্থাত্ আপনি অনুরোধটি কার্যকর করার সময় প্রতিটি সময় ঠিক একই ফলাফল পান (অনুমোদন / প্রমাণীকরণ এবং পৃষ্ঠাটির সময় সংবেদনশীল প্রকৃতি - অনুসন্ধানের ফলাফল, শেষ সংবাদ ইত্যাদি বিবেচনার বাইরে)। আমরা একটি বুকমার্কযোগ্য অনুরোধ সম্পর্কে কথা বলতে পারেন। কোনও লিঙ্কে ক্লিক করা, একটি বুকমার্ক ক্লিক করা, ব্রাউজারের অ্যাড্রেস বারে কাঁচা ইউআরএল প্রবেশ করা, এসটেটেরা সমস্ত এইচটিটিপি জিইটি অনুরোধকে বরখাস্ত করবে। কোনও সার্লেট যদি প্রশ্নে ইউআরএল শুনছে তবে তার 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>
উপরের শেষ কলামে প্রদর্শিত লিঙ্কগুলি দেখুন / সম্পাদনা করুন সাধারণত আদর্শবান ot
@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 পোষ্ট অনুরোধ আদর্শ না। যদি এন্ডুয়েসার ইতিমধ্যে কোনও URL এ কোনও পোষ্ট ফর্ম জমা দেয়, যা কোনও পুনঃনির্দেশ সম্পাদন করে না, তবে ইউআরএলটি বুকমার্কযোগ্য নয় able জমা দেওয়া ফর্ম ডেটা ইউআরএলে প্রতিফলিত হয় না। একটি নতুন ব্রাউজার উইন্ডো / ট্যাবে URL টি কপিস্ট করা ফর্ম জমা দেওয়ার পরে ঠিক একই ফলাফলটি নাও পেতে পারে। এই জাতীয় URL তখন বুকমার্কযোগ্য নয়। কোনও সার্লেট যদি প্রশ্নে ইউআরএল শুনছে তবে তার কল doPost()
হবে। এটি সাধারণত একটি অনুরোধ পোস্টপ্রসেস করতে ব্যবহৃত হয় । অর্থাৎ জমা দেওয়া এইচটিএমএল ফর্ম থেকে ডেটা সংগ্রহ করা এবং এর সাথে কিছু ব্যবসায়ের স্টাফ করা (রূপান্তর, বৈধকরণ, ডিবিতে সংরক্ষণ, ইত্যাদি)। অবশেষে ফলাফলটি পূর্ববর্তী জেএসপি পৃষ্ঠা থেকে এইচটিএমএল হিসাবে উপস্থাপন করা হয়।
<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
অন্যথায় উদাহরণটি যাবে ), অন্যথায় এটি একটি ত্রুটি বার্তা সেট করবে এবং অনুরোধটি আবার একই জেএসপি পৃষ্ঠায় ফরোয়ার্ড করবে যাতে বার্তাটি প্রদর্শিত হয় ${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
মনে হয় সার্লেলেট উদাহরণ ভেরিয়েবল হিসাবে ঘোষণা করুন - যা থ্রেডসেফ নয় ) is সুতরাং আমি ওরাকল টিউটোরিয়ালগুলি ব্যবহার করে বেসিক জাভা এসই এপিআই সম্পর্কে আরও কিছু শিখতে দৃ strongly়ভাবে সুপারিশ করব ("ট্র্যাজেল অব বেসিকগুলি" অধ্যায়টি পরীক্ষা করুন) এবং কীভাবে এই টিউটোরিয়ালগুলি ব্যবহার করে সঠিকভাবে জেএসপি / সার্লেটগুলি ব্যবহার করবেন ।
আরো দেখুন:
আপডেট : আপনার প্রশ্নের আপডেট অনুসারে (যা বেশ বড়, আপনার মূল প্রশ্নের অংশগুলি অপসারণ করা উচিত নয়, এটি উত্তরগুলি অর্থহীন করে তুলবে .. বরং নতুন ব্লকে তথ্য যুক্ত করুন), দেখা যাচ্ছে যে আপনি অকারণে ফর্ম এর এনকোডিং টাইপ সেট multipart/form-data
। এটি অনুরোধের পরামিতিগুলি (ডিফল্ট) এর চেয়ে পৃথক রচনায় application/x-www-form-urlencoded
প্রেরণ করবে যা অনুরোধের প্যারামিটারগুলি ক্যোরি স্ট্রিং (যেমন name1=value1&name2=value2&name3=value3
) হিসাবে প্রেরণ করে । আপনি multipart/form-data
যখনই প্রয়োজন কেবল তখনই আপনার দরকার হয়<input type="file">
ফাইলগুলি আপলোড করতে ফর্মের উপাদান যা অ-চরিত্রের ডেটা (বাইনারি ডেটা) হতে পারে। এটি আপনার ক্ষেত্রে নয়, তাই এটি কেবল সরিয়ে দিন এবং এটি প্রত্যাশার মতো কাজ করবে। আপনার যদি কখনও ফাইল আপলোড করার প্রয়োজন হয় তবে আপনাকে অবশ্যই এনকোডিং টাইপ সেট করতে হবে এবং অনুরোধের বডিটি নিজেই পার্স করতে হবে। সাধারণত আপনি সেখানে অ্যাপাচি কমন্স ফাইল আপলোড ব্যবহার করেন তবে আপনি যদি ইতিমধ্যে নতুন নতুন সার্লেটলেট 3.0 এপিআই তে থাকেন তবে আপনি কেবল বিল্টিন সুবিধাগুলি দিয়ে শুরু করতে পারেন HttpServletRequest#getPart()
। একটি দৃ concrete় উদাহরণের জন্য এই উত্তরটি দেখুন: জেএসপি / সার্লেট ব্যবহার করে সার্ভারে ফাইলগুলি কীভাবে আপলোড করা যায়?