pengantar
Anda harus menggunakan doGet()
saat Anda ingin mencegat permintaan HTTP GET . Anda harus menggunakan doPost()
saat Anda ingin mencegat permintaan HTTP POST . Itu saja. Jangan porting yang satu ke yang lain atau sebaliknya (seperti dalam processRequest()
metode auto-generated Netbeans yang malang ). Ini tidak masuk akal.
DAPATKAN
Biasanya, permintaan HTTP GET bersifat idempoten . Misalnya, Anda mendapatkan hasil yang persis sama setiap kali menjalankan permintaan (meninggalkan otorisasi / otentikasi dan sifat halaman yang sensitif terhadap waktu — hasil penelusuran, berita terakhir, dll — di luar pertimbangan). Kita dapat berbicara tentang permintaan yang dapat di-bookmark. Mengklik link, mengklik bookmark, memasukkan URL mentah di bilah alamat browser, dan lain-lain semua akan mengaktifkan permintaan HTTP GET. Jika Servlet mendengarkan pada URL yang dimaksud, maka doGet()
metodenya akan dipanggil. Ini biasanya digunakan untuk preprocess permintaan. Yaitu melakukan beberapa hal bisnis sebelum menampilkan output HTML dari JSP, seperti mengumpulkan data untuk ditampilkan dalam tabel.
@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>
Juga lihat / edit link detail seperti yang ditunjukkan pada kolom terakhir di atas biasanya idempoten.
@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>
POS
Permintaan HTTP POST tidak idempoten. Jika pengguna akhir telah mengirimkan formulir POST pada URL sebelumnya, yang belum melakukan pengalihan, maka URL tersebut belum tentu dapat di-bookmark. Data formulir yang dikirimkan tidak tercermin dalam URL. Menyalin URL ke dalam jendela / tab browser baru mungkin tidak selalu memberikan hasil yang sama persis seperti setelah formulir dikirim. URL seperti itu tidak dapat di-bookmark. Jika Servlet mendengarkan di URL yang dimaksud, maka itu doPost()
akan dipanggil. Biasanya digunakan untuk memproses permintaan. Yaitu mengumpulkan data dari formulir HTML yang dikirimkan dan melakukan beberapa hal bisnis dengannya (konversi, validasi, menyimpan di DB, dan sebagainya). Akhirnya biasanya hasilnya disajikan sebagai HTML dari halaman JSP yang diteruskan.
<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>
... yang dapat digunakan dalam kombinasi dengan bagian Servlet ini:
@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);
}
}
}
Anda lihat, jika User
ditemukan di DB (yaitu nama pengguna dan kata sandi valid), maka User
akan dimasukkan ke dalam ruang lingkup sesi (yaitu "masuk") dan servlet akan mengarahkan ke beberapa halaman utama (contoh ini pergi ke http://example.com/contextname/home
), jika tidak itu akan menetapkan pesan kesalahan dan meneruskan permintaan kembali ke halaman JSP yang sama sehingga pesan tersebut ditampilkan ${error}
.
Anda dapat jika perlu juga "menyembunyikan" login.jsp
in /WEB-INF/login.jsp
sehingga pengguna hanya dapat mengaksesnya dengan servlet. Ini membuat URL tetap bersih http://example.com/contextname/login
. Yang perlu Anda lakukan adalah menambahkan a doGet()
ke servlet seperti ini:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
}
(dan perbarui baris yang sama doPost()
)
Meskipun demikian, saya tidak yakin apakah itu hanya bermain-main dan memotret dalam kegelapan, tetapi kode yang Anda posting tidak terlihat bagus (seperti menggunakan compareTo()
alih-alih equals()
dan menggali nama parameter alih-alih hanya menggunakan getParameter()
dan id
dan password
tampaknya dideklarasikan sebagai variabel instance servlet - yang BUKAN threadsafe ). Jadi saya sangat menyarankan untuk mempelajari lebih lanjut tentang Java SE API dasar menggunakan tutorial Oracle (periksa bab "Trails Covering the Basics") dan bagaimana menggunakan JSP / Servlets dengan cara yang benar menggunakan tutorial tersebut .
Lihat juga:
Pembaruan : sesuai pembaruan pertanyaan Anda (yang cukup besar, Anda tidak boleh menghapus sebagian dari pertanyaan asli Anda, ini akan membuat jawaban tidak berharga .. melainkan tambahkan informasi di blok baru), ternyata Anda tidak perlu menyetel jenis pengkodean formulir ke multipart/form-data
. Ini akan mengirimkan parameter permintaan dalam komposisi yang berbeda dari (default) application/x-www-form-urlencoded
yang mengirimkan parameter permintaan sebagai string kueri (misalnya name1=value1&name2=value2&name3=value3
). Anda hanya perlu multipart/form-data
jika Anda memiliki file<input type="file">
elemen berupa file untuk mengupload yang mungkin berupa data non-karakter (data biner). Ini tidak terjadi dalam kasus Anda, jadi hapus saja dan itu akan berfungsi seperti yang diharapkan. Jika Anda perlu mengunggah file, Anda harus menyetel jenis pengkodean dan mengurai sendiri isi permintaan. Biasanya Anda menggunakan Apache Commons FileUpload di sana, tetapi jika Anda sudah menggunakan Servlet 3.0 API baru, maka Anda bisa menggunakan fasilitas bawaan yang dimulai dengan HttpServletRequest#getPart()
. Lihat juga jawaban ini untuk contoh nyata: Bagaimana cara mengupload file ke server menggunakan JSP / Servlet?