锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
OGNL鏄疧bject-Graph Navigation
Language鐨勭緝鍐欙紝瀹冩槸涓縐嶅姛鑳藉己澶х殑琛ㄨ揪寮忚璦錛圗xpression
Language錛岀畝縐頒負EL錛夛紝閫氳繃瀹冪畝鍗曚竴鑷寸殑琛ㄨ揪寮忚娉曪紝鍙互瀛樺彇瀵硅薄鐨勪換鎰忓睘鎬э紝璋冪敤瀵硅薄鐨勬柟娉曪紝閬嶅巻鏁翠釜瀵硅薄鐨勭粨鏋勫浘錛屽疄鐜板瓧孌電被鍨嬭漿鍖栫瓑鍔?
鑳姐傚畠浣跨敤鐩稿悓鐨勮〃杈懼紡鍘誨瓨鍙栧璞$殑灞炴с?br />
XWork閬靛驚“涓嶈閲嶅鍦板彂鏄庡悓涓涓疆瀛?#8221;鐨勭悊璁猴紝瀹冪殑琛ㄨ揪寮忚璦鏍稿績鐢ㄧ殑灝辨槸榪欎釜OGNL銆傛垜浠厛
鏉ョ湅鐪嬩竴涓畝鍗曠殑渚嬪瓙錛?br />
榪樿寰楁垜浠敤鎴鋒敞鍐岀殑閭d釜渚嬪瓙鍚楋紵鎴戜滑杈撳叆妗嗙殑name鐢ㄥ埌鐨勫悕瀛楀氨鏄疧GNL鐨勮〃杈懼紡錛屾瘮濡傦細鐢ㄦ埛鍚嶇殑杈撳叆
妗嗭細“<input type="text"
name="user.username">”錛屽湪鐢ㄦ埛娉ㄥ唽鎴愬姛涔嬪悗鎴戜滑瑕佹樉紺虹敤鎴鋒敞鍐岀殑淇℃伅錛岀敤浜?#8220;<ww:property
value="user.username"/>”銆侷nput杈撳叆妗嗛噷鐨?#8220;user.username”錛屽畠瑙f瀽鎴怞ava璇彞
涓猴細getUser().setUsername();錛宲roperty鏍囩閲岀殑“user.username”瑙f瀽涓篔ava璇?
鍙ワ細getUser.getUsername();銆?br />
鎴戜滑鐨勪袱涓〃杈懼紡閮芥槸鐩稿悓鐨勶紝浣嗗墠涓涓繚瀛樺璞″睘鎬х殑鍊鹼紝鍚庝竴涓槸鍙栧緱瀵硅薄灞炴х殑鍊箋傝〃杈懼紡
璇█綆鍗曘佹槗鎳傚嵈鍙堝姛鑳藉己澶э紝鍏充簬OGNL鏇村鐨勪粙緇嶅彲浠ュ幓http://www.ognl.org錛?
閭i噷鏈夊緢璇︾粏鐨勬枃妗?br />
鍊煎爢鏍堬紞OgnlValueStack
OGNL鍦ㄦ鏋朵腑鐨勫簲鐢紝鏈涓昏鏄敮鎸佹垜浠殑鍊煎爢鏍堬紙Value
Stack錛夆斺擮gnlValueStack錛屽畠涓昏鐨勫姛鑳芥槸閫氳繃琛ㄨ揪寮忚璦鏉ュ瓨鍙栧璞$殑灞炴с傜敤鎴風晫闈㈣緭鍏ユ暟鎹紝瀹冧細鏍規嵁淇濆瓨琛ㄨ揪寮忓皢鏁版嵁渚濇淇濆瓨鍒?
瀹冨爢鏍堢殑瀵硅薄涓紝涓氬姟鎿嶄綔瀹屾垚錛岀粨鏋滄暟鎹細閫氳繃琛ㄨ揪寮忚鑾峰彇銆佽緭鍑恒?br />
榪樿寰楁垜浠敤鎴鋒敞鍐岀殑渚嬪瓙鍚楋紵涓嬮潰鎴戜滑鐢ㄤ竴孌電▼搴忔潵婕旂ず瀹冨悜
OgnlValueStack涓繚瀛樸佸彇寰楁暟鎹殑姝ラ錛?br />
// DemoRegisterValueStack
package
example.register;
import com.opensymphony.xwork.util.OgnlValueStack;
public
class DemoRegisterValueStack {
public void demo(){
RegisterAction action = new RegisterAction();
OgnlValueStack
valueStack= new OgnlValueStack();
valueStack.push(action);
valueStack.setValue("user.username","Babydavic");
System.out.println("username =
"+valueStack.findValue("user.username"));
}
public
static void main(String[] args) {
DemoRegisterValueStack
demoValueStack = new DemoRegisterValueStack();
demoValueStack.demo();
}
}
鎴戜滑鏉ョ湅涓鐪嬪畠鐨刣emo()鏂規硶錛?br />
1銆?nbsp;
鍒涘緩鎴戜滑鐨凙ction錛圧egisterAction錛夌被鐨勫璞ction錛屽皢action瀵硅薄鍘嬪叆鍫嗘爤valueStack涓傚湪WebWrok涓?
Action鐨勫垱寤恒佸叆鏍堟槸鍦―efaultActionInvocation鏋勯犲嚱鏁頒腑榪涜鐨勶紝璇︾粏浠嬬粛瑙侊細ServletDispatcher鍘熺悊銆?br />
2銆?nbsp;
閫氳繃琛ㄨ揪寮忚璦錛岃皟鐢ㄥ爢鏍堝璞$殑get()銆乻et()鏂規硶錛岃緗瀵硅薄鐨勫箋?br />
public void setValue(String
expr, Object value)
璇彞錛歷alueStack.setValue("user.username","Babydavic");
鐨勪綔鐢ㄧ瓑鍚屼簬錛歛ction.getUser().setUsername("Babydavic");
3銆?nbsp;
閫氳繃琛ㄨ揪寮忚璦錛屽幓鍫嗘爤瀵硅薄涓煡鎵炬垜浠墠闈繚瀛樼殑鍊鹼紝騫跺湪鎺у埗鍙版墦鍗般倂alueStack.findValue("user.username")絳夊悓
涓庤鍙ワ細
action.getUser().getUsername()
鏈鍚庢帶鍒跺彴鎵撳嵃鐨勭粨鏋滐細
username = Babydavic
CompoundRoot
鍦∣gnlValueStack涓紝涓涓爢鏍堝叾
瀹炴槸涓涓狶ist銆傛煡鐪婳gnlValueStack浣犱細鍙戠幇錛屽爢鏍堝氨鏄?
com.opensymphony.xwork.util.CompoundRoot綾葷殑瀵硅薄錛?br />
public class
CompoundRoot extends ArrayList {
//~ Constructors
/////////////////////////////////////
public CompoundRoot() {
}
public CompoundRoot(List list) {
super(list);
}
//~ Methods ////////////////////////////////////////////
public
CompoundRoot cutStack(int index) {
return new
CompoundRoot(subList(index, size()));
}
public Object
peek() {
return get(0);
}
public Object pop() {
return remove(0);
}
public void push(Object o) {
add(0, o);
}
}
鎴戜滑閫氳繃琛ㄨ揪寮忓悜鍫嗘爤瀵硅薄鎿嶄綔鏃訛紝鎴戜滑騫朵笉鐭ラ亾鍫嗘爤涓湁鍝簺瀵硅薄銆侽gnlValueStack浼氭牴鎹爢鏍堢敱涓婂悜涓嬬殑欏哄簭錛堝厛鍏ユ爤鍦ㄤ笅闈紝鏈鍚庡叆鏍?
鍦ㄦ渶涓婇潰錛変緷嬈″幓鏌ユ壘涓庤〃杈懼紡鍖歸厤鐨勫璞℃柟娉曪紝鎵懼埌鍗寵繘琛岀浉搴旂殑瀛樺彇鎿嶄綔銆傚亣璁懼悗闈㈠璞′篃鏈夌浉鍚岀殑鏂規硶錛屽皢涓嶄細琚皟鐢ㄣ?br />
涓嬮潰鎴戜滑鐪嬩竴涓
OgnlValueStack鎿嶄綔鐨勭▼搴忥紝瀹冧富瑕佹紨紺轟簡濡備綍瀵筂ap瀵硅薄鐨勫瓨鍙栧拰OgnlValueStack鍫嗘爤鐨勫師鐞?br />
package
example.register;
import
com.opensymphony.xwork.util.OgnlValueStack;
public class
DemoGroupValueStack {
public void demoAction(){
DemoGroupAction action = new DemoGroupAction();
OgnlValueStack valueStack= new OgnlValueStack();
valueStack.push(action);
User zhao = new User();
zhao.setUsername("zhao");
zhao.setEmail("zhao@yahoo.com.cn");
User qian = new User();
qian.setUsername("qian");
qian.setEmail("qian@yahoo.com.cn");
valueStack.setValue("users['zhao']",zhao);
valueStack.setValue("users['qian']",qian);
System.out.println("users['zhao'] =
"+valueStack.findValue("users['zhao']"));
System.out.println("users['qian'] =
"+valueStack.findValue("users['qian']"));
System.out.println("users size = "+valueStack.findValue("users.size"));
System.out.println("allUserName[0] =
"+valueStack.findValue("allUserName[0]"));
}
public void demoModels(){
User model_a = new
User();
model_a.setUsername("model_a");
User
model_b = new User();
model_b.setUsername("model_b");
User model_c = new User();
model_c.setUsername("model_c");
OgnlValueStack valueStack= new OgnlValueStack();
valueStack.push(model_a);
valueStack.push(model_b);
valueStack.push(model_c);
System.out.println("username = "+valueStack.findValue("username"));
System.out.println("[1].username =
"+valueStack.findValue("[1].username"));
System.out.println("[0].toString = "+valueStack.findValue("[0]"));
System.out.println("[1].toString = "+valueStack.findValue("[1]"));
System.out.println("[2].toString = "+valueStack.findValue("[2]"));
}
public static void main(String[] args) {
DemoGroupValueStack demoValueStack = new DemoGroupValueStack();
demoValueStack.demoAction();
demoValueStack.demoModels();
}
}
package example.register;
import
java.util.ArrayList;
import java.util.HashMap;
import
java.util.List;
import java.util.Map;
public class
DemoGroupAction {
private Map users = new HashMap();
public Map getUsers(){
return this.users;
}
public List getAllUserName(){
return new
ArrayList(users.keySet());
}
public String execute(){
//鎵ц涓氬姟鎿嶄綔
return null;
}
public String
toString(){
return users.toString();
}
}
娉ㄦ剰錛?銆?
Map灞炴х殑瀛樺彇錛屽畠鐨勮〃杈懼紡璇█濡傦細users['zhao']錛屾敞鎰忓畠鐢?#8217;’鏉ュ紩鐢℉ashMap鐨刱ey瀛楃涓層?br />
2銆?
demoModels錛堬級鏂規硶婕旂ず浜哋gnlValueStack涓爢鏍堢殑鍘熺悊錛岃鐗瑰埆娉ㄦ剰瀹冪殑
[0].toString銆乕1].toString銆乕2].toString錛屽畠浠緷嬈¤皟鐢ㄥ爢鏍堜腑瀵硅薄鐨則oString()鏂規硶錛屽茍閫愪竴鐨勫噺灝戝爢鏍?
鏈涓婇潰鐨勫璞°?br />
鎺у埗鍙拌緭鍑虹殑緇撴灉濡備笅錛?br />
users['zhao'] =
username=zhao;password=null;email=zhao@yahoo.com.cn;age=0
users['qian']
= username=qian;password=null;email=qian@yahoo.com.cn;age=0
users
size = 2
allUserName[0] = qian
username = model_c
[1].username
= model_b
[0].toString =
[username=model_c;password=null;email=null;age=0,
username=model_b;password=null;email=null;age=0,
username=model_a;password=null;email=null;age=0]
[1].toString =
[username=model_b;password=null;email=null;age=0,
username=model_a;password=null;email=null;age=0]
[2].toString =
[username=model_a;password=null;email=null;age=0]