SORU
28 ŞUBAT 2010, Pazar


doGet ve doPost sunucu uygulamalarını içinde

Bir Sunucu uygulaması için bilgi gönderen bir HTML sayfası geliştirdim. Uygulamasında, yöntemleri doGet() doPost() kullanıyorum:

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException  {

     id = req.getParameter("realname");
     password = req.getParameter("mypassword");
}

public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

    id = req.getParameter("realname");
    password = req.getParameter("mypassword");
}

Html sayfa kodu bu Sunucu uygulaması, görüşme:

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

Uygulamasında method = "get" kullandığımda, id değerini alıyorum ve method = "post", ıd ve şifrenizi kullanarak 15 ** olarak ayarlandığında, ancak parola. Neden ben bu durumda değerleri almıyorsun?

Bilmek istediğim bir şey, veri veya Sunucu uygulaması tarafından oluşturulan doğrulanmış nasıl kullanılacağı. Eğer Sunucu uygulaması yukarıda gösterilen kullanıcı kimlik doğrulaması, örneğin, bir HTML sayfası içinde kullanıcı kimliğini yazdırmak istiyorum. String 'id' bir tepki olarak ve bir HTML sayfası. bu Bilgi göndermesi gerekir Mümkün mü?

CEVAP
28 ŞUBAT 2010, Pazar


Giriş

HTTP GET requests yolunu kesmek için istediğiniz zaman doGet() kullanmalısınız. HTTP POST requests yolunu kesmek için istediğiniz zaman doPost() kullanmalısınız. Hepsi bu. Diğer ya da tersi bir bağlantı noktası yok. Bu mutlak mantıklı.

OLSUN

Genellikle, HTTP istekleri idempotent. I. e. tam her şey sen istemek (yetkilendirme/kimlik doğrulama ve sayfanın zamana duyarlı doğa arama sonuçları, son haberler, vb-göz dışarıda bırakarak) çalıştırmak aynı sonucu alırsınız. Bookmarkable isteği hakkında konuşabiliriz. Bir bağlantısına tıklayarak yer imi tıklayarak, tarayıcının adres çubuğuna, vesaire ham URL girerek bir HTTP GET isteği ateş. Eğer bir Sunucu uygulaması söz konusu URL dinlediğini, sonra doGet() yöntemi çağrılır. Genellikle için kullanılırsüreç öncesibir istek. I. e. bazı iş yapan bir tablo görüntülemek için bir JSP, veri toplama gibi HTML çıktısını sunmadan önce falan.

@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 görünüm/yukarıda son sütunda gösterildiği gibi ayrıntılı bağlantılar genellikle idempotent düzenleme.

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

POST

HTTP POST istekleri itempotent değildir. Eğer son kullanıcıya bir yönlendirme yapmış olmasın hangi bir URL önceden YAZILAN bir form varsa, URL mutlaka bookmarkable değildir. Gönderilen form verilerini URL yansıtılır. /Sekme mutlaka tam olarak formdan sonra aynı sonucu sağlamayabilir yeni bir tarayıcı penceresine URL Copypasting gönderin. Böyle bir URL değil bookmarkable. Eğer bir Sunucu uygulaması söz konusu URL dinlediğini, sonra doPost() onun adı verilecek. Genellikle için kullanılıryeniden işle yenidenbir istek. I. e. gönderilen HTML formdan veri toplama ve bazı ticari eşya dönüştürme, doğrulama, DB, vesaire tasarruf) yapıyor. Son olarak genellikle sonuç iletilen JSP sayfasından HTML olarak sunulmuştur.

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

Sunucu bu parça ile birlikte kullanılabilir:...

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

}

Bakın, Eğer User buldum DB (yani kullanıcı adı ve şifre geçerli) User bu oturum kapsamında (yani "oturum") ve sunucu uygulaması olacak yönlendirmek için bazı ana sayfaya (bu örnekte gider http://example.com/contextname/home), başka alacak bir hata iletisi ve ileri isteğini geri aynı JSP sayfası böylece mesajı görüntülenir ${error}.

Gerekirse de "" 30 ** /WEB-INF/login.jsp kullanıcılar sadece erişebilmeleri sunucu uygulaması tarafından saklanabilirsiniz. Bu URL http://example.com/contextname/login temiz tutar. Tüm yapmanız gereken bu gibi sunucu uygulaması için doGet() eklemek için:

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

(doPost() aynı satır güncelleştirme buna göre)

O söyledi, ben değil emin eğer sadece oynamak ve çekim karanlık, ama kodu hangi deftere iyi değil (gibi kullanarak compareTo() yerine equals() ve kazma, parameternames yerine sadece kullanma getParameter() id password sanırım sunucu uygulaması olarak bildirilen örnek değişkenleri-hangi DEĞİLDİR threadsafe). Çok isterdim şiddetle tavsiye öğrenmek için biraz daha temel Java SE API kullanarak Oracle tutorials (onay bölüm "Yollar Kapsayan Temelleri") ve nasıl kullanılır JSP/sunucu uygulamalarını doğru bir şekilde kullanarak those tutorials.

Ayrıca Bkz:


Güncelleme: soru (çok önemli olan orijinal soru parçalarını kaldırmak değil, bu cevaplar beş para etmez .. daha doğrusu . güncelleme başına ^em>ekleyinyeni bir blok) bilgi , gereksiz yere multipart/form-data formun kodlama dizerken çıkıyor. Bu istek parametreleri gönderir isteği (varsayılan) application/x-www-form-urlencoded daha farklı bir kompozisyon parametreleri sorgu dizesi (örneğin name1=value1&name2=value2&name3=value3) olarak gönderir. Sadece karakter olmayan veri (binary data) olabilir karşıya dosya şeklinde <input type="file"> bir eleman var her multipart/form-data gerekir. Bu durumda durum böyle değil, sadece onu kaldırmak ve beklendiği gibi çalışır. Eğer hiç dosya yüklemek için gerekiyorsa, o zaman kodlama türünü belirlemek ve isteği vücut kendini ayrıştırmak gerekecek. Genellikle Apache Commons FileUpload orada, ama eğer yeni Sunucu uygulaması 3.0 API zaten iseniz, o zaman sadece yerleşik tesisleri kullanabilirsiniz HttpServletRequest#getPart() ile başlayan için kullanın. Ayrıca Bkz somut bir örnek için bu cevap: How to upload files to server using JSP/Servlet?

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • arnejann

    arnejann

    3 Kasım 2007
  • kourtneyannmakeup

    kourtneyannm

    19 ŞUBAT 2012
  • williamfitzsimmons

    williamfitzs

    14 Mart 2008