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?