doGet and doPost Servlets'te


105

Bir Servlet'e bilgi gönderen bir HTML sayfası geliştirdim. Servlet'te yöntemleri kullanıyorum doGet()ve 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");
}

Servlet'i çağıran html sayfa kodunda:

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

Ben kullandığınızda method = "get"Servlet, ben kullanırken ancak kimliği ve şifre değeri elde method = "post"id ve şifre ayarlanır null. Neden bu durumda değerleri alamıyorum?

Bilmek istediğim başka bir şey de Servlet tarafından üretilen veya doğrulanan verilerin nasıl kullanılacağıdır. Örneğin, yukarıda gösterilen Servlet kullanıcının kimliğini doğrularsa, kullanıcı kimliğini HTML sayfamda yazdırmak istiyorum. Yanıt olarak 'id' dizesini gönderebilmeli ve bu bilgiyi HTML sayfamda kullanabilmeliyim. Mümkün mü?


Html'de post yöntemini nasıl kullanıyorsunuz?
Igor Artamonov

Ve ayrıca, parametre isimleri üzerinde bu kadar tuhaf döngüye ne ihtiyacınız var?
Igor Artamonov

1
"Enctype = multipart / form-data" ı kaldırmayı denediniz mi? Bunun senin sorunun olduğundan şüpheleniyorum.
Jack Leow

İşte buydu. Bu varken neden iş göndermiyor? Yardımınız için teşekkürler!
dedalo

Yanıtlar:


197

Giriş

HTTP GET isteklerinedoGet() müdahale etmek istediğinizde kullanmalısınız . HTTP POST isteklerine müdahale etmek istediğinizde kullanmalısınız . Bu kadar. Birini diğerine veya tam tersine taşımayın (Netbeans'in talihsiz otomatik oluşturulan yönteminde olduğu gibi). Bu hiç mantıklı değil.doPost()processRequest()

ALMAK

Genellikle, HTTP GET istekleri idempotenttir . Yani, isteği her yürüttüğünüzde tamamen aynı sonucu alırsınız (yetkilendirme / kimlik doğrulama ve sayfanın zamana duyarlı doğası —arama sonuçları, son haberler, vb — dikkate alınmadan bırakılır). Yer imlerine eklenebilir bir istek hakkında konuşabiliriz. Bir bağlantıya tıklamak, bir yer imine tıklamak, tarayıcının adres çubuğuna ham URL girmek, vb. Hepsi bir HTTP GET isteğini tetikleyecektir. Bir Servlet söz konusu URL'yi dinliyorsa, doGet()yöntemi çağrılacaktır. Genellikle bir isteği önceden işlemek için kullanılır . Örneğin, bir JSP'den HTML çıktısını sunmadan önce, bir tabloda görüntülenmek üzere veri toplamak gibi bazı işlerle uğraşmak.

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

Ayrıca yukarıdaki son sütunda gösterildiği gibi ayrıntı bağlantılarını görüntüleyin / düzenleyin genellikle idempotenttir.

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

İLETİ

HTTP POST istekleri idempotent değildir. Son kullanıcı, bir URL'ye önceden bir POST formu göndermişse, ancak bir yönlendirme yapmamışsa, URL'nin yer imlerine eklenebilir olması gerekmez. Gönderilen form verileri URL'ye yansıtılmaz. URL'yi yeni bir tarayıcı penceresine / sekmesine kopyalamak, formun gönderilmesinden sonraki ile tam olarak aynı sonucu vermeyebilir. Böylesi bir URL bu durumda yer imi eklenemez. Bir Servlet söz konusu URL'yi dinliyorsa, o doPost()zaman çağrılacaktır. Genellikle bir isteği sonradan işlemek için kullanılır . Örneğin, gönderilen bir HTML formundan veri toplamak ve onunla bazı ticari şeyler yapmak (dönüştürme, doğrulama, DB'ye kaydetme, vb.). Son olarak genellikle sonuç, iletilen JSP sayfasından HTML olarak sunulur.

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

