Di Struts2, bagian aksi, yaitu, lapisan pengontrol, mengadopsi metode intrusi yang rendah. Kenapa kamu bilang begitu? Ini karena di kelas aksi Struts2 tidak perlu mewarisi kelas dasar apa pun atau mengimplementasikan antarmuka apa pun, juga tidak secara langsung digabungkan dengan API Servlet. Biasanya lebih seperti POJO normal (biasanya harus berisi metode eksekusi tanpa parameter), dan dapat menentukan serangkaian metode (tidak ada metode parameter) dalam konten, dan dapat digunakan sebagai tindakan independen melalui konfigurasi, sehingga mewujudkan penggunaan kembali kode.
Misalnya:
Contoh paket; UserAction Public Class {Private String username; kata sandi string pribadi; Public String Execute () melempar Exception {// ……… .. return "Success"; } string publik getUserName () {return username; } public void setusername (string username) {this.username = username; } public string getPassword () {return kata sandi; } public void setPassword (kata sandi string) {this.password = kata sandi; }}Action Access Servlet
Properti di kelas tindakan ini dapat merangkum parameter dan hasil proses. Sistem tidak membedakan mereka secara ketat.
Namun, untuk membuat kelas tindakan yang dikembangkan pengguna lebih terstandarisasi, Struts2 memberi kita tindakan antarmuka, yang didefinisikan sebagai berikut:
PublicInterface Action {publicstaticFinal String error = "error"; input string publicstaticFinal = "input"; string publicstaticfinal none = "none"; PublicStaticFinal String Login = "Login"; publicstaticfinal string keberhasilan = "sukses"; Public String Execute () melempar Exception;}Namun, ketika kami menulis tindakan, kami biasanya tidak mengimplementasikan antarmuka, tetapi mewarisi tindakan kelas implementasi yang mendukung antarmuka.
Kode kelas ini adalah sebagai berikut:
Action Action ActionSupport mengimplementasikan tindakan, validasi yang dapat divalidasi, TextProvider, localeprovider, serializable {............. public void setactichorsErrors (collection errorMessages) {validationAware.setActionErrors (errormessages); } public collection getActionErrors () {return validationAware.getActionErrors (); } public void setActionMessages (pesan koleksi) {validationAware.setActionMessages (pesan); } public Collection getActionMessages () {return validationAware.getActionMessages (); } koleksi publik getErrormessages () {return getActionErrors (); } peta getErrors () {return getFielderRors (); } // atur bentuk verifikasi bidang kesalahan public void setFielderRors (peta errorMap) {validationAware.setFielderRors (errormap); } peta publik getFielderRors () {return validationAware.getFielderRors (); } public locale getLocale () {actionContext ctx = actionContext.getContext (); if (ctx! = null) {return ctx.getLocale (); } else {log.debug ("Konteks tindakan tidak diinisialisasi"); kembali nol; }} // metode untuk mendapatkan informasi internasional public string getText (string atextName) {return textprovider.getText (atextName); } public String getText (string atextName, string defaultValue) {return textprovider.getText (atextName, defaultValue); } public String getText (string atextName, string defaultValue, string obj) {return textprovider.getText (atextName, defaultValue, obj); } ......... // metode yang digunakan untuk mengakses paket sumber daya internasional sumber daya publik getTexts () {return textprovider.gettexts (); } Public ResourceBundle getTexts (String AbundLeName) {return TextProvider.getTexts (AbundLeName); } // Tambahkan pesan kesalahan tindakan public void addactionError (string anerrorMessage) {validationAware.addactionError (anerrorMessage); } // Tambahkan informasi biasa dari tindakan public void addactionMessage (string amessage) {validationAware.addactionMessage (amessage); } public void addFielderRor (String FieldName, String ErrorMessage) {ValidationAware.AddFielderRor (FieldName, ErrorMessage); } public void validate () {} clone objek publik () melempar clonenotsupportedException {return super.clone (); } .........}Seperti yang disebutkan sebelumnya, Struts2 tidak secara langsung digabungkan dengan API Servlet, jadi bagaimana cara mengakses API Servlet?
Ternyata Struts2 menyediakan kelas ActionContext, yang mensimulasikan API Servlet. Metode utamanya adalah sebagai berikut:
1) Object GET (Kunci Objek): Metode ini mensimulasikan metode httpservletRequest.getAttribute (nama string).
2) peta getApplication () Mengembalikan objek peta yang mensimulasikan instance ServletContext.
3) Static ActionContext getContext (): Dapatkan instance ActionContext dari sistem.
4) peta getSession (): Mengembalikan objek peta yang mensimulasikan instance httpsession.
5) Peta getParameters (): Dapatkan semua parameter permintaan, simulasi httpservletrequest.getParametermap ()
Anda mungkin bertanya -tanya mengapa metode ini selalu mengembalikan peta? Ini terutama untuk kemudahan pengujian. Adapun bagaimana ia mengonversi objek peta dengan instance API servlet yang sebenarnya, kami tidak khawatir tentang hal ini sama sekali, karena Struts2 memiliki pencegat bawaan untuk membantu kami menyelesaikan konversi ini.
Untuk secara langsung menggunakan API Servlet, Struts2 memberi kami antarmuka berikut.
1) ServletContextAware: Tindakan yang mengimplementasikan antarmuka ini dapat secara langsung mengakses instance ServletContext.
2) ServletRequestAware: Tindakan yang mengimplementasikan antarmuka ini dapat secara langsung mengakses instance httpservletRequest.
3) SERVLETRESPONSEAWARE: Tindakan yang mengimplementasikan antarmuka ini dapat secara langsung mengakses instance httpservletResponse.
Di atas terutama berbicara tentang servlet akses aksi. Mari kita lihat bagaimana tindakan Struts2 mengimplementasikan penggunaan kembali kode. Ambil UserAction misalnya. Jika saya membiarkan tindakan ini menangani pendaftaran pengguna dan login (Longin), bagaimana saya harus menulis ulang tindakan ini? Pengguna yang ditulis ulang adalah sebagai berikut:
Contoh paket; Public Class UserAction memperluas ActionSupport {private string username; kata sandi string pribadi; pendaftaran string publik () melempar Exception {// ………… .. Return Success; } Public String Login () melempar Exception {// ……… .. Return Success; } string publik getUserName () {return username; } public void setusername (string username) {this.username = username; } public string getPassword () {return kata sandi; } public void setPassword (kata sandi string) {this.password = kata sandi; }} Konfigurasi Tindakan di Struts.xml
Bolehkah menulis dengan cara ini? Tentu saja, itu tidak berhasil. Kita juga harus mengonfigurasinya di file struts.xml. Ada dua metode konfigurasi:
1) Gunakan cara normal untuk menentukan atribut metode untuk elemen tindakan.
<action name = "LoginAction" class = "example.useraction" method = "Login"> <result name = "success">/success.jsp </result> </cewt> <action name = ”registaction” class = ”example.useraction” method = ”regist”> <name hasil = ”sukses”>/success.jsp </useraction> </action>
2) Gunakan wildcard untuk menentukan atribut metode untuk elemen tindakan.
<action name = "*action" class = "example.useraction" method = "{1}"> <result name = "success">/success.jsp </rence> </action>Cara menggunakan wildcard terlalu fleksibel, dan berikut ini adalah situasi konfigurasi yang lebih kompleks.
<action name = "*_*" class = "Contoh. {1} action" Method = "{2}"> ………. </section>Di mana placeholder {1} cocok dengan * sebelumnya _, dan {2} cocok dengan * berikutnya.
Konfigurasi Tindakan Berdasarkan metode anotasi:
Konfigurasi tindakan yang ingin saya bicarakan di bawah ini tidak ada di src/struts.xml, tetapi prasyarat untuk mengonfigurasinya menggunakan anotasi adalah sebagai tambahan pada paket enam toples dasar, Anda juga memerlukan struts-2.1.8.1.1/lib/struts2-convention-plugin-2.1.1.1.jar/lib/struts2-convention-plugin-2.1.1.1.jar/lib/struts2-convention-PLUGIN-2.1.1.1.1.1.1.1.1.1.1.jar/
Namun, struts.xml masih membutuhkan contoh spesifik
Login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Struts2Log in Verification</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h3>Struts2Login</h3><hr/> <form action="${pageContext.request.contextPath}/user/login.qqi" method="post"> <table> <tr> <td>Username</td> <td><input type="text" name="loginname"/></td> </tr> <tr> <td>Password</td> <td><input type="password" name = "pwd"/> </td> </tr> <tr> <td colspan = "2"> <input type = "kirim" value = "Login"/> </td> </tr> </able> </form> </body> </html> src/struts.xml
<span style = "font-size: large;"> <? xml version = "1.0" encoding = "UTF-8"?> <! Doctype Struts Public "-// Apache Software Foundation // Dtd Struts Configuration 2.1.7 // en" "http://struts.apache.org/dtds/struts/encod parameter permintaan-> <name konstan = "struts.i18n.encoding" value = "UTF-8"/> <!-Tentukan jenis permintaan yang diproses oleh Struts2. Beberapa dipisahkan oleh koma-> <name konstan = "struts.action.extension" value = "action, do, go, qqi"/> <!-Ketika struts.xml diubah, apakah akan memuat ulang. Nilai standarnya salah (digunakan dalam lingkungan produksi), yang terbaik adalah membuka tahap pengembangan-> <name konstan = "struts.configuration.xml.reload" value = "true"/> <!-apakah akan menggunakan mode pengembangan struts. Akan ada lebih banyak informasi debugging dalam model pengembangan. Nilai defaultnya salah (digunakan dalam lingkungan produksi), dan yang terbaik adalah membuka tahap pengembangan-> <name konstan = "struts.devmode" value = "false"/> <!-Tetapkan apakah browser cache konten statis. Nilai standarnya benar (digunakan dalam lingkungan produksi), yang terbaik adalah menutup tahap pengembangan-> <name konstan = "struts.serve.static.browsercache" value = "false" /> <!-Tentukan bahwa musim semi bertanggung jawab atas pembuatan objek tindakan <konstant name = "struts.objectfactory" value = "spring" /--<!-apakah state calling.ObjectFactory "value =" Spring " /--<! name = "struts.enable.dynamicmethodinVocation" value = "false"/> </struts> </span>
Loginaction.java
paket com.javacrazyer.web.action; impor org.apache.struts2.convention.annotation.action; impor org.apache.struts2.convention.annotation.exceptionmapping; impor org.apache.struts2.convention.annotation.exceptionMappings; impor org.apache.struts2.convention.annotation.namespace; impor org.apache.struts2.convention.annotation.parentpackage; impor org.apache.struts2.convention.annotation.Result; impor org.apache.struts2.convention.annotation.Results; impor com.opensymphony.xwork2.actionsupport; /** * Use annotations to configure Action * */ @ParentPackage("struts-default") // Parent package @Namespace("/user") @Results( { @Result(name = "success", location = "/msg.jsp"), @Result(name = "error", location = "/error.jsp") }) @ExceptionMappings( { @ExceptionMapping (Exception = "java.Lange.RunTimeException", result = "error")}) Loginaksi kelas publik memperluas ActionSupport {private static final long serialversionuid = -2554018432709689579L; Private String LoginName; Private String PWD; @Action (value = "Login") Public String Login () melempar Exception {if ("qq" .equals (LoginName) && "123" .equals (pwd)) {return Success; } else {return error; }} @Action (value = "add", result = {@result (name = "success", location = "/index.jsp")}) public string add () melempar pengecualian {return success; } public String getLoginName () {return LoginName; } public void setLoginName (String LoginName) {this.loginName = LoginName; } public string getPwd () {return pwd; } public void setPwd (String pwd) {this.pwd = pwd; }}
Saya tidak akan memposting sukses.jsp dan error.jsp
Penjelasan Konfigurasi Anotasi
1) @parentpackage Tentukan paket induk
2) @namespace Tentukan namespace
3) @Results serangkaian hasil
4) @Result (name = "Success", location = "/msg.jsp") Pemetaan hasil
5) @Action (value = "Login") Menentukan URL permintaan untuk metode pemrosesan permintaan. Perhatikan bahwa itu tidak dapat ditambahkan ke kelas tindakan, ke metode.
6) @ExceptionMappings Array dari Deklarasi Pengecualian Tingkat Pertama
7) @Exceptionmapping memetakan pengecualian deklarasi
Karena metode ini tidak terlalu umum digunakan, Anda hanya dapat memahaminya