1. Arti konversi tipe
Untuk kerangka kerja MVC yang cerdas, penerapan konversi tipe tidak dapat dihindari. Karena parameter permintaan aplikasi struktur B/S (browser/server) dikirim ke server melalui browser, parameter ini tidak dapat memiliki tipe data yang kaya, jadi tipe data konversi harus diselesaikan di sisi server
Kerangka kerja MVC adalah solusi lapisan presentasi dan harus menyediakan dukungan konversi tipe. Struts2 menyediakan dukungan konversi tipe yang sangat kuat.
2. Pengolahan data lapisan presentasi
1. Untuk aplikasi web, lapisan presentasi terutama digunakan untuk berinteraksi dengan pengguna, termasuk mengumpulkan data masukan pengguna dan menyajikan status server kepada pengguna. Oleh karena itu, aliran data pada lapisan presentasi pada dasarnya memiliki dua arah: data masukan dan data keluaran.
2. Untuk data masukan: perlu menyelesaikan konversi dari data string ke beberapa jenis data. Program biasanya tidak dapat diselesaikan secara otomatis dan perlu dikonversi secara manual ke dalam kode.
3. Untuk data keluaran: Java dan jsp mendukung keluaran langsung dari beberapa tipe data.
4. Pemrosesan data lainnya pada lapisan presentasi adalah: verifikasi data, yang dibagi menjadi verifikasi klien dan verifikasi sisi server. Hal ini akan dijelaskan secara rinci nanti.
3. Ketik konversi
1. Parameter HTTP adalah semua tipe string. Data yang disimpan mungkin berupa string, angka, Boolean, tanggal dan waktu, dll. atau tipe JavaBean. Konversi tipe manual, seperti mengonversi string menjadi tanggal, dengan: memperoleh string melalui metode request.getParameter; memeriksa apakah string tersebut kosong;
2. Konversi tipe Struts2
Konversi tipe bawaan Struts2
String dan boolean menyelesaikan konversi antara nilai string dan Boolean
Konversi string dan karakter antara string dan karakter biasa
String, int, dan Integer menyelesaikan konversi antara string dan integer.
String dan Long menyelesaikan konversi antara string dan nilai integer panjang
String, double, dan Double menyelesaikan konversi string dan nilai floating point presisi ganda.
String dan Float menyelesaikan konversi antara string dan floating point presisi tunggal
String dan Tanggal menyelesaikan konversi antara tipe string dan tanggal. Format tanggal menggunakan format SHORT dari Lokal tempat pengguna meminta format tersebut.
String dan array Dalam kasus default, elemen array adalah string. Jika pengguna mendefinisikan konverter tipe, itu juga bisa berupa tipe data komposit lainnya.
String dan Peta dan Daftar
Konversi tipe bawaan Struts2
String dan boolean menyelesaikan konversi antara nilai string dan Boolean
Konversi string dan karakter antara string dan karakter biasa
String, int, dan Integer menyelesaikan konversi antara string dan integer.
String dan Long menyelesaikan konversi antara string dan nilai integer panjang
String, double, dan Double menyelesaikan konversi string dan nilai floating point presisi ganda.
String dan Float menyelesaikan konversi antara string dan floating point presisi tunggal
String dan Tanggal menyelesaikan konversi antara tipe string dan tanggal. Format tanggal menggunakan format SHORT dari Lokal tempat pengguna meminta format tersebut.
String dan array Dalam kasus default, elemen array adalah string. Jika pengguna mendefinisikan konverter tipe, itu juga bisa berupa tipe data komposit lainnya.
String dan Peta dan Daftar
3. Konversi tipe bawaan
4. API konversi tipe struts
Konverter tipe Struts2 sebenarnya diimplementasikan berdasarkan OGNL. Ada antarmuka ognl.TypeConverter di proyek OGNL. Antarmuka didefinisikan sebagai berikut:
antarmuka publik TypeConverter {
Konversi Objek publikValue(Peta arg0, Objek arg1, Anggota arg2, String arg3,
Objek arg4, Kelas arg5) {
kembalikan nol;
}
Untuk mengimplementasikan konverter tipe, Anda harus mengimplementasikan TypeConverter di atas. Namun, metode pada antarmuka di atas terlalu rumit, sehingga proyek OGNL juga menyediakan kelas implementasi antarmuka ini: ognl.DefaultTypeConverter mewarisi kelas ini. Kelas didefinisikan sebagai berikut:
public class DefaultTypeConverter extends Obyek mengimplementasikan TypeConverter{
public Object convertValue(Peta<String,Objek>konteks, Nilai Objek, ClasstoType) {
}
......//Metode lainnya
}
Peran metode ConvertValue adalah untuk menyelesaikan konversi tipe, tetapi konversi tipe ini bersifat dua arah. Ketika sebuah string perlu diubah menjadi instance objek, metode ini juga digunakan digunakan. Konversi ini dilakukan melalui tipe parameter toType yang merupakan tipe target yang perlu dikonversi. Oleh karena itu, arah konversi dapat ditentukan berdasarkan parameter toType.
Parameter metode ConvertValue dan arti kembali Parameter pertama: konteks adalah konteks lingkungan konversi tipe. Parameter kedua: nilai adalah parameter yang perlu dikonversi. Nilai parameter nilai juga berbeda tergantung pada arah konversi.
Parameter ketiga: toType adalah tipe target yang dikonversi. Nilai kembalian metode ini adalah nilai setelah konversi tipe. Jenis nilainya juga berubah seiring arah konversi. Terlihat bahwa metode convertValue yang dikonversi menerima nilai yang perlu dikonversi, jenis target yang perlu dikonversi adalah parameter, dan kemudian mengembalikan nilai target yang dikonversi.
Mengapa Nilai merupakan array string?
Untuk konverter DefaultTypeConverter, ia harus memperhitungkan situasi yang paling umum, sehingga memperlakukan semua parameter permintaan sebagai array string, bukan string. Setara dengan nilai parameter yang diperoleh getParameterValues()
4. Implementasi konverter tipe
1. Halaman pendaftaran langkah pertama
2. Langkah kedua: Implementasikan kelas enkapsulasi Pengguna
3. Langkah ketiga: Implementasikan kelas Action
5. Langkah 5: Daftarkan konverter tipe. Ada tiga metode registrasi:
1. Daftarkan pengonversi tipe lokal: pengonversi tipe lokal hanya berfungsi pada properti Tindakan tertentu
2. Daftarkan pengonversi tipe global: Pengonversi tipe global akan berlaku pada semua atribut spesifik Tindakan.
3. Gunakan anotasi JDK1.5 untuk mendaftarkan pengonversi tipe: buat pengonversi tipe melalui registrasi.
6. Format nama file registrasi registrasi konverter tipe parsial: ActionName-conversion.properties: ActionName adalah nama kelas Action yang memerlukan konverter untuk diterapkan, dan string -conversion.properties berikut adalah file properti umum saat memperbaiki bagian atau lebih dari file. Terdiri dari pasangan kunci-nilai. Isi file adalah: propertyName = type converter class.
#Tentukan bahwa atribut pengguna di UserAction perlu menggunakan kelas redarmy.user.UserConverter untuk menyelesaikan konversi tipe
pengguna=redarmy.pengguna.UserConverter
Catatan: File properti di atas harus berada dalam paket yang sama dengan UserAction. Artinya, dalam kasus di atas, metode di atas dapat digunakan untuk mencapai konversi tipe lokal.
7. Format file nama registrasi konverter tipe global: file xwork-conversion.properties. File ini juga merupakan file properti, dan isinya juga terdiri dari item "tipe komposit = kelas konverter tipe yang sesuai".
Berikut isi file xwork-conversion.properties:
#Tentukan tipe konverter semua kelas redarmy.user.User sebagai redarmy.user.UserConverter
redarmy.pengguna.Pengguna=redarmy.pengguna.UserConverter
Catatan: File xwork-conversion.properties harus dibuat di bawah folder kelas, yaitu di bawah src.
5. Konversi tipe kustom Struts2
Kelas StrutsTypeConverter disediakan di Struts2 untuk menyederhanakan desain konversi tipe khusus. Kelas ini memiliki dua metode abstrak yang perlu diimplementasikan:
(1) Objek publik convertFromString (Konteks peta, nilai String[], Kelas toClass);
Parameter metode pemrosesan yang digunakan untuk mengubah data tipe String menjadi tipe khusus:
konteks --- informasi kontekstual terkait Tindakan
nilai--- nilai parameter yang diperoleh dari permintaan
toClass --- tipe target yang akan dikonversi
(2) public String convertToString(Konteks peta, Obj objek);
Digunakan untuk mengubah tipe khusus menjadi String
parameter:
konteks --- informasi kontekstual terkait Tindakan
obj --- objek tipe khusus
Contoh analisis: Desain dan konfigurasi konversi tipe tanggal
(1) Rancang MyDateTypeConverter, warisi StrutsTypeConverter, dan tutupi dua metodenya. Kode referensinya adalah sebagai berikut:
public Object convertFromString(Konteks peta, nilai String[], Kelas toClass) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
mencoba{
Tanggal v = sdf.parse(nilai[0]);
kembali v;
}menangkap(Pengecualian e){
e.printStackTrace();
kembalikan Tanggal baru();
}
}
Lanjutan
public String convertToString(Konteks peta, Objek objek) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy tahun MM bulan hari hh");
Tanggal v = (Tanggal)obj;
return sdf.format(v);
}
Meskipun Struts2 mendukung konversi String dan Tanggal secara default, Struts2 hanya mendukung konversi format pendek dan format tanggal lokal, yang mungkin tidak memenuhi kebutuhan Anda.
(2) Tambahkan atribut ulang tahun ke kelas UserInfo, yang bertipe java.util.Date
Info Pengguna kelas publik {
id Integer pribadi;
nama String pribadi;
kata sandi String pribadi;
tanggal ulang tahun pribadi;
...
}
(3) Konfigurasikan konverter tipe untuk komponen UserInfo. Pertama, buat file properti berdasarkan nama kelas komponen UserInfo. Format penamaan file adalah nama kelas-konversi.properti.
Misalnya UserInfo-conversion.properties
File ini harus berada dalam paket yang sama dengan komponen UserInfo.
Format konten file fitur ini adalah sebagai berikut:
ulang tahun=demo.converter.MyDateTypeConverter
menjelaskan:
ulang tahun adalah nama atribut tipe java.util.Date di komponen UserInfo
demo.converter.MyDateTypeConverter adalah kelas implementasi konversi khusus
Kerangka kerja Strus2 memperhitungkan hal ini dan menyediakan cara sederhana untuk menanganinya.
Untuk mengkonfigurasi konverter tipe di tingkat global, cukup tulis file properti bernama xwork-conversion.properties, yang harus ditempatkan di direktori /WEB-INF/classes, dengan konten berikut:
java.util.Date=demo.converter.MyDateTypeConverter
6. Konverter tipe khusus
Properti tipe java.util.Date dapat menerima nilai parameter permintaan dalam format 20-07-2009. Tetapi jika kita perlu menerima parameter permintaan dalam format 20091221, kita harus menentukan konverter tipe, jika tidak, struts2 tidak dapat menyelesaikan konversi tipe secara otomatis.
import java.util.Date;
kelas publik HelloWorldAction {
waktu pembuatan Tanggal pribadi;
Tanggal publik getCreatetime() {
kembalikan waktu pembuatan;
}
public void setCreatetime(Tanggal waktu pembuatan) {
this.createtime = waktu pembuatan;
}
}
kelas publik DateConverter memperluas DefaultTypeConverter {
@Override public Object convertValue(Konteks peta, Nilai objek, Kelas toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
mencoba {
if(toType == Date.class){//Saat string dikonversi ke tipe Tanggal
String[] params = (String[]) nilai;// Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//Saat Tanggal diubah menjadi string
Tanggal tanggal = nilai (Tanggal);
return dateFormat.format(tanggal);
}
} tangkapan (ParseException e) {}
kembalikan nol;
}
}
Daftarkan konverter tipe di atas sebagai konverter tipe lokal:
Tempatkan file ActionClassName-conversion.properties di bawah paket tempat kelas Action berada. ActionClassName adalah nama kelas Action, dan -conversion.properties berikut adalah metode penulisan tetap Properti HelloWorldAction-conversion. Isi dalam file properti adalah:
Nama properti = Nama kelas lengkap dari tipe converter Untuk contoh ini, isi file HelloWorldAction-conversion.properties adalah:
waktu buat= cn.csdn.konversi.DateConverter
Daftarkan konverter tipe di atas sebagai konverter tipe global:
Tempatkan file xwork-conversion.properties di bawah WEB-INF/classes. Isi dalam file properti adalah:
Tipe yang akan dikonversi = nama kelas yang sepenuhnya memenuhi syarat dari tipe konverter. Untuk contoh ini, isi file xwork-conversion.properties adalah:
java.util.Date= cn.csdn.konversi.DateConverter
Properti tipe java.util.Date dapat menerima nilai parameter permintaan dalam format 20-07-2009. Tetapi jika kita perlu menerima parameter permintaan dalam format 20091221, kita harus menentukan konverter tipe, jika tidak, struts2 tidak dapat menyelesaikan konversi tipe secara otomatis.
import java.util.Date;
kelas publik HelloWorldAction {
waktu pembuatan Tanggal pribadi;
Tanggal publik getCreatetime() {
kembalikan waktu pembuatan;
}
public void setCreatetime(Tanggal waktu pembuatan) {
this.createtime = waktu pembuatan;
}
}
kelas publik DateConverter memperluas DefaultTypeConverter {
@Override public Object convertValue(Konteks peta, Nilai objek, Kelas toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
mencoba {
if(toType == Date.class){//Saat string dikonversi ke tipe Tanggal
String[] params = (String[]) nilai;// Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//Saat Tanggal diubah menjadi string
Tanggal tanggal = nilai (Tanggal);
return dateFormat.format(tanggal);
}
} tangkapan (ParseException e) {}
kembalikan nol;
}
}
Daftarkan konverter tipe di atas sebagai konverter tipe lokal:
Tempatkan file ActionClassName-conversion.properties di bawah paket tempat kelas Action berada. ActionClassName adalah nama kelas Action, dan -conversion.properties berikut adalah metode penulisan tetap Properti HelloWorldAction-conversion. Isi dalam file properti adalah:
Nama properti = Nama kelas lengkap dari tipe converter Untuk contoh ini, isi file HelloWorldAction-conversion.properties adalah:
waktu buat= cn.csdn.konversi.DateConverter
Daftarkan konverter tipe di atas sebagai konverter tipe global:
Tempatkan file xwork-conversion.properties di bawah WEB-INF/classes. Isi dalam file properti adalah:
Tipe yang akan dikonversi = nama kelas yang sepenuhnya memenuhi syarat dari tipe konverter. Untuk contoh ini, isi file xwork-conversion.properties adalah:
java.util.Date= cn.csdnconversion.DateConverter