... bu Servlet parçasıyla birlikte kullanılabilen:

@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);
        }
    }

}

Görüyorsunuz, eğer UserDB'de bulunursa (yani kullanıcı adı ve parola geçerliyse), o zaman Useroturum kapsamına alınacak (yani "oturum açıldı") ve sunucu uygulaması bir ana sayfaya yeniden yönlendirilecek (bu örnek şuraya gidiyor http://example.com/contextname/home), yoksa bir hata mesajı oluşturur ve mesajı aynı JSP sayfasına iletir, böylece mesaj görüntülenir ${error}.

Sen eğer gereklidir "gizlemek" login.jspin /WEB-INF/login.jspböylece kullanıcıların sunucu uygulaması ile erişebilirsiniz sadece ki. Bu, URL'yi temiz tutar http://example.com/contextname/login. Tek yapmanız gereken doGet(), sunucu uygulamasına şu şekilde bir a eklemektir :

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

(ve aynı satırı doPost()buna göre güncelleyin )

Bununla birlikte, sadece karanlıkta oynayıp mı ateş ettiğinden emin değilim, ancak gönderdiğiniz kod iyi görünmüyor (örneğin , yalnızca ve kullanmak yerine parametre adları compareTo()yerine kullanmak equals()ve kazmak gibi ve görünüyor sunucu uygulaması örnek değişkenleri olarak bildirilebilir - bu, iş parçacığı güvenli DEĞİLDİR ). Bu nedenle, Oracle eğitimlerini kullanarak temel Java SE API hakkında biraz daha fazla bilgi edinmenizi ("Temel Bilgileri Kapsayan Yollar" bölümüne bakın) ve bu eğitimleri kullanarak JSP / Servlet'lerin nasıl doğru şekilde kullanılacağını şiddetle tavsiye ederim .getParameter()idpassword

Ayrıca bakınız:


Güncelleme : Sorunuzun güncellemesine göre (ki bu oldukça önemli, orijinal sorunuzun bazı kısımlarını kaldırmamalısınız, bu cevapları değersiz hale getirecektir .. bilgiyi yeni bir bloğa eklemek yerine ) formun kodlama türünü gereksiz yere olarak ayarlamak multipart/form-data. Bu, istek parametrelerini application/x-www-form-urlencoded, istek parametrelerini bir sorgu dizesi (örn. name1=value1&name2=value2&name3=value3) Olarak gönderen (varsayılan) olandan farklı bir kompozisyonda gönderir . Sadece sahip olduğunuzda ihtiyacınız multipart/form-dataolacak<input type="file">karakter olmayan veriler (ikili veriler) olabilecek dosyaları yüklemek için formdaki öğesi. Sizin durumunuzda durum böyle değil, bu yüzden çıkarın ve beklendiği gibi çalışacaktır. Dosyaları yüklemeniz gerekirse, kodlama türünü bu şekilde ayarlamanız ve istek gövdesini kendiniz ayrıştırmanız gerekir. Genellikle orada Apache Commons FileUpload'u kullanırsınız, ancak zaten yeni Servlet 3.0 API kullanıyorsanız, o zaman sadece yerleşik tesisleri kullanabilirsiniz HttpServletRequest#getPart(). Somut bir örnek için şu yanıta da bakın: JSP / Servlet kullanarak sunucuya dosyalar nasıl yüklenir?


2

Hem GET hem de POST, tarayıcı tarafından sunucudan tek bir kaynak talep etmek için kullanılır. Her kaynak ayrı bir GET veya POST isteği gerektirir.

  1. GET yöntemi, tarayıcılar tarafından sunuculardan bilgi almak için en yaygın olarak kullanılan (ve varsayılan yöntemdir). GET yöntemini kullanırken, istek gövdesi olan istek paketinin 3. bölümü boş kalır.

