ActionContext
ActionContext adalah konteks tindakan, di mana Struts2 secara otomatis menyimpan beberapa objek yang diperlukan selama pelaksanaan tindakan, seperti sesi, parameter, lokal, dll. Struts2 akan membuat ActionContext ActionContext yang sesuai berdasarkan setiap utas yang mengeksekusi permintaan HTTP, yaitu, utas memiliki ActionContext yang unik. Oleh karena itu, pengguna dapat menggunakan metode statis ActionContext.getContext () untuk mendapatkan ActionContext dari utas saat ini. Justru karena alasan inilah pengguna tidak perlu khawatir membuat tindakan-aman.
Bagaimanapun, ActionContext digunakan untuk menyimpan data. Struts2 sendiri akan menaruh banyak data di dalamnya, dan pengguna juga dapat meletakkan data yang mereka inginkan. Struktur data ActionContext itu sendiri adalah struktur pemetaan, yaitu peta, yang menggunakan kunci untuk nilai peta. Jadi pengguna dapat menggunakannya seperti menggunakan peta, atau secara langsung menggunakan metode Action.getContextMap () untuk beroperasi di peta.
Data yang ditempatkan di Struts2 sendiri termasuk ActionInvocation, Application (mis. ServletContext), konversioner, lokal, nama tindakan, parameter permintaan, sesi HTTP dan tumpukan nilai, dll. Untuk daftar lengkap, silakan merujuk ke Javadoc -nya (lampiran artikel ini membahas apa yang berisi).
Karena karakteristik yang dapat diperoleh dengan metode ActionContext hanya utas dan statis, itu dapat diperoleh secara langsung di kelas non-aksi tanpa menunggu tindakan dilewati atau disuntikkan. Perlu dicatat bahwa itu hanya valid dalam utas yang dibuat karena permintaan (karena ActionContext yang sesuai dibuat saat meminta), tetapi tidak valid dalam utas yang dimulai oleh server (seperti metode init Fliter). Karena kenyamanan mengaksesnya di kelas non-aksi, ActionContext juga dapat digunakan untuk meneruskan data ke JSP di kelas non-aksi (karena JSP juga dapat dengan mudah mengaksesnya).
Koneksi dan perbedaan antara ValueStack dan ActionContext:
Kesamaan: Mereka semua digunakan dalam ruang lingkup permintaan HTTP, yaitu seumur hidup mereka adalah satu permintaan.
Perbedaan: Nilai tumpukan adalah struktur tumpukan, dan ActionContext adalah struktur peta (peta).
Kontak: Peta yang diperoleh dengan metode ValueStack.GetContext () sebenarnya adalah peta ActionContext. Melihat kode sumber Struts2, kita dapat melihat (baris 79 dari org.apache.struts2.dispatcher.ng.prepareoperations di struts2.3.1.2, metode CreateActionContext). Saat membuat ActionContext, valueStack.getContext () digunakan sebagai parameter konstruktor ActionContext. Jadi, ValueStack dan ActionContext pada dasarnya dapat diperoleh dari satu sama lain.
Catatan: Dalam beberapa dokumen, kata "konteks tumpukan" akan muncul, yang sebenarnya merupakan nilai yang disimpan ke dalam ActionContext. Jadi ketika membaca dokumen -dokumen ini, Anda harus melihat dengan jelas apakah struktur tumpukan (mis. Tumpukan nilai) ditempatkan di atau struktur pemetaan (konteks tumpukan nilai, yaitu, ActionContext).
Cara mendapatkan ActionContext:
Dalam pencegat khusus: gunakan actionInvocation.getInvocationContext () atau gunakan actionContext.getContext ().
Di kelas Action: Biarkan Interceptor menyuntikkan atau menggunakan ActionContext.getContext ().
Di kelas non-aksi: Biarkan parameter lulus kelas aksi, suntikan menggunakan mekanisme injeksi, atau gunakan actionContext.getContext (). CATATAN: ActionContext.getContext () hanya dapat dipanggil dengan kode yang berjalan di utas permintaan, jika tidak null dikembalikan.
Dalam JSP: Secara umum, tidak perlu mendapatkan ActionContext itu sendiri.
Cara Menghemat Nilai ke ActionContext:
Di kelas Java seperti Interceptor, Kelas Tindakan, kelas non-aksi, dll.: Gunakan ActionContext.put (tombol objek, nilai objek) metode.
Dalam JSP: tag <s: set value = "..."/> akan menyimpan nilai di ActionContext secara default (tentu saja, tag <S: Set> juga dapat menyimpan nilai di tempat lain). Selain itu, banyak tag memiliki atribut VAR (atribut ID digunakan sebelumnya, tetapi sekarang atribut ID telah ditinggalkan). Atribut ini dapat menyimpan nilai ke dalam ActionContext, kunci adalah nilai atribut VAR, dan nilai adalah nilai atribut nilai tag. (Beberapa dokumen menulis tentang menyimpan nilai ke dalam konteks ValueStack, yang sebenarnya sama)
Cara Membaca Nilai dari ActionContext:
Di kelas Java seperti Interceptor, Kelas Tindakan, kelas non-aksi, dll.: Gunakan metode ActionContext.get (tombol objek).
Dalam JSP: Gunakan ekspresi OGNL yang dimulai dengan #, misalnya, metode ActionContext.get ("name") akan dipanggil. Catatan: Jika atribut tag tertentu tidak diuraikan sebagai ekspresi OGNL secara default, Anda perlu menggunakan %{} untuk melampirkan ekspresi, dan ekspresi yang mirip dengan " %{#name}" akan muncul. (Lihat lebih banyak untuk "#" di sini)
Singkatnya, menggunakan ActionContext dalam JSP adalah karena itu adalah struktur pemetaan, dan di sisi lain, ia dapat membaca beberapa konfigurasi tindakan. Ketika Anda perlu memberikan nilai -nilai umum untuk banyak tindakan, Anda dapat memiliki masing -masing tindakan memberikan metode getxxx (), tetapi cara yang lebih baik adalah dengan menyimpan nilai -nilai umum ini dalam ActionContext dalam templat interceptor atau JSP (karena templat interseptor atau JSP sering digunakan untuk beberapa tindakan).
Beberapa contoh:
Kode Java
// Kelas ini akan menunjukkan operasi pada ActionContext di Interceptor PublicClass MyInterceptor memperluas AbstractInterceptor {Public String Intercept (ActionInVocation Invocation) melempar Exception {// Get ActionContext ActionContext ActionContext = Invocation.getInVocationContext (); // simpan orang nilai orang = orang baru (); actionContext.put ("orang", orang); // Dapatkan nilai objek nilai = actionContext.get ("orang"); // Dapatkan httpservletRequest httpservletRequest request = (httpservletRequest) actionContext.get (strutsstatics.http_request); // Dapatkan peta permintaan, yaitu nilai yang dioperasikan oleh httpservletRequest.getAttribute (...) dan httpservletRequest.setAttribute (...) peta requestMap = (peta) actionContext.get ("request"); // Kode Lain // ...... Return Invocation.invoke (); }} Kode Java
// Kelas ini akan menunjukkan operasi ActionContext in Action PublicClass MyAction memperluas ActionSupport {@Override Public String Execute () melempar Exception {// Dapatkan nilai stack actionContext actionContext = actionContext.getContext (); // Simpan orang nilai orang = orang baru (); // Ini adalah kelas yang ditentukan dalam contoh sebelumnya ActionContext.put ("orang", orang); // Dapatkan objek objek nilai = actionContext.get ("orang"); // Kode Lain // ...... Sukses Pengembalian; }} Kode HTML
<! Doctype html> <html> <head> <mohahttp-equiv = "konten-tipe" content = "text/html; charset = utf-8"> <itement> halaman jsp </iteme> </head> <body> <!-Jsp ini akan menunjukkan penggunaan aksi konteks di jsp-> <! ActionContext telah disimpan dalam ActionContext, Anda dapat menggunakan "#Person" untuk mendapatkannya, sebagai berikut-> <S: PropertyValue = "#person"/> <!-Dapatkan atribut nama orang tersebut, sebagai berikut-> <s: PropertValue = "#person.name"/> <!-Dapatkan nilai yang disimpan oleh struts2 in Actions in Action, Action. <s:propertyvalue="#request"/> <!-- Get the value stored by Struts2 in ActionContext, such as the Map of session, as follows --> <s:propertyvalue="#session"/> <!-- Get the value stored by Struts2 in ActionContext, request the map of the passed GET parameter or POST parameter, as follows --> <s:propertyvalue="#parameters"/> <!-- The following Menunjukkan Menyimpan Nilai di ActionContext di JSP-> <!-Simpan string "myName", kuncinya adalah "mykey", sebagai berikut-> <s: setValue = "%{'myname'}" var = "mykey"/> <!-Gunakan s: bean tag untuk membuat objek dan menyimpannya di ActionContext, The Key Is Cey Is The CEORN adalah sm <S: beanname = "com.example.person" var = "myObject"/> <!-Setelah itu, Anda dapat menggunakan "#" untuk membacanya, sebagai berikut-> <S: PropertyValue = "#mykey"/> <S: PropertyValue = "#myObject"/> </body> </html> 3. Kelas HttpservletRequest atau peta permintaan
Struts2 menyediakan dua operasi berdasarkan permintaan: satu adalah kelas httpservletrequest yang disediakan oleh server web, yang sama dengan pengoperasian permintaan dalam proyek web java tradisional; Yang lainnya adalah "peta permintaan", yang merupakan kelas pemetaan yang merangkum atribut httpservletRequest. Mengoperasikan peta setara dengan mengoperasikan atribut httpservletRequest. Alasan mengapa peta disediakan adalah bahwa lebih mudah untuk beroperasi, dan yang lainnya adalah bahwa ia dapat menggunakan OGNL untuk membaca permintaan dalam tag JSP. Bagaimanapun, kedua permintaan ini dapat dioperasikan. Adapun konsep -konsep seperti siklus hidup permintaan, tidak ada bedanya dengan proyek web Java lainnya, dan artikel ini tidak akan dijelaskan secara rinci.
Gunakan kelas httpservletrequest atau peta permintaan
Meskipun keduanya dapat dioperasikan, dalam hal atribut permintaan membaca, menggunakan peta permintaan jauh lebih nyaman dan tidak mengekspos antarmuka yang tidak perlu. Tentu saja, HttpServletRequest memiliki beberapa metode yang tidak dimiliki peta permintaan. Tentu saja, yang pertama harus digunakan saat menggunakan metode ini.
Menggunakan peta permintaan atau ActionContext:
Keduanya adalah peta, dan kedua siklus hidup adalah permintaan.
Dalam proyek web Java tradisional, nilainya sering diteruskan ke JSP melalui atribut permintaan: setAttribute pertama () di servlet, dan kemudian getAttribute () di JSP. Tentu saja, dalam proyek Struts2, Anda masih dapat menggunakan metode ini, tetapi meninggalkan fungsi pengiriman yang disediakan oleh Struts2 tidak sepadan dengan usaha. Meskipun penulis tidak menemukan dokumen resmi yang mengatakan bahwa Anda harus mengganti peta permintaan dengan ActionContext, dan tidak menemukan bahwa ada peta dalam program yang dapat memperoleh ActionContext tetapi tidak dapat memperoleh permintaan, di bawah kerangka kerja Struts2, Operating ActionContext lebih nyaman daripada mengoperasikan peta permintaan. Oleh karena itu, penulis merekomendasikan: Cobalah menggunakan ActionContext alih -alih peta permintaan untuk memberikan nilainya.
Peta permintaan terkadang berisi nilai yang ditetapkan oleh kerangka kerja lain, seperti kerangka kerja musim semi. Saat mendapatkan nilai -nilai ini, Anda perlu menggunakan peta permintaan karena tidak ada di ActionContext.
Melalui ActionContext, Anda bisa mendapatkan kelas httpservletRequest: "httpservletRequest request = (httpservletRequest) actionContext.get (strutsstatics.http_request);".
Anda juga bisa mendapatkan peta permintaan melalui ActionContext: "Peta requestMap = (peta) actionContext.get (" request ");". Oleh karena itu, dalam tag JSP, Anda bisa mendapatkan data peta permintaan menggunakan ekspresi "#Request".
Cara mendapatkan httpservletrequest:
Jika sudah ada ActionContext, gunakan "actionContext.get (strutsstatics.http_request)" untuk mendapatkan httpservletRequest.
Dalam pencegat khusus, pertama -tama dapatkan ActionContext, dan kemudian dapatkan melalui ActionContext.
Dalam tindakan, pertama -tama dapatkan ActionContext, dan kemudian dapatkan melalui ActionContext. Atau biarkan tindakan mengimplementasikan antarmuka servletRequestAware dan menggunakan interseptor servletconfigInterceptor, sehingga pencegat akan menyuntikkan httpservletRequest.
Dalam JSP, Anda biasanya tidak perlu mendapatkan httpservletRequest.
Cara Mendapatkan Peta Permintaan:
Jika sudah ada ActionContext, gunakan "ActionContext.get (" Request ")" untuk diperoleh.
Dalam pencegat khusus, pertama -tama dapatkan ActionContext, dan kemudian dapatkan melalui ActionContext.
Dalam tindakan, pertama -tama dapatkan ActionContext, dan kemudian dapatkan melalui ActionContext. Atau Biarkan Tindakan Menerapkan Antarmuka RequestAware dan gunakan Interceptor ServletConfigInterceptor, sehingga Interceptor akan menyuntikkan permintaan peta.
Di JSP, gunakan "#Request" untuk mendapatkan peta permintaan, dan menggunakan "#request.key" atau "#Request ['key']" untuk membaca nilai di peta.
Singkatnya, permintaan masih sesuai dengan aturan umum situs web Java. Namun, penulis merekomendasikan agar pengguna harus mencoba menghindari penggunaan permintaan untuk memberikan nilai.
Beberapa contoh:
// Kelas ini akan menunjukkan pengoperasian peta httpservletRequest dan permintaan dalam Interceptor PublicClass MyInterceptor memperluas AbstractInterceptor {Public String Intercept (ActionInVocation Invocation) melempar Exception {// Get ActionContext ActionContext ActionContext = Invocation.getInvocationContext (); // Dapatkan httpservletRequest httpservletrequest httpservletrequest = (httpservletrequest) actionContext.get (strutsstatics.http_request); // Dapatkan peta peta requestMap = (peta) actionContext.get ("request"); // buat kelas sebagai orang instan orang = orang baru (); // Dua baris pernyataan berikut memiliki fungsi yang sama httpservletrequest.setAttribute ("orang", orang); requestMap.put ("orang", orang); // Kode Lain // ...... Return Invocation.invoke (); }} // Kelas ini akan menunjukkan pengoperasian peta httpservletRequest dan permintaan dalam tindakan (metode statis memperoleh actionContext) publicclass myaction memperluas ActionSupport {@Override Public String Execute () Throws Exception {// dapatkan ActionContext ActionContext actionContext = actionContext.getContext (); // dapatkan httpservletrequest httpservletrequest httpservletrequest = (httpservletrequest) actionContext.get (strutsstatics.http_request); // Dapatkan peta peta requestMap = (peta) actionContext.get ("request"); // buat kelas sebagai orang instan orang = orang baru (); // Dua baris pernyataan berikut memiliki fungsi yang sama httpservletrequest.setAttribute ("orang", orang); requestMap.put ("orang", orang); // Kode Lain // ...... Sukses Pengembalian; }} // Kelas ini akan menunjukkan menggunakan servletRequestAware beraksi untuk mendapatkan httpservletRequest (Catatan: Anda perlu menggunakan servletConfigInterceptor interceptor) myaction publicclass memperluas tindakan yang mendukung servletRequestAware {permintaan httpservletRequest private; // Metode ini adalah metode dari antarmuka servletRequestAware publicVoid setSerVletRequest (permintaan httpservletRequest) {this.request = request; } @Override Public String Execute () melempar Exception {// HttpservletRequest siap di bidang kelas ini, dan dapat digunakan secara langsung // ...... return success; }} // Kelas ini akan menunjukkan menggunakan servletRequestAware dalam tindakan untuk mendapatkan peta permintaan (CATATAN: Anda ingin menggunakan ServletConfigInteptor Interceptor) MyAction PublicClass memperluas ActionSupport mengimplementasikan permintaan ADANCHAWARE {MAP <String, Object> Object; // Metode ini adalah metode dari antarmuka permintaan publicvoid setRequest (peta <string, objek> permintaan) {this.Request = request; } @Override Public String Execute () melempar Exception {// Peta permintaan siap di bidang kelas dan dapat digunakan secara langsung // ...... return success; }}<! Doctype html> <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <itement> jsp halaman </iteme> </head> <body> <!-ini akan menunjukkan penggunaan peta permintaan di jsp-> <! Secara otomatis disimpan dalam ActionContext oleh Struts2 (kunci adalah permintaan), jadi gunakan "#" untuk mengakses ActionContext dan baca permintaan darinya-> <s: nilai properti = "#request"/> <!-dua baris berikut adalah nilai "> <" name '/<"peta yang mengakses-> <S: Nilai Properti =" #Name "/> <" PROPOK "/<" PROPOK "PROPOAT/PROPOK AKTIF THE BODE =" </html>
3. Parameter, yaitu, parameter permintaan GET atau permintaan posting
Parameter adalah parameter yang diteruskan oleh browser ke server saat meminta Get atau Posting. Dalam proyek web Java tradisional, gunakan metode seperti httpservletrequest.getParameter () untuk mendapatkan parameter, dan Anda dapat secara langsung menggunakan httpservletrequest.getParametermap () untuk mendapatkan peta dengan parameter yang dienkapsulasi. Di Struts2, Struts2 secara langsung menyimpan peta di atas di ActionContext, dengan "parameter" kunci. Selain itu, ActionContext juga secara langsung menyediakan metode ActionContext.GetParameters () untuk mendapatkan peta ini. Oleh karena itu, metode parameter operasi di setiap komponen Struts2 sangat mirip dengan metode pengoperasian peta permintaan, dan paragraf ini tidak akan dijelaskan secara rinci.
4. Peta kelas dan sesi httpservletsession
Sesi dalam proyek web Java tradisional semuanya terbiasa, dan kami menggunakannya untuk merekam status sesi pengguna. Struts2 merangkum httpservletsession ke dalam peta, yaitu, "peta sesi", yang mirip dengan pemrosesan permintaan. Namun, untuk menghemat sumber daya sistem, kami tidak akan membuat sesi ketika kami tidak memerlukan sesi. Mungkin karena ini bahwa httpservletsession tidak dimasukkan ke dalam ActionContext di Struts2. Jika program Anda perlu menggunakan httpservletsession, Anda harus terlebih dahulu mendapatkan httpservletRequest, dan kemudian menggunakan getSession () atau getsession (boolean b) untuk mendapatkannya, dan memutuskan apakah Anda perlu membuat sesi. Untuk peta sesi, Struts2 masih menempatkannya di ActionContext (kunci adalah "sesi"), tetapi jangan khawatir, mekanisme peta ini membuat sesi hanya ketika nilai baru dibuat. Singkatnya, pengoperasian httpservletsession di Struts2 harus terlebih dahulu mendapatkannya melalui httpservletrequest, dan pengoperasian peta sesi persis sama dengan pengoperasian peta permintaan, yang tidak akan dijelaskan secara rinci dalam paragraf ini.
5. Peta ServletContext dan Aplikasi
Dalam proyek web Java tradisional, ServletContext digunakan untuk menyimpan variabel global, dan setiap mesin virtual Java hanya memiliki satu ServletContext per proyek web. ServletContext ini dibuat oleh server web untuk memastikan keunikannya. ServletContext memiliki beberapa metode yang dapat mengoperasikan atributnya, dan operasi ini mirip dengan mengoperasikan peta. Jadi, Struts2 merangkum lagi: ia merangkum atribut ServletContext ke dalam peta, yaitu, "peta aplikasi", dan juga menempatkannya di ActionContext (kunci adalah aplikasi). Oleh karena itu, jika pengoperasian peta aplikasi adalah ke peta permintaan, paragraf ini tidak akan dijelaskan secara rinci.
Sedangkan untuk operasi pada servletContext, ini mirip dengan operasi pada httpservletrequest: Struts2 menempatkan servletContext ke dalam ActionContext, dan ServletConfigInterceptor menyediakan antarmuka injeksi ServletContextAware untuk ServletContext. Oleh karena itu, paragraf ini tidak akan dijelaskan secara rinci.
Catatan: Menggunakan "#Application" di OGNL Expressions bisa mendapatkan peta aplikasi, bukan ServletContext. Namun, dalam kode Java yang tertanam dalam JSP (seperti "< % application.getAttribute (" "); %>"), aplikasi adalah servletContext, bukan peta.