সার্লেলে doGet এবং doPost


105

আমি একটি এইচটিএমএল পৃষ্ঠা তৈরি করেছি যা কোনও সার্লেটে তথ্য প্রেরণ করে। সার্লেলে, আমি পদ্ধতিগুলি 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> 

আমি যখন method = "get"সার্লেটটিতে ব্যবহার করি তখন আমি আইডি এবং পাসওয়ার্ডের মান পাই, তবে ব্যবহার করার সময় method = "post", আইডি এবং পাসওয়ার্ড সেট করা থাকে null। আমি কেন এই ক্ষেত্রে মানগুলি পাই না?

আর একটি জিনিস আমি জানতে চাই যে সার্ভলেট দ্বারা উত্পন্ন বা যাচাই করা ডেটা কীভাবে ব্যবহার করতে হয়। উদাহরণস্বরূপ, যদি উপরে প্রদর্শিত সার্ভলেটটি ব্যবহারকারীকে প্রমাণীকরণ করে তবে আমি আমার এইচটিএমএল পৃষ্ঠাতে ব্যবহারকারীর আইডি মুদ্রণ করতে চাই। আমার প্রতিক্রিয়া হিসাবে স্ট্রিং 'আইডি' প্রেরণ করতে সক্ষম হওয়া উচিত এবং এই তথ্যটি আমার এইচটিএমএল পৃষ্ঠায় ব্যবহার করা উচিত। এটা কি সম্ভব?


আপনি কিভাবে এইচটিএমএল পোস্ট পদ্ধতি ব্যবহার করছেন?
ইগোর আর্টামোনভ

এবং এছাড়াও, প্যারামিটারের নামগুলির জন্য আপনার এত অদ্ভুত লুপের কী দরকার?
ইগোর আর্টামোনভ

1
আপনি কি `এনটিটাইপ = মাল্টিপার্ট / ফর্ম-ডেটা` মুছে ফেলার চেষ্টা করেছেন? আমি সন্দেহ করি এটি আপনার সমস্যা।
জ্যাক লু

ঐটা এটা ছিল. এটি উপস্থিত থাকাকালীন কেন পোস্ট কাজ করবেন না? আপনার সাহায্যের জন্য ধন্যবাদ!
ডেডালো

উত্তর:


197

ভূমিকা

আপনি 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় উদাহরণের জন্য এই উত্তরটি দেখুন: জেএসপি / সার্লেট ব্যবহার করে সার্ভারে ফাইলগুলি কীভাবে আপলোড করা যায়?


2

GET এবং POST উভয়ই সার্ভার থেকে একটি একক সংস্থান অনুরোধ করতে ব্রাউজার দ্বারা ব্যবহৃত হয়। প্রতিটি সংস্থার জন্য পৃথক জিইটি বা পোষ্ট অনুরোধ প্রয়োজন।

  1. জিইটি পদ্ধতিটি সার্ভার থেকে তথ্য পুনরুদ্ধার করতে ব্রাউজারগুলির দ্বারা ব্যবহৃত হয় (এবং এটি ডিফল্ট পদ্ধতি) by জিইটি পদ্ধতি ব্যবহার করার সময় অনুরোধের প্যাকেটের তৃতীয় বিভাগটি, যা অনুরোধের অংশটি খালি থাকে।

জিইটি পদ্ধতিটি দুটি উপায়ে একটিতে ব্যবহৃত হয়: যখন কোনও পদ্ধতি নির্দিষ্ট না করা হয়, তখন যখন আপনি বা ব্রাউজারটি কোনও সাধারণ উত্স যেমন একটি HTML পৃষ্ঠা, একটি চিত্র ইত্যাদি অনুরোধ করে থাকে যখন কোনও ফর্ম জমা দেওয়া হয় এবং আপনি পদ্ধতিটি বেছে নেন এইচটিএমএল ট্যাগে পাবেন। যদি জিইটি পদ্ধতিটি এইচটিএমএল ফর্মের সাথে ব্যবহার করা হয়, তবে ফর্মের মাধ্যমে সংগৃহীত ডেটা একটি "যুক্ত করে সার্ভারে প্রেরণ করা হবে?" URL এর শেষে, এবং তারপরে "&" উদাহরণ দ্বারা পৃথক সমস্ত নাম = মান জোড়া (এই ক্ষেত্রে এইচটিএমএল ফর্ম ক্ষেত্রের নাম এবং সেই ক্ষেত্রটিতে প্রবেশ করা মান) যুক্ত করুন: GET /sultans/shop//form1.jsp?name= স্যাম% 20 সুলতান এবং আইসক্রিম = ভ্যানিলা HTTP / 1.0 alচ্ছিক শিরোনাম << খালি লাইন >>>