GET yöntemi iki yoldan biriyle kullanılır: Bir yöntem belirtilmediğinde, yani siz veya tarayıcı bir HTML sayfası, bir resim vb. Gibi basit bir kaynak talep ettiğinde. Bir form gönderildiğinde ve siz yöntemi seçtiğinizde = HTML etiketine GET. GET yöntemi bir HTML formu ile kullanılıyorsa, form aracılığıyla toplanan veriler bir "?" Eklenerek sunucuya gönderilir. URL'nin sonuna ve ardından tüm ad = değer çiftlerini (html form alanının adı ve bu alana girilen değer) bir "&" ile ayrılmış olarak ekleyerek Örnek: GET /sultans/shop//form1.jsp?name= Sam% 20Sultan & iceCream = vanilya HTTP / 1.0 isteğe bağlı başlık isteğe bağlı başlık << boş satır >>>

Ad = değer biçimindeki veriler, QUERY_STRING adlı bir ortam değişkeninde saklanacaktır. Bu değişken, bir işleme programına (JSP, Java servlet, PHP vb.) Gönderilecektir.

  1. POST yöntemi, bir HTML formu oluşturduğunuzda ve etiketin parçası olarak yöntem = POST isteğinde bulunduğunuzda kullanılır. POST yöntemi, istemcinin, isteğin istek gövdesi bölümünde (daha önce tartışıldığı gibi) sunucuya form verilerini göndermesine olanak tanır. Veriler, standart giriş yoluyla programa gönderilmesi dışında GET yöntemine benzer şekilde kodlanır ve biçimlendirilir.

Örnek: POST /sultans/shop//form1.jsp HTTP / 1.0 isteğe bağlı üstbilgi isteğe bağlı başlık << boş satır >>> name = Sam% 20Sultan & iceCream = vanilya

Gönderi yöntemini kullanırken, QUERY_STRING ortam değişkeni boş olacaktır. GET ve POST'un Avantajları / Dezavantajları

GET yönteminin avantajları: Biraz daha hızlı Parametreler, bir form aracılığıyla veya URL Sayfasına parametreleriyle yer işareti koyulduktan sonra bunları ekleyerek girilebilir.

GET yönteminin dezavantajları: Yalnızca 4K değerinde veri gönderebilir. (Bir metin alanı alanı kullanırken kullanmamalısınız) Parametreler URL'nin sonunda görülebilir

POST yönteminin avantajları: Parametreler URL'nin sonunda görünmez. (Hassas veriler için kullanın) Sunucuya 4K değerinden daha fazla veri gönderebilir

POST yönteminin dezavantajları: Verileri ile yer imlerine eklenemez


0

Sunucu uygulaması kapsayıcısının HttpServlet.service () yönteminin uygulaması, gerektiği şekilde otomatik olarak doGet () veya doPost () 'a iletir, bu nedenle hizmet yöntemini geçersiz kılmanız gerekmez.


0

Verileri postayla değil, get aracılığıyla geçiriyor olabilir misiniz?

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

0

<form action="identification" >Html formunuz için yaparsanız , veriler varsayılan olarak 'Get' kullanılarak geçirilir ve bu nedenle java servlet kodunuzdaki doGet işlevini kullanarak bunu yakalayabilirsiniz. Bu şekilde veriler HTML başlığının altına aktarılacak ve dolayısıyla gönderildiğinde URL'de görünecektir. Öte yandan, verileri HTML gövdesine aktarmak istiyorsanız, Post: KULLANIN <form action="identification" method="post">ve doPost işlevinde bu verileri yakalayın. Bu, veriler html başlığı değil html gövdesi altında aktarılacak ve formu gönderdikten sonra verileri URL'de görmeyeceksiniz.

HTML'mden örnekler:

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

Java sunucu uygulaması kodumdan örnekler:

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

.........
.........
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.