تفاوت sendRedirect با forward و include در servlet
forward و include هردو از اینترفیس RequestDispatcher هستند
در حالی که sendResirect متدی از اینترفیس ServletResponse میباشد
زمانی که شما sendRedirect میفرستی
توسط مرورگر کاربر handle میشه اما forwardو include توسط container
متد sendRedirect میتونه برای url هایی خارج از سرور شما استفاده بشه درحالی که include و forward حتما باید منابعی که فراخوانی کردید در سرور خودتون موجود باشه مثال زیر بیشتر توضیح میده در این مورد:
response.sendRedirect("http://www.google.com");
این کد بدون هیچ خطایی اجرا میشه
HttpRequest.getRequestDispatcher("http://www.google.com");
اما این کد خطا میده
sendRedirectلینک بالای صفحه رو به لینک اون جایی که ریدارکت فرستادید تغییر میده..در مثال بالا گوگل
اما includeو forward همون url اولیه ی خودشون رو نمایش میدن.
include متد
محتوای اون صفحه رو به صفحه ی فعلی شما اضافه میکنه(response اون صفحه رو) اما forward اینطور نیست و requestرو به اون آدرسی که بهش دادید ارسال میکنه
@this_java
forward و include هردو از اینترفیس RequestDispatcher هستند
در حالی که sendResirect متدی از اینترفیس ServletResponse میباشد
زمانی که شما sendRedirect میفرستی
توسط مرورگر کاربر handle میشه اما forwardو include توسط container
متد sendRedirect میتونه برای url هایی خارج از سرور شما استفاده بشه درحالی که include و forward حتما باید منابعی که فراخوانی کردید در سرور خودتون موجود باشه مثال زیر بیشتر توضیح میده در این مورد:
response.sendRedirect("http://www.google.com");
این کد بدون هیچ خطایی اجرا میشه
HttpRequest.getRequestDispatcher("http://www.google.com");
اما این کد خطا میده
sendRedirectلینک بالای صفحه رو به لینک اون جایی که ریدارکت فرستادید تغییر میده..در مثال بالا گوگل
اما includeو forward همون url اولیه ی خودشون رو نمایش میدن.
include متد
محتوای اون صفحه رو به صفحه ی فعلی شما اضافه میکنه(response اون صفحه رو) اما forward اینطور نیست و requestرو به اون آدرسی که بهش دادید ارسال میکنه
@this_java
👍1
Bean در اسپرینگ چیست؟
هر آبجکتی که توسط کانتینر اسپرینگ مدیریت ،کنترل و یا ایجاد شود را Bean مینامیم
@this_java
هر آبجکتی که توسط کانتینر اسپرینگ مدیریت ،کنترل و یا ایجاد شود را Bean مینامیم
@this_java
hibernateapp.zip
42.5 KB
پروژه ی هایبرنت:
مثال استفاده از SessionFactory و EntityManagerFactory
مثال استفاده از Bean Validation (Jsr 303)
پروژه ی maven
#hibernate
@this_java
مثال استفاده از SessionFactory و EntityManagerFactory
مثال استفاده از Bean Validation (Jsr 303)
پروژه ی maven
#hibernate
@this_java
چرا به لایه ی سرویس احتیاج داریم؟
در خصوص اینکه چرا نیاز به لایه ی سرویس داریم بگذارید یک مثال بزنم براتون:
فرض کنید یک متد داخل لایه ی سرویس قزازه اطلاعاتی رو از دیتابیس واکشی کنه(یعنی بره از لایه ی dao بگیره یک سری چیزها رو)
بعد فرض کن میخوای اگه توی دیتابیست نبود بره از یه جای دیگه پیدا کنه..مثلا یک api خارجی..فرض کن میخوای هرکس توی سایت دوستت هم ثبت نام کرده بتونه داخل سایت خودت هم لاگین کنه..بعد از دوستت خواستی یک apiارائه بده برات..
آیا این قضیه که اگه داخل دیتابیس خودت نبود
بری از api دوستت استفاده کنی باید کجا پیاده بشه ؟ لایه ی دیتا اکسس؟
نخیر این لایه فقط باید با دیتابیس سر و کار داشته باشه نه بیشتر
بنابراین برای همچین قضایایی اومدن لایه ی سرویس رو گذاشتن
فرض کن اگر توی لایه ی دیتا اکسس همچین کاری میکردی..فردا پس فردا که مثلا پیاده سازی های مختلفی برای اینترفیس های لایه ی دیتا اکسس ات می نوشتی باید توی هرکدوم بیای بگی برن از api دوستت هم چک کنن..ولی لایه ی سرویس صرفا یکبار این اتفاق میوفته برای هر پیاده سازی ای
و اینکه درکل وظیفه ی لایه ی دیتا اکسس همونطور که اسمش معلومه فقط دسترسی به دیتابیس هست.. نه بیشتر.. در برنامه نویسی بایستی ما قسمت های مختلف رو از هم جدا کنیم تا بعدا اگر خواستیم توسعه بدیم راه هموار تری پیش روی خودمون داشته باشیم..
@this_java
در خصوص اینکه چرا نیاز به لایه ی سرویس داریم بگذارید یک مثال بزنم براتون:
فرض کنید یک متد داخل لایه ی سرویس قزازه اطلاعاتی رو از دیتابیس واکشی کنه(یعنی بره از لایه ی dao بگیره یک سری چیزها رو)
بعد فرض کن میخوای اگه توی دیتابیست نبود بره از یه جای دیگه پیدا کنه..مثلا یک api خارجی..فرض کن میخوای هرکس توی سایت دوستت هم ثبت نام کرده بتونه داخل سایت خودت هم لاگین کنه..بعد از دوستت خواستی یک apiارائه بده برات..
آیا این قضیه که اگه داخل دیتابیس خودت نبود
بری از api دوستت استفاده کنی باید کجا پیاده بشه ؟ لایه ی دیتا اکسس؟
نخیر این لایه فقط باید با دیتابیس سر و کار داشته باشه نه بیشتر
بنابراین برای همچین قضایایی اومدن لایه ی سرویس رو گذاشتن
فرض کن اگر توی لایه ی دیتا اکسس همچین کاری میکردی..فردا پس فردا که مثلا پیاده سازی های مختلفی برای اینترفیس های لایه ی دیتا اکسس ات می نوشتی باید توی هرکدوم بیای بگی برن از api دوستت هم چک کنن..ولی لایه ی سرویس صرفا یکبار این اتفاق میوفته برای هر پیاده سازی ای
و اینکه درکل وظیفه ی لایه ی دیتا اکسس همونطور که اسمش معلومه فقط دسترسی به دیتابیس هست.. نه بیشتر.. در برنامه نویسی بایستی ما قسمت های مختلف رو از هم جدا کنیم تا بعدا اگر خواستیم توسعه بدیم راه هموار تری پیش روی خودمون داشته باشیم..
@this_java
Rest.zip
195.3 KB
نمونه ی وب سرویس رست با اسپرینگ بوت
استفاده از Jwt و توکن دادن بعد از اعتبار سنجی یوزرنیم و پسورد کاربر
و یک مثال از وب سرویس برای اپلود فایل
نکته:استفاده از انوتیشن های prePost امکان پذیر است (roleخاصی تعریف نکردم میتونید خودتون دیتابیس مورد نظرتون رو بزارید داخلش)
@this_java
استفاده از Jwt و توکن دادن بعد از اعتبار سنجی یوزرنیم و پسورد کاربر
و یک مثال از وب سرویس برای اپلود فایل
نکته:استفاده از انوتیشن های prePost امکان پذیر است (roleخاصی تعریف نکردم میتونید خودتون دیتابیس مورد نظرتون رو بزارید داخلش)
@this_java
sunserver.zip
1.6 KB
نمونه ی ساخت یک وب اپلیکیشن ساده با کلاس های موجود در javaSE (بدون استفاده از javaEE)
HW.pdf
72 KB
حل این مسئله
#thread
#ترد
مسئله ی انتخابی:
مسئله ی تولید کننده / مصرف کننده(consumer/producer)
@this_java
#thread
#ترد
مسئله ی انتخابی:
مسئله ی تولید کننده / مصرف کننده(consumer/producer)
@this_java
کلاس Optional چیست و چرا باید از آن استفاده کنیم؟
کلاسی است که در جاوا ۸ معرفی شده و هدف ان جلوگیری از خطای معروف nullpointerexception میباشد(هرچند گویا به طور کامل از چنین خطایی نتوانسته جلوگیری کند)
میتوان گفت بیشتر ابزاری ست برای راحت تر چک کردن مقادیر تهی و راحت تر گریختن از خطای nullpointerexception
بیگمان هرکس که با جاوا کد زده باشد با خطای nullpointerexception اشنا میباشد.
فرض کنید کلاسی به نام Person داریم و در ان یک فیلد به نام name و یک گتر برای آن داریم:
public class Person {
private String name;
public String getName() {
return name;
}
}
حال در کلاس main برنامه ی خود یک متد داریم به این صورت:(فرض کنید این متد بر اساس یکسری عملیات به مقدار null رسیده است..مثلا Person zرا از دیتابیس خوانده و هیچ مقداری پیدا نکرده است)
public static Person getPerson() {
return null;
}
طبعا هنگامی که در main چنین خط کدی را بنویسیم :
public static void main(String[] args) {
getPerson().getName();
}
به خطای nullpointerexception برمیخوریم.
حال راه حل جاوا هشت برای گریز از این خطا چیست؟
ابتدا توضیحاتی اندک ولی کارامد درمورد متد های کلاس اپشنال میدهیم:
کلاس اپشنال از دیزاین پترن Factory استفاده میکند(اجازه ی ساخت شی با کلید new از ان را نداریم):
Optional.empty();
Optional.of(T t);
Optional.ofNullable();
متد اول به جای همان مثال بالا که null برگشت دادیم استفاده میشود...متد دوم یک مقدار میپذیرد با این شرط که تهی نباشد و متد سوم میتواند مقداری تهی نیز بپذیرد
حال مثال اول را اینگونه بازنویسی میکنیم:
در اغاز بایستی نوع بازگشتی متد را از جنس Optionalتعریف کنیم:
public static Optional<Person> getPerson() {
return Optional.empty();
}
حال در متد main متد getPerson را call میکنیم:
public static void main(String[] args) {
Optional<Person> op=getPerson();
System.out.println(op);
}
خواهیم دید که دیگر خبری از ارور nullpointerexception نیست بلکه چنین چیزی در خروجی مشاهده میکنیم:
Optional.empty
سایر متد های سودمند کلاس اپشنال:
orElse(T t);
اگر مقدار وجود داشت...مقدار Tرا برگشت میدهد وگرنه مقداری که در ورودی متد داده اید را برگشت میدهد(دیگر مقدار null درکار نخواهد بود)
isPresent();
اگر مقداری داخل اپشنال بود true برگشت میدهد اگر نبود false
get();
اگر مقدار وجود داشت برگشت میدهد و اگر نبود nosuchelementexception برگشت میدهد(و بازهم خبری از ارور null نیست)
ifPresent(Consumer<? super T> consumer)
اگر مقدار وجود داشت عملیات مورد نظرمان انجام شود
ifPresentOrElse(Consumer<? super T> consumer,Runnable run)
اگر مقدار وجود داشت عملیات مورد نظر انجام شود و اگر تهی بود متد run از اینترفیس runnable صدا زده میشود
و بسیار متد های سودمند دیگر
توجه داشته باشید runnable در بالا ربطی به ترد ندارد و صرفا بخاطر متد run از ان استفاده شده است
@this_java
کلاسی است که در جاوا ۸ معرفی شده و هدف ان جلوگیری از خطای معروف nullpointerexception میباشد(هرچند گویا به طور کامل از چنین خطایی نتوانسته جلوگیری کند)
میتوان گفت بیشتر ابزاری ست برای راحت تر چک کردن مقادیر تهی و راحت تر گریختن از خطای nullpointerexception
بیگمان هرکس که با جاوا کد زده باشد با خطای nullpointerexception اشنا میباشد.
فرض کنید کلاسی به نام Person داریم و در ان یک فیلد به نام name و یک گتر برای آن داریم:
public class Person {
private String name;
public String getName() {
return name;
}
}
حال در کلاس main برنامه ی خود یک متد داریم به این صورت:(فرض کنید این متد بر اساس یکسری عملیات به مقدار null رسیده است..مثلا Person zرا از دیتابیس خوانده و هیچ مقداری پیدا نکرده است)
public static Person getPerson() {
return null;
}
طبعا هنگامی که در main چنین خط کدی را بنویسیم :
public static void main(String[] args) {
getPerson().getName();
}
به خطای nullpointerexception برمیخوریم.
حال راه حل جاوا هشت برای گریز از این خطا چیست؟
ابتدا توضیحاتی اندک ولی کارامد درمورد متد های کلاس اپشنال میدهیم:
کلاس اپشنال از دیزاین پترن Factory استفاده میکند(اجازه ی ساخت شی با کلید new از ان را نداریم):
Optional.empty();
Optional.of(T t);
Optional.ofNullable();
متد اول به جای همان مثال بالا که null برگشت دادیم استفاده میشود...متد دوم یک مقدار میپذیرد با این شرط که تهی نباشد و متد سوم میتواند مقداری تهی نیز بپذیرد
حال مثال اول را اینگونه بازنویسی میکنیم:
در اغاز بایستی نوع بازگشتی متد را از جنس Optionalتعریف کنیم:
public static Optional<Person> getPerson() {
return Optional.empty();
}
حال در متد main متد getPerson را call میکنیم:
public static void main(String[] args) {
Optional<Person> op=getPerson();
System.out.println(op);
}
خواهیم دید که دیگر خبری از ارور nullpointerexception نیست بلکه چنین چیزی در خروجی مشاهده میکنیم:
Optional.empty
سایر متد های سودمند کلاس اپشنال:
orElse(T t);
اگر مقدار وجود داشت...مقدار Tرا برگشت میدهد وگرنه مقداری که در ورودی متد داده اید را برگشت میدهد(دیگر مقدار null درکار نخواهد بود)
isPresent();
اگر مقداری داخل اپشنال بود true برگشت میدهد اگر نبود false
get();
اگر مقدار وجود داشت برگشت میدهد و اگر نبود nosuchelementexception برگشت میدهد(و بازهم خبری از ارور null نیست)
ifPresent(Consumer<? super T> consumer)
اگر مقدار وجود داشت عملیات مورد نظرمان انجام شود
ifPresentOrElse(Consumer<? super T> consumer,Runnable run)
اگر مقدار وجود داشت عملیات مورد نظر انجام شود و اگر تهی بود متد run از اینترفیس runnable صدا زده میشود
و بسیار متد های سودمند دیگر
توجه داشته باشید runnable در بالا ربطی به ترد ندارد و صرفا بخاطر متد run از ان استفاده شده است
@this_java
👍1