Struktur proyek:
Beranda proyek:
Halaman pendaftaran:
Unggah gambar:
Gambar efek satu:
Gambar efek dua:
Gambar efek tiga:
==================== ===========
Di bawah ini adalah bagian kodenya
==================== ===========
Basis data SQL diperlukan:
membuat basis data db_ajax;
gunakan db_ajax;
membuat tabel user_table
(
user_id ke dalam kunci utama kenaikan_otomatis,
nama varchar(255) unik,
lulus varchar(255)
);
buat tabel photo_table
(
photo_id ke dalam kunci utama kenaikan_otomatis,
judul varchar(255),
namafile varchar(255),
pemilik_id ke dalam,
kunci asing (owner_id) referensi user_table (user_id)
);
<div id="uploadDiv" style="display:none">
<formulir tindakan="proUpload" metode="posting"
enctype="multipart/form-data">
<tabel cellpacing="1" cellpadding="10">
<caption>Unggah gambar</caption>
<tr>
<td>Judul gambar:</td>
<td><input id="title" name="title" type="text" /></td>
</tr>
<tr>
<td>Jelajahi gambar:</td>
<td><input id="file" name="file" type="file" /></td>
</tr>
<tr>
<td colspan="2" align="tengah">
<input type="kirim" value="Unggah" />
<input type="reset" value="Reset" />
</td>
</tr>
</tabel>
</bentuk>
</div>
<div id="tipDiv" style="display:none">
</div>
</tubuh>
</html>
<!-- Konfigurasikan container Spring untuk dimuat saat aplikasi web dimulai -->
<pendengar>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</pendengar>
<servlet>
<servlet-name>proLogin</servlet-name>
<servlet-class>com.b510.album.web.ProLoginServlet</servlet-class>
</servlet>
<pemetaan-servlet>
<servlet-name>proLogin</servlet-name>
<url-pattern>/proLogin</url-pattern>
</pemetaan-servlet>
<servlet>
<servlet-name>proRegist</servlet-name>
<servlet-class>com.b510.album.web.ProRegistServlet</servlet-class>
</servlet>
<pemetaan-servlet>
<servlet-name>proRegist</servlet-name>
<url-pattern>/proRegist</url-pattern>
</pemetaan-servlet>
<servlet>
<servlet-name>validateName</servlet-name>
<servlet-class>com.b510.album.web.ValidateNameServlet</servlet-class>
</servlet>
<pemetaan-servlet>
<servlet-name>validateName</servlet-name>
<url-pattern>/validateName</url-pattern>
</pemetaan-servlet>
<servlet>
<servlet-name>getPhoto</servlet-name>
<servlet-class>com.b510.album.web.GetPhotoServlet</servlet-class>
</servlet>
<pemetaan-servlet>
<servlet-name>getPhoto</servlet-name>
<url-pattern>/getPhoto</url-pattern>
</pemetaan-servlet>
<servlet>
<servlet-name>showImg</servlet-name>
<servlet-class>com.b510.album.web.ShowImgServlet</servlet-class>
</servlet>
<pemetaan-servlet>
<servlet-name>showImg</servlet-name>
<url-pattern>/showImg</url-pattern>
</pemetaan-servlet>
<servlet>
<servlet-name>pageLoad</servlet-name>
<servlet-class>com.b510.album.web.PageLoadServlet</servlet-class>
</servlet>
<pemetaan-servlet>
<servlet-name>pageLoad</servlet-name>
<url-pattern>/pageLoad</url-pattern>
</pemetaan-servlet>
<servlet>
<servlet-name>turnPage</servlet-name>
<servlet-class>com.b510.album.web.TurnPageServlet</servlet-class>
</servlet>
<pemetaan-servlet>
<servlet-name>turnPage</servlet-name>
<url-pattern>/turnPage</url-pattern>
</pemetaan-servlet>
<servlet>
<servlet-name>proUpload</servlet-name>
<servlet-class>com.b510.album.web.ProUploadServlet</servlet-class>
</servlet>
<pemetaan-servlet>
<servlet-name>proUpload</servlet-name>
<url-pattern>/proUpload</url-pattern>
</pemetaan-servlet>
<daftar-file-selamat datang>
<file-selamat datang>album.html</file-selamat datang>
</daftar-file-selamat datang>
</aplikasi web>
<!-- Tentukan sumber data Bean, diimplementasikan menggunakan sumber data C3P0 -->
<bean id="dataSource" metode penghancuran="tutup"
>
<!-- Tentukan driver untuk terhubung ke database -->
<nama properti="driverClass" value="com.mysql.jdbc.Driver"/>
<!-- Tentukan URL untuk terhubung ke database -->
<nama properti="jdbcUrl"
nilai="jdbc:mysql://localhost:3308/db_ajax"/>
<!-- Tentukan nama pengguna untuk terhubung ke database -->
<nama properti="pengguna" nilai="root"/>
<!-- Tentukan kata sandi untuk terhubung ke database -->
<nama properti="kata sandi" nilai="root"/>
<!--Tentukan jumlah maksimum koneksi ke kumpulan koneksi database-->
<nama properti="maxPoolSize" value="40"/>
<!-- Tentukan jumlah minimum koneksi untuk terhubung ke kumpulan koneksi database -->
<nama properti="minPoolSize" value="1"/>
<!-- Tentukan jumlah koneksi awal yang akan dihubungkan ke kumpulan koneksi database -->
<nama properti="initialPoolSize" value="1"/>
<!-- Tentukan waktu idle maksimum untuk koneksi ke kumpulan koneksi database -->
<nama properti="maxIdleTime" value="20"/>
</kacang>
<!-- Tentukan SessionFactory Hibernate -->
<bean id="sessionFactory"
>
<!-- Sumber data injeksi ketergantungan, masukkan sumber data yang ditentukan di atas -->
<nama properti="dataSource" ref="dataSource"/>
<!-- Atribut mapResouces digunakan untuk mencantumkan semua file pemetaan -->
<nama properti="mappingResources">
<daftar>
<!-- Berikut ini digunakan untuk membuat daftar file pemetaan Hibernasi-->
<value>com/b510/album/model/User.hbm.xml</value>
<value>com/b510/album/model/Photo.hbm.xml</value>
</daftar>
</properti>
<!-- Mendefinisikan properti SessionFactory Hibernate -->
<nama properti="hibernateProperties">
<alat peraga>
<!--Tentukan dialek basis data-->
<prop key="hibernate.dialek">
org.hibernate.dialect.MySQLInnoDBDialect</prop>
<!-- Apakah akan otomatis membuat database setiap kali diperlukan -->
<prop key="hibernate.hbm2ddl.auto">perbarui</prop>
<!-- Menampilkan SQL yang dihasilkan oleh operasi persistensi Hibernate -->
<prop key="hibernate.show_sql">benar</prop>
<!-- Format skrip SQL lalu keluarkan -->
<prop key="hibernate.format_sql">benar</prop>
</alat peraga>
</properti>
</kacang>
<!-- Konfigurasikan komponen UserDao -->
<bean id="penggunaDao"
>
<!--Menyuntikkan referensi SessionFactory-->
<nama properti="sessionFactory" ref="sessionFactory"/>
</kacang>
<!-- Konfigurasikan komponen PhotoDao -->
<bean id="photoDao"
>
<nama properti="sessionFactory" ref="sessionFactory"/>
</kacang>
<!-- Konfigurasikan komponen logika bisnis albumService -->
<bean id="albumLayanan"
>
<!-- Memasukkan 2 komponen DAO ke dalam komponen logika bisnis -->
<nama properti="userDao" ref="userDao"/>
<nama properti="photoDao" ref="photoDao"/>
</kacang>
<!-- Konfigurasikan manajer transaksi lokal Hibernate, gunakan kelas HibernateTransactionManager -->
<!-- Kelas ini mengimplementasikan antarmuka PlatformTransactionManager, yang merupakan implementasi khusus untuk Hibernate -->
<bean id="Manajer Transaksi"
>
<!-- Saat mengonfigurasi HibernateTransactionManager, Anda perlu memasukkan referensi ke SessionFactory -->
<nama properti="sessionFactory" ref="sessionFactory"/>
</kacang>
<!-- Konfigurasikan aspek transaksi Bean dan tentukan manajer transaksi -->
<tx:advice id="txAdvice" manajer-transaksi="transactionManager">
<!-- Digunakan untuk mengonfigurasi semantik transaksi terperinci-->
<tx:atribut>
<!-- Semua metode yang dimulai dengan 'get' bersifat hanya baca -->
<tx:nama metode="dapatkan*" hanya-baca="benar"/>
<!-- Metode lain menggunakan pengaturan transaksi default -->
<tx:nama metode="*"/>
</tx:atribut>
</tx:saran>
<aop:konfigurasi>
<!-- Konfigurasikan pointcut agar cocok dengan semua metode yang dieksekusi oleh semua kelas yang diakhiri dengan Impl di bawah paket lee -->
<aop:pointcut id="leeService"
ekspresi="eksekusi(* com.b510.album.service.impl.*Impl.*(..))"/>
<!-- Tentukan untuk menerapkan aspek transaksi txAdvice di titik masuk leeService -->
<aop: saran penasihat-ref="txAdvice"
pointcut-ref="leeService"/>
</aop:konfigurasi>
</kacang>
pengaturan ulang fungsi()
{
//Hapus dua baris kotak teks pengguna dan pass
$("#pengguna").val("");
$("#pass").val("");
}
//Beralih ke kotak dialog registrasi
perubahan fungsiRegist()
{
//Sembunyikan dua tombol untuk login
$("#loginDiv").sembunyikan("500");
//Tampilkan dua tombol untuk registrasi
$("#registDiv").show("500");
}
//Fungsi untuk menangani login pengguna
fungsi proLogin()
{
//Dapatkan nilai dari dua kotak teks user dan pass
var pengguna = $.trim($("#pengguna").val());
var lulus = $.trim($("#pass").val());
jika (pengguna == null || pengguna == ""
||.lulus == batal||.lulus == "")
{
alert("Anda harus memasukkan nama pengguna dan kata sandi Anda sebelum dapat login");
kembali salah;
}
kalau tidak
{
//Kirim permintaan POST asinkron ke proLogin
$.post("proLogin", $('#pengguna,#pass').serializeArray()
, null , "skrip");
}
}
//Fungsi yang menangani registrasi pengguna
daftar fungsi()
{
//Dapatkan nilai dari dua kotak teks user dan pass
var pengguna = $.trim($("#pengguna").val());
var lulus = $.trim($("#pass").val());
if (pengguna == null || pengguna == "" || lulus == null || lulus =="")
{
alert("Anda harus memasukkan nama pengguna dan kata sandi Anda sebelum mendaftar");
kembali salah;
}
kalau tidak
{
//Kirim permintaan POST asinkron ke proRegist
$.post("proRegist", $('#pengguna,#pass').serializeArray()
, null , "skrip");
}
}
//Verifikasi apakah nama pengguna tersedia
fungsi validasiNama()
{
//Dapatkan nilai kotak teks pengguna
var pengguna = $.trim($("#pengguna").val());
jika (pengguna == null || pengguna == "")
{
alert("Anda belum memasukkan nama pengguna Anda!");
kembali salah;
}
kalau tidak
{
//Kirim permintaan POST asinkron ke validasiName
$.post("validateName", $('#pengguna').serializeArray()
, null , "skrip");
}
}
// Dapatkan foto pengguna dan halaman saat ini secara berkala
fungsi onLoadHandler()
{
//Kirim permintaan asinkron, DAPATKAN ke getPhoto
$.getScript("getFoto");
//Jalankan metode ini lagi setelah menentukan 1 detik
setTimeout("onLoadHandler()", 1000);
}
//menampilkan foto
fungsi showImg(Namafile)
{
$.getScript("showImg?img=" + Namafile);
// document.getElementById("show").src="uploadfiles/" + Namafile + "?now=" + Tanggal baru();
// $("#show").attr("src" , "uploadfiles/" + Namafile);
}
//Fungsi untuk menangani pembalikan halaman
fungsi turnPage (bendera)
{
$.getScript("turnPage?turn=" + bendera);
}
//Buka jendela unggah
fungsi unggah terbuka()
{
$("#uploadDiv").tampilkan()
.dialog(
{
modal: benar,
dapat diubah ukurannya: salah,
lebar: 428,
tinggi: 220,
hamparan: {opasitas: 0,5 , latar belakang: "hitam"}
});
}
impor javax.servlet.ServletConfig;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServlet;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
impor com.b510.album.service.AlbumService;
/**
*
* @penulis Hongten
*
*/
kelas publik BaseServlet memperluas HttpServlet {
serialVersionUID panjang akhir statis pribadi = -2041755371540813745L;
AlbumService dilindungi sebagai;
//Tentukan konstruktor dan dapatkan referensi ke container Spring
public void init (konfigurasi ServletConfig) menampilkan ServletException {
super.init(konfigurasi);
ApplicationContext ctx = WebApplicationContextUtils
.getWebApplicationContext(getServletContext());
as = (AlbumService) ctx.getBean("albumService");
}
}
impor java.io.IOException;
impor java.io.PrintWriter;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
impor com.b510.album.Exception.AlbumException;
impor com.b510.album.web.base.BaseServlet;
/**
*
* @penulis Hongten
*
*/
kelas publik ValidateNameServlet memperluas BaseServlet {
serialVersionUID panjang akhir statis pribadi = 9038839276327742641L;
layanan kekosongan publik (permintaan HttpServletRequest, respons HttpServletResponse)
melempar IOException, ServletException {
String nama = permintaan.getParameter("pengguna");
respon.setContentType("teks/javascript;charset=GBK");
// Dapatkan aliran keluaran
PrintWriter keluar = respon.getWriter();
mencoba {
jika (nama != nol) {
if (as.validateName(nama)) {
out.println("alert('Selamat, nama pengguna ini belum digunakan, Anda dapat menggunakan nama pengguna ini!');");
} kalau tidak {
out.println("alert('Maaf, nama pengguna ini sudah dipakai orang lain!');");
keluar.println("$('#pengguna').val('');");
}
} kalau tidak {
out.println("alert('Terjadi pengecualian saat memverifikasi nama pengguna, harap ubah nama pengguna dan coba lagi!');");
}
} tangkapan (AlbumException ex) {
out.println("alert('" + ex.getMessage() + "Silakan ubah nama pengguna Anda dan coba lagi!');");
}
}
}
impor java.io.IOException;
impor java.io.PrintWriter;
impor java.util.List;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
impor javax.servlet.http.HttpSession;
import com.b510.album.Exception.AlbumException;
impor com.b510.album.vo.PhotoHolder;
impor com.b510.album.web.base.BaseServlet;
/**
*
* @penulis Hongten
*
*/
kelas publik TurnPageServlet memperluas BaseServlet {
serialVersionUID panjang akhir statis pribadi = -5097286750384714951L;
layanan kekosongan publik (permintaan HttpServletRequest, respons HttpServletResponse)
melempar IOException, ServletException {
String giliran = permintaan.getParameter("putaran");
Sesi HttpSession = request.getSession(true);
Nama string = (String) session.getAttribute("curUser");
Objek pageObj = session.getAttribute("curPage");
// Jika curPage di HttpSession adalah null, setel halaman saat ini ke halaman pertama
int curPage = pageObj == null 1 : (Bilangan Bulat) pageObj;
respon.setContentType("teks/javascript;charset=GBK");
PrintWriter keluar = respon.getWriter();
if (curPage == 1 && turn.equals("-1")) {
out.println("alert('Sekarang halaman pertama, halaman tidak dapat maju!')");
} kalau tidak {
// Jalankan pembalikan halaman dan ubah nilai curPage.
curPage += Integer.parseInt(putar);
mencoba {
Daftar<PhotoHolder> foto = as.getPhotoByUser(nama, halaman sekarang);
// Tidak ada catatan setelah membalik halaman
if (foto.ukuran() == 0) {
out.println("alert('Tidak ditemukan rekaman foto setelah membalik halaman, sistem akan otomatis kembali ke halaman sebelumnya')");
//Kembali ke halaman sebelumnya
curPage -= Integer.parseInt(putar);
} kalau tidak {
//Masukkan nomor halaman yang sedang dijelajahi pengguna ke dalam HttpSession
session.setAttribute("CurPage", CurPage);
}
} tangkapan (AlbumException ex) {
out.println("alert('" + ex.getMessage() + "Silakan coba lagi!')");
}
}
}
}
impor java.io.IOException;
impor java.io.PrintWriter;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
impor javax.servlet.http.HttpSession;
impor com.b510.album.web.base.BaseServlet;
/**
*
* @penulis Hongten
*
*/
kelas publik ShowImgServlet memperluas BaseServlet {
serialVersionUID panjang akhir statis pribadi = 1460203270448078666L;
layanan kekosongan publik (permintaan HttpServletRequest, respons HttpServletResponse)
melempar IOException, ServletException {
String img = permintaan.getParameter("img");
Sesi HttpSession = request.getSession(true);
//Masukkan gambar yang sedang dijelajahi pengguna ke dalam HttpSession.
sesi.setAttribute("curImg", img);
respon.setContentType("teks/javascript;charset=GBK");
// Dapatkan aliran keluaran
PrintWriter keluar = respon.getWriter();
out.println("$('#show').attr('src' , 'uploadfiles/" + img + "');");
}
}
impor java.io.FileOutputStream;
impor java.io.IOException;
impor java.io.InputStream;
impor java.io.PrintWriter;
impor java.util.Iterator;
impor java.util.List;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
impor com.b510.album.Exception.AlbumException;
impor com.b510.album.web.base.BaseServlet;
/**
*
* @penulis Hongten
*
*/
@SuppressWarnings("tidak dicentang")
kelas publik ProUploadServlet memperluas BaseServlet {
serial panjang akhir statis pribadiVersionUID = 642229801989188793L;
layanan kekosongan publik (permintaan HttpServletRequest, respons HttpServletResponse)
melempar IOException, ServletException {
Pengulang iter = null;
Judul string = null;
respon.setContentType("teks/html;charset=GBK");
// Dapatkan aliran keluaran
PrintWriter keluar = respon.getWriter();
out.println("<tipe skrip='teks/javascript>'");
mencoba {
//Gunakan Pengunggah untuk menangani unggahan
Pabrik FileItemFactory = DiskFileItemFactory baru();
Unggahan ServletFileUpload = ServletFileUpload baru (pabrik);
Item daftar = upload.parseRequest(permintaan);
iter = item.iterator();
// Lintasi konten yang sesuai dengan setiap kontrol formulir
while (iter.hasNext()) {
Barang FileItem = (Item File) iter.next();
// Jika itemnya adalah bidang formulir normal
if (item.isFormField()) {
Nama string = item.getFieldName();
if (nama.sama dengan("judul")) {
judul = item.getString("GBK");
}
}
// Jika itu adalah file yang perlu diunggah
kalau tidak {
String pengguna = (String) permintaan.getSession().getAttribute(
"pengguna saat ini");
String serverFileName = nol;
//mengembalikan nama file
String nama file = item.getName();
// Dapatkan akhiran file
String appden = namafile.substring(namafile
.lastIndexOf("."));
//mengembalikan jenis file
String contentType = item.getContentType();
// Hanya gambar jpg, gif, dan png yang boleh diunggah
if (contentType.equals("gambar/pjpeg")
||.contentType.equals("gambar/gif")
||.contentType.equals("gambar/jpeg")
||.contentType.equals("gambar/png")) {
InputStream masukan = item.getInputStream();
serverFileName = String.valueOf(System
.currentTimeMillis());
Keluaran FileOutputStream = FileOutputStream baru(
getServletContext().getRealPath("/")
+ "uploadfiles //" + serverFileName
+ tambahkan);
byte[] penyangga = byte baru[1024];
int len = 0;
while ((len = input.read(buffer)) > 0) {
keluaran.tulis(buffer, 0, len);
}
masukan.tutup();
keluaran.close();
as.addPhoto(pengguna, judul, serverFileName + appden);
respon.sendRedirect("album.html?resultCode=0");
} kalau tidak {
respon.sendRedirect("album.html?resultCode=1");
}
}
}
} catch (FileUploadException bahan bakar) {
fue.printStackTrace();
respon.sendRedirect("album.html?resultCode=2");
} tangkapan (AlbumException ex) {
ex.printStackTrace();
}
}
}
impor java.io.IOException;
impor java.io.PrintWriter;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
impor javax.servlet.http.HttpSession;
impor com.b510.album.Exception.AlbumException;
impor com.b510.album.web.base.BaseServlet;
/**
*
* @penulis Hongten
*
*/
kelas publik ProRegistServlet memperluas BaseServlet {
serialVersionUID panjang akhir statis pribadi = -3174994243043815566L;
layanan kekosongan publik (permintaan HttpServletRequest, respons HttpServletResponse)
melempar IOException, ServletException {
String nama = permintaan.getParameter("pengguna");
String lulus = permintaan.getParameter("lulus");
respon.setContentType("teks/javascript;charset=GBK");
// Dapatkan aliran keluaran
PrintWriter keluar = respon.getWriter();
mencoba {
out.println("$('#pengguna,#pass').val('');");
if (nama != null && pass != null && as.registUser(nama, pass) > 0) {
Sesi HttpSession = request.getSession(true);
session.setAttribute("curUser", nama);
out.println("alert('Selamat, Anda telah berhasil mendaftar!');");
keluar.println("$('#noLogin').hide(500);");
keluar.println("$('#hasLogin').show(500);");
//Panggil metode untuk mendapatkan daftar foto
keluar.println("onLoadHandler();");
} kalau tidak {
out.println("alert('Pendaftaran Anda gagal, silakan pilih nama pengguna yang sesuai dan coba lagi!');");
}
} tangkapan (AlbumException ex) {
out.println("alert('" + ex.getMessage() + "Silakan ubah nama pengguna Anda dan coba lagi!');");
}
}
}
impor java.io.IOException;
impor java.io.PrintWriter;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
impor javax.servlet.http.HttpSession;
import com.b510.album.Exception.AlbumException;
impor com.b510.album.web.base.BaseServlet;
/**
*
* @penulis Hongten
*
*/
kelas publik ProLoginServlet memperluas BaseServlet {
serialVersionUID panjang akhir statis pribadi = -1253530202224049958L;
layanan kekosongan publik (permintaan HttpServletRequest, respons HttpServletResponse)
melempar IOException, ServletException {
String nama = permintaan.getParameter("pengguna");
String lulus = permintaan.getParameter("lulus");
respon.setContentType("teks/javascript;charset=GBK");
// Dapatkan aliran keluaran
PrintWriter keluar = respon.getWriter();
mencoba {
// Kosongkan isi kotak input dengan ID pengguna dan pass
out.println("$('#pengguna,#pass').val('');");
if (nama != null && lulus != null && as.userLogin(nama, lulus)) {
Sesi HttpSession = request.getSession(true);
session.setAttribute("curUser", nama);
out.println("alert('Anda berhasil login!')");
keluar.println("$('#noLogin').hide(500)");
keluar.println("$('#hasLogin').show(500)");
//Panggil metode untuk mendapatkan daftar foto
keluar.println("onLoadHandler();");
} kalau tidak {
out.println("alert('Nama pengguna dan kata sandi yang Anda masukkan tidak cocok, silakan coba lagi!')");
}
} tangkapan (AlbumException ex) {
out.println("alert('" + ex.getMessage() + "Silakan ubah nama pengguna dan kata sandi Anda dan coba lagi!')");
}
}
}
impor java.io.IOException;
impor java.io.PrintWriter;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
impor javax.servlet.http.HttpSession;
impor com.b510.album.web.base.BaseServlet;
/**
*
* @penulis Hongten
*
*/
kelas publik PageLoadServlet memperluas BaseServlet {
serialVersionUID panjang akhir statis pribadi = 7512001492425261841L;
layanan kekosongan publik (permintaan HttpServletRequest, respons HttpServletResponse)
melempar IOException, ServletException {
respon.setContentType("teks/javascript;charset=GBK");
// Dapatkan aliran keluaran
PrintWriter keluar = respon.getWriter();
Sesi HttpSession = request.getSession(true);
Nama string = (String) session.getAttribute("curUser");
// Jika nama bukan null, ini menunjukkan bahwa pengguna telah login
jika (nama != nol) {
//Sembunyikan elemen dengan id noLogin (panel login pengguna)
keluar.println("$('#noLogin').hide()");
//Sembunyikan elemen dengan id hasLogin (Panel Kontrol Pengguna)
keluar.println("$('#hasLogin').show()");
//Panggil metode untuk mendapatkan daftar foto
keluar.println("onLoadHandler();");
// Keluarkan atribut curImg di HttpSession
String curImg = (String) sesi.getAttribute("curImg");
//Menampilkan ulang foto yang sedang dijelajahi pengguna
jika (curImg != null) {
keluar.println("$('#show').attr('src' , 'uploadfiles/" + curImg
+ "');");
}
}
}
}
impor java.io.IOException;
impor java.io.PrintWriter;
impor java.util.List;
impor javax.servlet.ServletException;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
impor javax.servlet.http.HttpSession;
impor com.b510.album.Exception.AlbumException;
impor com.b510.album.vo.PhotoHolder;
impor com.b510.album.web.base.BaseServlet;
/**
*
* @penulis Hongten
*
*/
kelas publik GetPhotoServlet memperluas BaseServlet {
serialVersionUID panjang akhir statis pribadi = -8380695760546582385L;
layanan kekosongan publik (permintaan HttpServletRequest, respons HttpServletResponse)
melempar IOException, ServletException {
Sesi HttpSession = request.getSession(true);
// Dapatkan nomor halaman saat ini dari pengguna saat ini dan daftar foto sistem dari HttpSession
Nama string = (String) session.getAttribute("curUser");
Objek pageObj = session.getAttribute("curPage");
// Jika curPage di HttpSession adalah null, setel halaman saat ini ke halaman pertama
int curPage = pageObj == null 1 : (Bilangan Bulat) pageObj;
respon.setContentType("teks/javascript;charset=GBK");
// Dapatkan aliran keluaran
PrintWriter keluar = respon.getWriter();
mencoba {
Daftar<PhotoHolder> foto = as.getPhotoByUser(nama, halaman sekarang);
// Hapus elemen dengan id daftar
out.println("var daftar = $('#daftar').kosong();");
untuk (PH Holder Foto : foto) {
// Tambahkan setiap foto secara dinamis ke elemen dengan id daftar
out.println("daftar.tambahkan(/"<div align='center'>"
+ "<a href='javascript:void(0)' onclick=///"showImg('"
+ ph.getFileName() + "');///">" + ph.getTitle()
+ "</a></div>/");");
}
} tangkapan (AlbumException ex) {
out.println("alert('" + ex.getMessage() + "Silakan coba lagi!')");
}
}
}
/**
*
* @penulis Hongten
*
*/
Pemegang Foto kelas publik {
//Nama foto
judul String pribadi;
//Nama file foto di server
Nama file String pribadi;
// Konstruktor tanpa parameter
Pemegang Foto publik() {
}
// Konstruktor untuk menginisialisasi semua properti
public PhotoHolder(String judul, String fileName) {
this.title = judul;
this.namafile = namafile;
}
//Metode penyetel dan pengambil atribut title
public void setTitle(String judul) {
this.title = judul;
}
String publik getTitle() {
kembalikan this.title;
}
//Metode penyetel dan pengambil atribut namafile
public void setFileName(String nama file) {
this.namafile = namafile;
}
String publik getFileName() {
kembalikan ini.namafile;
}
}
impor java.util.ArrayList;
impor java.util.List;
impor com.b510.album.dao.PhotoDao;
impor com.b510.album.dao.UserDao;
import com.b510.album.Exception.AlbumException;
impor com.b510.album.model.Foto;
impor com.b510.album.model.User;
impor com.b510.album.service.AlbumService;
impor com.b510.album.vo.PhotoHolder;
/**
*
* @penulis Hongten
*
*/
kelas publik AlbumServiceImpl mengimplementasikan AlbumService {
// 2 komponen DAO yang bergantung pada komponen logika bisnis
pribadi UserDao ud = null;
FotoDao pribadi pd = null;
// Injeksi ketergantungan metode penyetel yang diperlukan oleh 2 komponen DAO
public void setUserDao(UserDao ud) {
ini.ud = ud;
}
public void setPhotoDao(PhotoDao pd) {
ini.pd = pd;
}
/**
* Verifikasi apakah login pengguna berhasil.
*
* @nama param
* Masuk nama pengguna
* @param lulus
* Kata sandi masuk
* @return Hasil login pengguna, mengembalikan nilai true jika berhasil, jika tidak mengembalikan false
*/
public boolean userLogin(Nama string, String pass) {
mencoba {
// Gunakan UserDao untuk menanyakan pengguna berdasarkan nama pengguna
Pengguna u = ud.findByName(nama);
jika (u != null && u.getPass().equals(lulus)) {
kembali benar;
}
kembali salah;
} catch (Pengecualian misalnya) {
ex.printStackTrace();
throw new AlbumException("Terjadi pengecualian saat memproses login pengguna!");
}
}
/**
* Daftarkan pengguna baru
*
* @nama param
* Nama pengguna pengguna yang baru terdaftar
* @param lulus
* Kata sandi untuk pengguna yang baru terdaftar
* @return kunci utama pengguna yang baru terdaftar
*/
public int registUser(Nama string, String pass) {
mencoba {
//Buat instance Pengguna baru
Pengguna u = Pengguna baru();
u.setName(nama);
u.setPass(lulus);
// Pertahankan objek Pengguna
ud.simpan(u);
kembalikan u.getId();
} catch (Pengecualian misalnya) {
ex.printStackTrace();
throw new AlbumException("Terjadi pengecualian saat pendaftaran pengguna baru!");
}
}
/**
* Tambahkan foto
*
* @param pengguna
* Pengguna yang menambahkan foto
* @judul param
* Tambahkan judul ke foto Anda
* @paramnamafile
* Tambahkan nama file foto di server
* @return Kunci utama dari foto yang baru ditambahkan
*/
public int addPhoto(String pengguna, String judul, String nama file) {
mencoba {
//Buat contoh Foto baru
Foto p = Foto baru();
p.setTitle(judul);
p.setFileName(namafile);
p.setUser(ud.findByName(pengguna));
// Contoh Foto Persisten
pd.simpan(p);
kembalikan p.getId();
} catch (Pengecualian misalnya) {
ex.printStackTrace();
throw new AlbumException("Terjadi pengecualian saat menambahkan foto!");
}
}
/**
* Dapatkan semua foto pengguna berdasarkan pengguna
*
* @param pengguna
* Pengguna saat ini
* @param halamanNo
*Nomor halaman
* @return Mengembalikan foto milik pengguna dan halaman yang ditentukan
*/
Daftar publik<PhotoHolder> getPhotoByUser(String pengguna, int pageNo) {
mencoba {
Daftar<Foto> pl = pd.findByUser(ud.findByName(pengguna), pageNo);
Daftar<PhotoHolder> hasil = ArrayList<PhotoHolder>() baru;
untuk (Foto p : tolong) {
hasil.tambahkan(Pemegang Foto baru(p.getTitle(), p.getFileName()));
}
hasil pengembalian;
} catch (Pengecualian misalnya) {
ex.printStackTrace();
throw new AlbumException("Terjadi pengecualian saat menanyakan daftar foto!");
}
}
/**
* Verifikasi apakah nama pengguna tersedia, yaitu apakah nama pengguna sudah ada di database
*
* @nama param
* Nama pengguna yang perlu diverifikasi
* @return Mengembalikan nilai benar jika nama pengguna tersedia, jika tidak, mengembalikan nilai salah.
*/
validasi boolean publikNama(Nama string) {
mencoba {
// Kueri instance Pengguna terkait berdasarkan nama pengguna
Pengguna u = ud.findByName(nama);
jika (kamu != nol) {
kembali salah;
}
kembali benar;
} catch (Pengecualian misalnya) {
ex.printStackTrace();
throw new AlbumException("Terjadi pengecualian selama proses verifikasi apakah nama pengguna ada!");
}
}
}
impor java.util.List;
impor com.b510.album.vo.PhotoHolder;
/**
*
* @penulis Hongten
*
*/
antarmuka publik Layanan Album {
/**
* Verifikasi apakah login pengguna berhasil.
*
* @nama param
* Masuk nama pengguna
* @param lulus
* Kata sandi masuk
* @return Hasil login pengguna, mengembalikan nilai true jika berhasil, jika tidak mengembalikan false
*/
boolean userLogin(Nama string, String pass);
/**
* Daftarkan pengguna baru
*
* @nama param
* Nama pengguna pengguna yang baru terdaftar
* @param lulus
* Kata sandi untuk pengguna yang baru terdaftar
* @return kunci utama pengguna yang baru terdaftar
*/
int registerUser(Nama string, String pass);
/**
* Tambahkan foto
*
* @param pengguna
* Pengguna yang menambahkan foto
* @judul param
* Tambahkan judul ke foto Anda
* @paramnamafile
* Tambahkan nama file foto di server
* @return Kunci utama dari foto yang baru ditambahkan
*/
int addPhoto(String pengguna, String judul, String nama file);
/**
* Dapatkan semua foto pengguna berdasarkan pengguna
*
* @param pengguna
* Pengguna saat ini
* @param halamanNo
*Nomor halaman
* @return Mengembalikan foto milik pengguna dan halaman yang ditentukan
*/
Daftar<PhotoHolder> getPhotoByUser(String pengguna, int pageNo);
/**
* Verifikasi apakah nama pengguna tersedia, yaitu apakah nama pengguna sudah ada di database
*
* @nama param
* Nama pengguna yang perlu diverifikasi
* @return Mengembalikan nilai benar jika nama pengguna tersedia, jika tidak, mengembalikan nilai salah.
*/
boolean validasiNama(Nama string);
}
/**
* Kelas entitas foto
*
* @penulis Hongten
*
*/
kelas publik Foto {
//Atribut identifikasi
id Integer pribadi;
//Nama foto
judul String pribadi;
//Nama file foto di server
Nama file String pribadi;
// Simpan pengguna pemilik foto tersebut
pengguna Pengguna pribadi;
// Konstruktor tanpa parameter
Foto publik() {
}
// Konstruktor untuk menginisialisasi semua properti
Foto publik(Id bilangan bulat, Judul string, Nama file string, Pengguna pengguna) {
ini.id = id;
this.title = judul;
this.filename = fileName;
this.user = pengguna;
}
// Setter dan Metode Getter atribut ID
public void setid (integer id) {
ini.id = id;
}
Integer publik getId () {
kembalikan ini.id;
}
// Metode setter dan getter dari atribut judul
public void setTitle (string title) {
this.title = judul;
}
Public String gettitle () {
kembalikan title ini;
}
// Setter dan Metode Atribut Nama File
public void setFileName (string fileName) {
this.filename = fileName;
}
Public String getFileName () {
kembalikan nama ini;
}
// Setter dan Metode Atribut Pengguna
public void setuser (pengguna pengguna) {
this.user = pengguna;
}
pengguna publik getUser () {
kembalikan ini. Pengguna;
}
}
impor java.util.set;
impor java.util.hashset;
/**
* Kelas Entitas Pengguna
*
* @penulis Hongten
*
*/
pengguna kelas publik {
// Atribut Identifikasi
ID integer pribadi;
// Nama pengguna pengguna
nama String pribadi;
// Kata sandi pengguna ini
Pass string pribadi;
// Gunakan set untuk menyimpan foto yang terkait dengan pengguna ini
Private Set <THOTO> FOTO = HashSet baru <Foto> ();
// konstruktor tanpa parameter
pengguna publik () {
}
// konstruktor untuk menginisialisasi semua properti
Pengguna publik (ID integer, nama string, string pass) {
ini.id = id;
ini.nama = nama;
this.pass = pass;
}
// Setter dan Metode Getter atribut ID
public void setid (integer id) {
ini.id = id;
}
Integer publik getId () {
kembalikan ini.id;
}
// Setter dan Metode Getter dari Atribut Nama
public void setName(Nama string) {
ini.nama = nama;
}
String publik getName() {
kembalikan nama ini;
}
// Setter dan Metode Atribut Pass
public void setPass (string pass) {
this.pass = pass;
}
Public String getPass () {
kembalikan ini.pass;
}
// Setter dan Getter Metode Foto Atribut
public void setPhotos (set <THOTO> foto) {
this.photos = foto;
}
Set Publik <THOTO> getPhotos () {
kembalikan ini.photos;
}
}
/**
*Pengecualian yang disesuaikan
*
* @penulis Hongten
*
*/
Public Class AlbumException memperluas runimeException {
SerialVersionuid panjang statis privat = 8050756054850450421L;
// Berikan konstruktor tanpa parameter
Public AlbumException () {
}
// Berikan konstruktor dengan parameter string
Public AlbumException (string msg) {
super (msg);
}
}
impor java.sql.SQLException;
impor java.util.List;
import org.hibernate.HibernateException;
impor org.hibernate.query;
impor org.hibernate.Session;
impor org.springframework.orm.hibernate3.hibernatecallback;
impor org.springframework.orm.hibernate3.support.hibernedAosupport;
/**
*
* @penulis Hongten
*
*/
@SuppressWarnings ("Uncecked")
kelas publik HongtenhibernedAosupport memperluas HibernedAoSupport {
/**
* Gunakan pernyataan HQL untuk operasi kueri paging
*
* @param hql
* Pernyataan HQL untuk ditanyai
* @param offset
* Indeks catatan pertama
* @param pageSize
*Jumlah catatan yang akan ditampilkan di setiap halaman
* @return semua catatan halaman saat ini
*/
Daftar Publik FindByPage (string final HQL, final int offset,
final int pageSize) {
Daftar Daftar = getHibNeTeTemplate (). ExecutEfind (hibernatecallback baru () {
objek publik doinhibernate (sesi sesi)
Melempar HibernateException, Sqlexception {
Daftar hasil = session.createqueery (hql) .setFirStresult (offset)
.setMaxResults (halaman) .list ();
hasil pengembalian;
}
});
daftar pengembalian;
}
/**
* Gunakan pernyataan HQL untuk operasi kueri paging
*
* @param hql
* Pernyataan HQL untuk ditanyai
* @nilai param
* Jika HQL memiliki parameter yang perlu diteruskan, nilai adalah parameter yang dilewati.
* @param offset
* Indeks catatan pertama
* @param pageSize
*Jumlah catatan yang akan ditampilkan di setiap halaman
* @return semua catatan halaman saat ini
*/
Daftar Publik FindByPage (string akhir HQL, nilai objek akhir,
final int offset, final int pageSize) {
Daftar Daftar = getHibNeTeTemplate (). ExecutEfind (hibernatecallback baru () {
objek publik doinhibernate (sesi sesi)
Melempar HibernateException, Sqlexception {
Daftar hasil = session.createqueery (hql) .setParameter (0, nilai)
.setFirStresult (offset) .setMaxResults (pageSize) .list ();
hasil pengembalian;
}
});
daftar pengembalian;
}
/**
* Gunakan pernyataan HQL untuk operasi kueri paging
*
* @param hql
* Pernyataan HQL untuk ditanyai
* Nilai @param
* Jika HQL memiliki beberapa parameter yang perlu diteruskan, nilai adalah array parameter yang dilewati.
* @param offset
* Indeks catatan pertama
* @param pageSize
*Jumlah catatan yang akan ditampilkan di setiap halaman
* @return semua catatan halaman saat ini
*/
Daftar Publik FindByPage (Nilai String Final, Nilai Objek Terakhir [],
final int offset, final int pageSize) {
Daftar Daftar = getHibNeTeTemplate (). ExecutEfind (hibernatecallback baru () {
objek publik doinhibernate (sesi sesi)
Melempar HibernateException, Sqlexception {
Kueri kueri = session.createqueery (hql);
untuk (int i = 0; i <values.length; i ++) {
query.setParameter (i, nilai [i]);
}
Daftar hasil = query.setFirStresult (offset) .setMaxResults (
halaman) .list ();
hasil pengembalian;
}
});
daftar pengembalian;
}
}
impor java.util.List;
impor com.b510.album.dao.photodao;
impor com.b510.album.enhance.hongtenhibernedaosupport;
impor com.b510.album.model.photo;
impor com.b510.album.model.user;
/**
*
* @penulis Hongten
*
*/
@SuppressWarnings ("Uncecked")
photodahibernate kelas publik memperluas implementasi HongtenhibernatedAosupport
Photodao {
/**
* Muat instance foto berdasarkan atribut identifikasi
*
* @param ID
* Nilai atribut identitas dari instance foto yang perlu dimuat
* @return Instance foto yang sesuai dengan atribut identifikasi yang ditentukan
*/
foto publik get (integer id) {
return (photo) gethibernateTemplate (). get (photo.class, id);
}
/**
* Bertahan instance foto yang ditentukan
*
* Foto @param
* Foto contoh yang perlu bertahan
* @return Nilai atribut identitas setelah instance foto tetap ada
*/
Public Integer Simpan (foto foto) {
return (integer) gethibernateTemplate (). simpan (foto);
}
/**
* Ubah contoh foto yang ditentukan
*
* Foto @param
* Foto contoh yang perlu dimodifikasi
*/
pembaruan public void (foto foto) {
gethibernateTemplate (). update (foto);
}
/**
* Hapus instance foto yang ditentukan
*
* Foto @param
* Foto contoh yang perlu dihapus
*/
public void delete (foto foto) {
gethibernateTemplate (). hapus (foto);
}
/**
* Hapus contoh foto berdasarkan atribut identifikasi
*
* @param ID
* Nilai atribut identifikasi dari instance foto yang perlu dihapus
*/
public void delete (integer id) {
gethibernateTemplate (). hapus (get (id));
}
/**
* Permintaan semua contoh foto
*
* @Keturn semua contoh foto di database
*/
Daftar Publik <THOTO> findAll () {
return (List <THOTO>) getHibNeTeTemplate (). Find ("From Photo");
}
/**
* Foto kueri milik pengguna tertentu dan melakukan kontrol paging
*
* User @param
* Meminta pengguna yang fotonya milik
* @param pageno
*Halaman yang ditentukan untuk ditanyai
* @Kembalinya foto yang ditanyai
*/
Daftar Publik <THOTO> FindByUser (pengguna pengguna, int pageno) {
int offset = (pageno - 1) * page_size;
// Kembalikan hasil kueri paging
return (List <THOTO>) FindByPage ("Dari Foto B Where B.User =?", Pengguna,
Offset, page_size);
}
}
impor java.util.List;
impor com.b510.album.dao.userdao;
impor com.b510.album.enhance.hongtenhibernedaosupport;
impor com.b510.album.model.user;
/**
*
* @penulis Hongten
*
*/
@SuppressWarnings ("Uncecked")
UserdaoHibernate
Userdao {
/**
* Muat contoh pengguna berdasarkan atribut identifikasi
*
* @param ID
* Nilai atribut identitas dari instance pengguna yang perlu dimuat
* @Return pengguna instance yang sesuai dengan atribut identifikasi yang ditentukan
*/
pengguna publik get (integer id) {
return (user) getHibNateTemplate (). get (user.class, id);
}
/**
* Bertahan instance pengguna yang ditentukan
*
* User @param
* Contoh pengguna yang perlu bertahan
* @return Nilai atribut identitas setelah instance pengguna tetap ada
*/
Public Integer Save (pengguna pengguna) {
return (integer) gethibernateTemplate (). simpan (pengguna);
}
/**
* Ubah contoh pengguna yang ditentukan
*
* User @param
* Instance pengguna yang perlu dimodifikasi
*/
Pembaruan public void (pengguna pengguna) {
gethibernateTemplate (). update (pengguna);
}
/**
* Hapus instance pengguna yang ditentukan
*
* User @param
* Contoh pengguna yang perlu dihapus
*/
public void delete (pengguna pengguna) {
gethibernateTemplate (). hapus (pengguna);
}
/**
* Hapus contoh pengguna berdasarkan atribut identifikasi
*
* @param ID
* Nilai atribut identifikasi dari instance pengguna yang perlu dihapus
*/
public void delete (integer id) {
gethibernateTemplate (). hapus (get (id));
}
/**
* Permintaan semua instance pengguna
*
* @Keturn semua instance pengguna di database
*/
Daftar Publik <User> findAll () {
return (list <User>) getHibNeTeTemplate (). find ("from user");
}
/**
* Temukan pengguna berdasarkan nama pengguna
*
* nama @param
* Nama pengguna pengguna yang dapat ditemukan
* @return pengguna yang ditemukan
*/
Pengguna publik FindByName (nama string) {
Daftar <User> Users = (Daftar <User>) getHibNeTeMemplate (). Find (
"Dari pengguna u di mana u.name =?", name);
if (pengguna! = null && user.size () == 1) {
Return user.get (0);
}
kembalikan nol;
}
}
impor java.util.List;
impor com.b510.album.model.photo;
impor com.b510.album.model.user;
/**
* Antarmuka Photodao
*
* @penulis Hongten
*
*/
antarmuka publik Photodao {
// Gunakan konstanta untuk mengontrol jumlah foto yang ditampilkan di setiap halaman
final int page_size = 8;
/**
* Muat instance foto berdasarkan atribut identifikasi
*
* @param ID
* Nilai atribut identitas dari instance foto yang perlu dimuat
* @return Instance foto yang sesuai dengan atribut identifikasi yang ditentukan
*/
Foto dapatkan (ID integer);
/**
* Bertahan instance foto yang ditentukan
*
* Foto @param
* Foto contoh yang perlu bertahan
* @return Nilai atribut identitas setelah instance foto tetap ada
*/
Integer simpan (foto foto);
/**
* Ubah contoh foto yang ditentukan
*
* Foto @param
* Foto contoh yang perlu dimodifikasi
*/
pembaruan batal (foto foto);
/**
* Hapus instance foto yang ditentukan
*
* Foto @param
* Foto contoh yang perlu dihapus
*/
void delete (foto foto);
/**
* Hapus contoh foto berdasarkan atribut identifikasi
*
* @param ID
* Nilai atribut identifikasi dari instance foto yang perlu dihapus
*/
void delete (integer id);
/**
* Permintaan semua contoh foto
*
* @Keturn semua contoh foto di database
*/
Daftar <THOTO> findAll ();
/**
* Foto kueri milik pengguna tertentu dan melakukan kontrol paging
*
* User @param
* Meminta pengguna yang fotonya milik
* @param pageno
*Halaman yang ditentukan untuk ditanyai
* @Kembalinya foto yang ditanyai
*/
Daftar <THOTO> FindByUser (pengguna pengguna, int pageno);
}
impor java.util.List;
impor com.b510.album.model.user;
/**
* Antarmuka userdao
*
* @penulis Hongten
*
*/
antarmuka publik userdao {
/**
* Muat contoh pengguna berdasarkan atribut identifikasi
*
* @param ID
* Nilai atribut identitas dari instance pengguna yang perlu dimuat
* @Return pengguna instance yang sesuai dengan atribut identifikasi yang ditentukan
*/
Pengguna dapatkan (Integer ID);
/**
* Bertahan instance pengguna yang ditentukan
*
* User @param
* Contoh pengguna yang perlu bertahan
* @return Nilai atribut identitas setelah instance pengguna tetap ada
*/
Integer save (pengguna pengguna);
/**
* Ubah contoh pengguna yang ditentukan
*
* User @param
* Instance pengguna yang perlu dimodifikasi
*/
void update (pengguna pengguna);
/**
* Hapus instance pengguna yang ditentukan
*
* User @param
* Contoh pengguna yang perlu dihapus
*/
void delete (pengguna pengguna);
/**
* Hapus contoh pengguna berdasarkan atribut identifikasi
*
* @param ID
* Nilai atribut identifikasi dari instance pengguna yang perlu dihapus
*/
void delete (integer id);
/**
* Permintaan semua instance pengguna
*
* @Keturn semua instance pengguna di database
*/
Daftar <User> findAll ();
/**
* Temukan pengguna berdasarkan nama pengguna
*
* nama @param
* Nama pengguna pengguna yang dapat ditemukan
* @return pengguna yang ditemukan
*/
Pengguna findbyname (nama string);
}
Karena proyek ini terlihat relatif besar setelah menambahkan paket JAR, paket JAR dibatalkan di sini.
Berikut ini adalah lampiran : AJAX_JQUERY_ALBUM_JB51NET.RAR (Unduh Kode Sumber)