Struts_OGNL(Object Graph Navigation Language) 對象圖導航語言


1、訪問值棧中的action的普通屬性:

請求:

 1 <a href="ognl.action?username=u&password=p">訪問屬性</a> 

對應的action代碼,getter和setter方法一定要加上:

 1     private String username;
2
3 private String password;
4
5 public String getUsername() {
6 return username;
7 }
8
9 public void setUsername(String username) {
10 this.username = username;
11 }
12
13 public String getPassword() {
14 return password;
15 }
16
17 public void setPassword(String password) {
18 this.password = password;
19 }
View Code

頁面進行訪問:

1 username = <s:property value="username" /> | password = <s:property value="password" />

 

2、訪問值棧中對象的普通屬性(get set方法)

如果請求沒有將 user的值傳過去,那么在值棧就會看到 user=null,只有為user賦值了,struts2才會構造一個User對象然后賦給user。

只有傳才會構造

想初始化 domain model,可以 new,也可以傳參數值,但這時候需要提供參數為空的構造方法。

請求:

action 中的代碼:

1         private User user;
2
3 public User getUser() {
4 return user;
5 }
6
7 public void setUser(User user) {
8 this.user = user;
9 }
View Code

屬性訪問:

 1 <s:property value="user.age" /> 

3、案例三

現在定義了 Dog 類:

 1 package com.bjsxt.struts2.ognl;
2
3 public class Dog {
4
5 private String name;
6
7 public Dog(){}
8
9 public Dog(String name){
10 this.name = name;
11 }
12
13 public String getName() {
14 return name;
15 }
16 public void setName(String name) {
17 this.name = name;
18 }
19
20 public String toString(){
21 return "dog:" + this.name;
22 }
23
24 }
View Code

Cat 類,類中有個friend 是 Dog 類

 1 package com.bjsxt.struts2.ognl;
2
3 public class Cat {
4
5 private Dog friend;
6
7 public Dog getFriend() {
8 return friend;
9 }
10
11 public void setFriend(Dog friend) {
12 this.friend = friend;
13 }
14
15 public String miaomiao(){
16 return "miaomiao";
17 }
18 }
View Code

在 Action 中定義了 Cat 對象

1     private Cat cat;
2
3 public Cat getCat() {
4 return cat;
5 }
6
7 public void setCat(Cat cat) {
8 this.cat = cat;
9 }
View Code

請求:

顯示:

4、案例四:OGNL表達式調用值棧中對象的方法

action中是有定義password屬性的。

類似案例:

Cat類中是由miaomiao()方法的。

5、調用action的普通方法

action 先定義一個普通方法:

public String m(){
return "hello";
}

頁面調用:

 1 <s:property value="m()"/> 

========================================================================

訪問靜態方法:

先在struts.xml設置允許訪問靜態方法

 1 <constant name="struts.ognl.allowStaticMethodAccess" value="true"/> 

定義的示例類:

 1 package com.bjsxt.struts2.ognl;
2
3 public class S {
4
5 public static String STR = "STATIC STRING";
6
7 public static String s(){
8 return "this is a static method().";
9 }
10
11 }
View Code

訪問代碼:

1 訪問靜態方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/>
2 訪問靜態變量:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/>
3 訪問Math類的靜態方法:<s:property value="@@max(2,3)"/>

6、訪問普通類的構造方法

 1 訪問普通類的構造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)" /> 

結果:

7、訪問集合元素

數組訪問方式跟訪問List一樣 

8、投影

User 代碼:

 1 package com.bjsxt.struts2.ognl;
2
3 public class User {
4
5 private Integer age = 10;
6
7 public User(){}
8
9 public User(int age){
10 this.age = age;
11 }
12
13 public Integer getAge() {
14 return age;
15 }
16
17 public void setAge(Integer age) {
18 this.age = age;
19 }
20
21 public String toString(){
22 return "user" + age;
23 }
24
25 }
View Code

名稱為 users 的List

1 private List<User> users = new ArrayList<User>();
2 users.add(new User(1));
3 users.add(new User(2));
4 users.add(new User(3));
5 users.add(new User(4));
View Code

頁面代碼:

1 <li>投影(過濾):<s:property value="users.{?#this.age==1}.{age}"/></li><!-- ?#后面接過濾條件 這句話是取所有age大於1的所有值 -->
2 <li>投影:<s:property value="users.{^#this.age>1}.{age}" /></li><!-- ^#開頭 這句話是取age大於1的第一個值 -->
3 <li>投影:<s:property value="users.{$#this.age>1}.{age}" /></li><!-- $#結尾 這句話是取age大於1的最后那個值-->
4 <li>投影:<s:property value="users.{^#this.age>1}.{age} == null" /></li>

結果:

9、[]

[] 訪問的是值棧

[索引] 訪問對應位置的對象

[索引].對象名 訪問索引對象包含的Property

 1 <s:property value="[0].locale"/> 

小問題:一個請求從一個Action容器內跳轉到另一個Action,那么在值棧中就會有兩個Action。例子如下:

struts.xml

TestAction

 1 package com.bjsxt.struts2.ognl;
2
3 import com.opensymphony.xwork2.ActionSupport;
4
5 public class TestAction extends ActionSupport {
6
7 private static final long serialVersionUID = 7420682335394931465L;
8
9 public String execute(){
10 return SUCCESS;
11 }
12 }
View Code

OgnlAction

 1     public OgnlAction(){
2 users.add(new User(1));
3 users.add(new User(2));
4 users.add(new User(3));
5 users.add(new User(4));
6
7 dogs.add(new Dog("dog1"));
8 dogs.add(new Dog("dog2"));
9 dogs.add(new Dog("dog3"));
10
11 dogMap.put("dog100", new Dog("100"));
12 dogMap.put("dog101", new Dog("101"));
13 dogMap.put("dog102", new Dog("102"));
14 }
15
16 public String execute() throws Exception {
17 return super.execute();
18 }
View Code

調用了兩個Action后,ValueStack中的內容 TestAction 先進棧,OgnlAction 后進棧:

OGNL 常用的就上面這些。

鏈接: http://pan.baidu.com/s/1c8Hima 密碼: gkch


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com