নাম = মান ফর্ম ডেটা একটি পরিবেশ ভেরিয়েবলে QUERY_STRING নামে সঞ্চয় করা হবে। এই পরিবর্তনশীল একটি প্রসেসিং প্রোগ্রামে প্রেরণ করা হবে (যেমন জেএসপি, জাভা সার্লেট, পিএইচপি ইত্যাদি)

  1. আপনি যখন এইচটিএমএল ফর্ম তৈরি করেন তখন পোষ্ট পদ্ধতিটি ব্যবহার করা হয়, এবং ট্যাগের অংশ হিসাবে পদ্ধতি = পোষ্টের জন্য অনুরোধ করুন। পোষ্ট পদ্ধতিটি ক্লায়েন্টকে অনুরোধের অনুরোধের বডি বিভাগে সার্ভারের কাছে ফর্ম ডেটা প্রেরণ করতে দেয় (যেমন আগে আলোচনা হয়েছে)। স্ট্যান্ডার্ড ইনপুটটির মাধ্যমে ডেটা প্রোগ্রামে প্রেরণ করা বাদে ডেটা এনকোড করা হয় এবং জিইটি পদ্ধতির অনুরূপ ফর্ম্যাট হয়।

উদাহরণ: POST /sultans/shop//form1.jsp HTTP / 1.0 alচ্ছিক শিরোনাম শিরোনাম << ফাঁকা লাইন >>> নাম = স্যাম% 20 সুলতান এবং আইসক্রিম = ভ্যানিলা

পোস্ট পদ্ধতিটি ব্যবহার করার সময়, QUERY_STRING পরিবেশের পরিবর্তনশীল খালি থাকবে। জিইটি বনাম পোষ্টের সুবিধা / অসুবিধাগুলি

জিইটি পদ্ধতির সুবিধা: কিছুটা দ্রুত প্যারামিটারগুলি কোনও ফর্মের মাধ্যমে বা সেগুলি যুক্ত করার পরে URL পৃষ্ঠাটি তার পরামিতিগুলির সাথে বুকমার্ক করার পরে প্রবেশ করা যেতে পারে

জিইটি পদ্ধতির অসুবিধা: কেবল 4K মূল্যবান ডেটা প্রেরণ করতে পারে। (টেক্সেরিয়া ক্ষেত্রটি ব্যবহার করার সময় আপনার এটি ব্যবহার করা উচিত নয়) প্যারামিটারগুলি URL এর শেষে দৃশ্যমান visible

পোষ্ট পদ্ধতির সুবিধা: ইউআরএল শেষে প্যারামিটারগুলি দৃশ্যমান হয় না। (সংবেদনশীল ডেটার জন্য ব্যবহার) সার্ভারে আরও 4K মূল্যবান ডেটা প্রেরণ করতে পারে

পোষ্ট পদ্ধতির অসুবিধাগুলি: এর ডেটা দিয়ে বুকমার্ক করা যায় না


0

HTTPServlet.service () পদ্ধতির servlet ধারকটির প্রয়োগটি স্বয়ংক্রিয়ভাবে doGet () বা doPost () তে প্রয়োজনীয় হিসাবে ফরোয়ার্ড হবে, সুতরাং আপনার পরিষেবা পদ্ধতিটি ওভাররাইড করার দরকার নেই।


0

এটি কি এমন হতে পারে যে আপনি পোস্টের মাধ্যমে, পাসের মাধ্যমে ডেটা পাস করছেন?

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

0

আপনি যদি <form action="identification" >এইচটিএমএল ফর্মের জন্য করেন তবে ডেটা ডিফল্টরূপে 'গেট' ব্যবহার করে পাস করা হবে এবং তাই আপনি নিজের জাভা সার্লেট কোডে ডগেট ফাংশন ব্যবহার করে এটি ধরতে পারবেন। এই ভাবে ডেটা এইচটিএমএল শিরোলেখের অধীনে পাস করা হবে এবং সুতরাং জমা দেওয়ার সময় ইউআরএলে দৃশ্যমান হবে। অন্যদিকে আপনি যদি এইচটিএমএল বডিতে ডেটা পাস করতে চান তবে তারপরে ইউএসই পোস্ট করুন: <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");

.........
.........
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.