View Full Version : سوال: چگونه باید object را ردگیری کرد
m44miri
دوشنبه 27 تیر 1390, 08:31 صبح
یک سوال برام پیش اومده.فرض کنید یک کلاس object داریم که داخلش چند Field و Method وجود داره.
دفعه اول در برنامه فراخوانیش میکنیم و به فیلدهاش مقدار دهی میکنیم.
مثلا:
Auth auth = new Auth();
auth.setUsername(username);
از این کلاس بیرون میام و در جایی دیگه از برنامه ام دوباره به همین فیلد که قبلا مقدار دهی کردم نیاز پیدا کردم.
چطوری باید مقدار فیلد username داخل این کلاس را بدست بیارم؟بدون اینکه دوباره یک فراخوانی جدید انجام بدم.
منظورم اینه که مقداری قبلا بهش تزریق کردم را نیاز دارم.
javaphantom
دوشنبه 27 تیر 1390, 10:40 صبح
یک سوال برام پیش اومده.فرض کنید یک کلاس object داریم که داخلش چند Field و Method وجود داره.
دفعه اول در برنامه فراخوانیش میکنیم و به فیلدهاش مقدار دهی میکنیم.
مثلا:
Auth auth = new Auth();
auth.setUsername(username);
از این کلاس بیرون میام و در جایی دیگه از برنامه ام دوباره به همین فیلد که قبلا مقدار دهی کردم نیاز پیدا کردم.
چطوری باید مقدار فیلد username داخل این کلاس را بدست بیارم؟بدون اینکه دوباره یک فراخوانی جدید انجام بدم.
منظورم اینه که مقداری قبلا بهش تزریق کردم را نیاز دارم.
برای اینکار از دو pattern استفاده می شه . یکی lookup کردن از context و دومی DI یا همون dependency injection
اما برای اینکه این کار رو خودمون انجام بدیم از همون روش اول یک شبیه سازی می کنیم
import java.lang.String; /**
* Created by IntelliJ IDEA.
* User: azarmi
* Date: 7/18/11
* Time: 10:37 AM
* To change this template use File | Settings | File Templates.
*/
public class Auth {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
import java.util.HashMap;
import java.util.Map;
/**
* Created by IntelliJ IDEA.
* User: azarmi
* Date: 7/18/11
* Time: 10:35 AM
* To change this template use File | Settings | File Templates.
*/
public class MyContext {
private static MyContext myContext;
private Map<String, Object> map = new HashMap<String, Object>();
private MyContext() {
}
public static MyContext getContext() {
if (myContext == null) {
System.out.println("This is first time that the object is instantiated");
myContext = new MyContext();
}
System.out.println("myContext.hashCode() = " + myContext.hashCode());
return myContext;
}
public Object getObjectByName(String name) {
return map.get(name);
}
public void setObjectInContext(String name, Object o) {
map.put(name, o);
}
public static void main(String[] s) {
Auth auth = new Auth();
auth.setUsername("babak 1");
Auth auth1 = new Auth();
auth1.setUsername("babak 2");
/**
* Initializing the context
*/
MyContext.getContext().setObjectInContext("auth",auth);
MyContext.getContext().setObjectInContext("auth1",auth1);
/**
* Using the context any where
*/
Auth a1 = (Auth) MyContext.getContext().getObjectByName("auth");
System.out.println("a1.getUsername() = " + a1.getUsername());
Auth a2 = (Auth) MyContext.getContext().getObjectByName("auth1");
System.out.println("a2.getUsername() = " + a2.getUsername());
}
}
m44miri
دوشنبه 27 تیر 1390, 11:52 صبح
ممنون از جوابتون.
راستش نمی دونم درست متوجه شدم یا نه!! با map در حافظه جستجو میکنه و اگر فیلد قبلا مقدار داده شده همون را بر میگردونه.اما یک سوال
می دونیم که هر کاربر صفاتی منحصر به فرد داره .مثلا هر کاربری آدرس خونه خودشو یا شماره تلفن خودشو و یا کد ملی خودشو داره.حالا من با استفاده از نام کاربر (مثلا در اینجا کلید ماست)فیلدهای دیگه مربوط به فرد را مقداردهی کردیم.اگر در یک برنامه وب چندین نفر وارد سیستم میشن چطوری باید این فیلدها را رد گیری کنیم و با هم قاطی هم نشه.اینکه صرفا بدونیم که این فیلدها قبلا مقدار دهی شده برایمون کافی نیست و کلید هم برامون مهمه که در اینجا فرض شده کلید نام کاربر است.نمی دونم منظورم را واضح بیان کردم یا نه !!!
javaphantom
دوشنبه 27 تیر 1390, 12:54 عصر
ممنون از جوابتون.
راستش نمی دونم درست متوجه شدم یا نه!! با map در حافظه جستجو میکنه و اگر فیلد قبلا مقدار داده شده همون را بر میگردونه.اما یک سوال
می دونیم که هر کاربر صفاتی منحصر به فرد داره .مثلا هر کاربری آدرس خونه خودشو یا شماره تلفن خودشو و یا کد ملی خودشو داره.حالا من با استفاده از نام کاربر (مثلا در اینجا کلید ماست)فیلدهای دیگه مربوط به فرد را مقداردهی کردیم.اگر در یک برنامه وب چندین نفر وارد سیستم میشن چطوری باید این فیلدها را رد گیری کنیم و با هم قاطی هم نشه.اینکه صرفا بدونیم که این فیلدها قبلا مقدار دهی شده برایمون کافی نیست و کلید هم برامون مهمه که در اینجا فرض شده کلید نام کاربر است.نمی دونم منظورم را واضح بیان کردم یا نه !!!
شما اگر دارید در لایه وب کار می کنی و فرض کنیم که یک کاربری می یاد user pass رو می زنه و وارد می شه. وقتی وارد شده یک سری اطلاعات هم مثل username ش توی همه صفحه ها نیاز هست. مثلا yahoo رو در نظر بگیر وقتی login می کنی اگر username = babak همه صفحات اون بالا می زنه hello babak مثلا.
اینجوری که فهمیدم شما می خوای همشه object user رو در تمام صفحات داشته باشی.
این داستان رو با مفهومی به نام session مدیریت می کنند.
session یک ojbect ی هست که در طرف سرور به خواسته client درست می شه. شما باید بری سراغ مبحث session tracking
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.