Bukanlah hal yang sangat merepotkan untuk mewujudkan tampilan bilah kemajuan tanpa penyegaran halaman di halaman web, tetapi jika bilah kemajuan dapat secara akurat mencerminkan transaksi saat ini atau kemajuan eksekusi logika yang kompleks, maka itu bukanlah tugas yang mudah Teknologi AJAX Populer, jadi penulis artikel ini mencoba menggunakan AJAX untuk mewujudkan bilah kemajuan halaman web yang akurat untuk menarik pembaca.
Pertama-tama, Anda harus memikirkan suatu masalah. Jika transaksi kompleks atau logika bisnis tidak dijalankan secara thread, tidak mungkin melewatkan transaksi kompleks untuk memproses tampilan kemajuan saat dijalankan di JAVA untuk memikirkan penggunaan multi-threading untuk mencapai transaksi kompleks atau logika bisnis.
Memikirkan pertanyaan lain, pemrosesan transaksi harus memerlukan serangkaian informasi parameter di halaman web, jadi bagaimana cara mendapatkan parameter ini? Tampaknya mudah untuk dipikirkan, cukup berikan HttpServletRequest.
Untuk berbagi bilah kemajuan, semua pemrosesan transaksi yang kompleks harus mengimplementasikan antarmuka atau kelas abstrak yang sama. Saya menggunakan antarmuka di sini, sebagai berikut:
antarmuka publik IprogressBar {
eksekusi kekosongan publik (permintaan HttpServletRequest, String pbid); // Jalankan transaksi kompleks
}
Gunakan kelas abstrak untuk mengimplementasikan multi-threading, sebagai berikut:
kelas abstrak publik AbstrakProgressBar memperluas TimerTask mengimplementasikan IprogressBar {
permintaan HttpServletRequest pribadi;
String pbid pribadi;
AbstrakProgressBar publik(){
}
//Subkelas harus mengesampingkan fungsi ini
public abstract void eksekusi (permintaan HttpServletRequest, String pbid);
menjalankan kekosongan publik() {
jalankan(permintaan,pbid);
}
public void setRequest(permintaan HttpServletRequest){
this.request=permintaan;
}
kekosongan publik setPbid(String pbid){
this.pbid=pbid;
}
}
Memberikan kode untuk proyek tertentu tidak nyaman. Di sini saya menulis kelas pengujian lain, yaitu kelas yang melakukan pemrosesan transaksi yang kompleks, sebagai berikut:
kelas publik TestPB memperluas AbstrakProgressBar{
eksekusi kekosongan publik(permintaan HttpServletRequest, String pbid) {
String sql="masukkan ke dalam temp_table(idx)values(?)";
int pid=Bilangan Bulat.parseInt(pbid);
ProgressBar pb=ProgressBar baru(pid,300,0,1);
//Simulasikan transaksi besar
untuk(int i=0;i<300;i++){
DbUtils.executeUpdate(sql,Objek baru[]{Integer baru(i)});
//Kontrol kemajuan
pb.stepIt();
}
}
}
Kemudian gunakan teknologi AJAX untuk mewujudkan bilah kemajuan non-refresh pada halaman web. Kodenya adalah sebagai berikut:
<%@ halaman contentType="text/html;charset=UTF-8"%>
<title>Tidak ada pengujian bilah kemajuan halaman penyegaran</title>
<JENIS GAYA="teks/css">
<!--
BODY {OVERFLOW:gulir;OVERFLOW-X:tersembunyi}
.DEK {POSITION:absolute;VISIBILITY:hidden;Z-INDEX:200;}
//-->
</GAYA>
<skrip tipe="teks/javascript">
var xmlHttp;
var pbid;//ID bilah kemajuan
fungsi buatXMLHttpRequest(){
if (jendela.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (jendela.XMLHttpRequest) {
xmlHttp = XMLHttpRequest baru();
}
}
fungsi checkDiv() {
var progress_bar = dokumen.getElementById("progressBar");
if (progress_bar.style.visibility != "terlihat") {
progres_bar.gaya.visibilitas = "terlihat";
}kalau tidak
{
progres_bar.gaya.visibilitas = "tersembunyi";
}
}
fungsi pergi() {
buatXMLHttpRequest();
periksaDiv();
var url = "../servlet/ProgressBarServlet?task=create&impcls=blogcn.pb.imp.TestPB";//di mana blogcn.pb.imp.TestPB adalah kelas implementasi transaksi kompleks
var tombol = document.getElementById("pergi");
tombol.disabled = true;
xmlHttp.open("GET", url, benar);
xmlHttp.setRequestHeader("Tipe Konten", "teks/xml;charset=gb2312");
xmlHttp.onreadystatechange = goCallback;
xmlHttp.kirim(null);
}
fungsi goCallback(){
jika (xmlHttp.readyState==4)
{
jika (xmlHttp.status==200) {
pbid=xmlHttp.responseXML.getElementsByTagName("pbid")[0].firstChild.data;
setTimeout("pollServer()", 2000);
}
}
}
fungsi jajak pendapatServer() {
buatXMLHttpRequest();
var url = "../servlet/ProgressBarServlet?task=poll&pbid="+pbid;
xmlHttp.open("GET", url, benar);
xmlHttp.onreadystatechange = pollCallback;
xmlHttp.kirim(null);
}
fungsi pollCallback(){
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var persen_lengkap =
xmlHttp.responseXML
.getElementsByTagName("persen")[0].firstChild.data;
if (persen_lengkap < 100) {
PB1.pos=persen_lengkap;
PB1.Pembaruan();
setTimeout("pollServer()", 2000);
} kalau tidak {
PB1.pos=100;
PB1.Pembaruan();
document.getElementById("go").disabled = false;
}
}
}
}
<input type="button" value="Jalankan transaksi besar" id="go" onclick="go();"/>
<DIV id="progressBar">
<skrip bahasa="javascript">
var PB1=TProgressBar baru("PB1 saya",220,180,375,20);
PB1.Buat();
Jumlah Bajak Laut=100;
PID=Hitungan Bajak Laut-2;
PB1.Reposisi();
PB1.max=PID;