Saya membuat front-controller yang sederhana dan sangat ringan. Saya perlu mencocokkan jalur permintaan ke penangan yang berbeda (tindakan) untuk memilih yang benar.
Di mesin lokal saya HttpServletRequest.getPathInfo()
dan HttpServletRequest.getRequestURI()
kembalikan hasil yang sama. Tetapi saya tidak yakin apa yang akan mereka kembalikan di lingkungan produksi.
Jadi, apa perbedaan antara metode ini dan apa yang harus saya pilih?
Jawaban:
getPathInfo()
memberikan informasi jalur tambahan setelah URI, digunakan untuk mengakses Servlet Anda, di mana jugagetRequestURI()
memberikan URI lengkap.Saya akan berpikir mereka akan berbeda, mengingat Servlet harus dikonfigurasi dengan pola URI sendiri di tempat pertama; Saya tidak berpikir saya pernah melayani Servlet dari root (/).
Sebagai contoh jika Servlet 'Foo' dipetakan ke URI '/ foo' maka saya akan berpikir URI:
Akan menghasilkan:
dan
sumber
getRequestURI()
memberi saya string"/foo/path/to/resource"
seperti yang diharapkan, tetapigetPathInfo()
untukHttpServletRequest
objek yang sama memberi sayanull
. Apa yang sedang terjadi? EDIT: Dijawab di bawah oleh pengguna "30thh".Saya akan meletakkan tabel perbandingan kecil di sini (hanya untuk memilikinya di suatu tempat):
Servlet dipetakan sebagai
/test%3F/*
dan aplikasi ditempatkan di bawah/app
.http://30thh.loc:8480/app/test%3F/a%3F+b;jsessionid=S%3F+ID?p+1=c+d&p+2=e+f#a
Pada contoh di atas server berjalan pada
localhost:8480
dan nama30thh.loc
itu dimasukkan kehosts
file OS .Komentar
"+" ditangani sebagai ruang hanya dalam string kueri
Jangkar "#a" tidak ditransfer ke server. Hanya peramban yang dapat bekerja dengannya.
Jika
url-pattern
dalam pemetaan servlet tidak diakhiri dengan*
(misalnya/test
atau*.jsp
),getPathInfo()
kembalinull
.Jika Spring MVC digunakan
Metode
getPathInfo()
kembalinull
.Metode
getServletPath()
mengembalikan bagian antara jalur konteks dan ID sesi. Dalam contoh di atas nilainya akan/test?/a?+b
Hati-hati dengan URL yang dikodekan pada
@RequestMapping
dan@RequestParam
di Musim Semi. Ini buggy (versi saat ini 3.2.4) dan biasanya tidak berfungsi seperti yang diharapkan .sumber
If the url-pattern in the servlet mapping does not end with * (for example /test or *.jsp), getPathInfo() returns null.
cemerlang.getRequestURI()
dangetRequestURL()
harus mengembalikan jsessionid yang tidak diterjemahkan, dalam hal iniS%3F+ID
. Setidaknya itu pada Tomcat / 8.5.6.Mari kita uraikan URL lengkap yang akan diketik klien ke bilah alamat untuk mencapai servlet Anda:
http://www.example.com:80/awesome-application/path/to/servlet/path/info?a=1&b=2#boo
Bagian-bagiannya adalah:
http
www.example.com
80
awesome-application
path/to/servlet
path/info
a=1&b=2
boo
Permintaan URI (dikembalikan oleh getRequestURI ) sesuai dengan bagian 4, 5 dan 6.
(kebetulan, meskipun Anda tidak meminta ini, metode getRequestURL akan memberi Anda bagian 1, 2, 3, 4, 5 dan 6).
Sekarang:
Berikut ini selalu berlaku (kecuali untuk perbedaan penyandian URL):
Contoh berikut dari spesifikasi Servlet 3.0 sangat membantu:
Catatan: gambar berikut, saya tidak punya waktu untuk membuat ulang dalam HTML:
sumber
Pertimbangkan servlet conf berikut:
Sekarang, ketika saya menekan URL
http://localhost:8084/JSPTemp1/NewServlet/jhi
, URL akan dipanggilNewServlet
karena dipetakan dengan pola yang dijelaskan di atas.Sini:
Kami punya yang:
getPathInfo()
getRequestURI()
sumber