我是靠谱客的博主 愉快水池,最近开发中收集的这篇文章主要介绍Struts 2 第19part OGNL 表达式的初步使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

2013年2月19日 天气晴

Struts 2 第19part OGNL 表达式的初步使用

新的一part,OGNL表达式的学习,这里只是为了说明什么是OGNL表达式,OGNL用在什么位置,怎么使用这些问题?

那么,OGNL的全称是什么?

Object Graph Navigation Language  对象图导航语言

OGNL表达式的基本单位是"导航链",一般导航链由如下几个部分组成:

  1. 属性名称(property)
  2. 方法调用(method invoke)
  3. 数组元素

所有的OGNL表达式都基于当前对象的上下文来完成求值运算,链的前面部分的结果将作为后面求值的上下文。

关于OGNL可不是一个能简单介绍完的东西,但使用起来确实是比较爽的。

具体怎么用,下面例子,看完之后就能知道一二了。

实例:/Struts2_OGNL

我们要得到的效果如下图,内容稍微多一点,不过都不难。

 

看到上面的结果,一下子可能就懵了,但没有说一下子把所有结果都能显示出来,一条一条来试,当然小巫已经试过了,就不再这里再一条条来写。直接给出源代码。

 
  
  1. <?xml version="1.0" encoding="GB18030" ?> 
  2. <%@ page language="java" contentType="text/html; charset=GB18030" 
  3.     pageEncoding="GB18030"%> 
  4. <%@ taglib uri="/struts-tags" prefix="s" %> 
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  6. <html xmlns="http://www.w3.org/1999/xhtml"> 
  7. <head> 
  8. <meta http-equiv="Content-Type" content="text/html; charset=GB18030" /> 
  9. <title>OGNL表达式语言学习</title> 
  10. </head> 
  11. <body> 
  12.     <ol> 
  13.         <li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li> 
  14.         <li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user["age"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li> 
  15.         <li>访问值栈中对象的普通属性(get set方法):<s:property value="cat.friend.name"/></li> 
  16.         <li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li> 
  17.         <li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()"/></li> 
  18.         <li>访问值栈中action的普通方法:<s:property value="m()"/></li> 
  19.         <hr/> 
  20.         <li>访问静态方法:<s:property value="@com.wwj.struts2.ognl.S@s()"/></li> 
  21.         <li>访问静态属性:<s:property value="@com.wwj.struts2.ognl.S@STR"/></li> 
  22.         <li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li> 
  23.         <hr/> 
  24.         <li>访问普通类的构造方法:<s:property value="new com.wwj.struts2.ognl.User(8)"/></li> 
  25.         <hr/> 
  26.         <li>访问List:<s:property value="users"/></li> 
  27.         <li>访问List中某个元素:<s:property value="users[1]"/></li> 
  28.         <li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li> 
  29.         <li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li> 
  30.         <li>访问Set:<s:property value="dogs"/></li> 
  31.         <li>访问Map:<s:property value="dogMap"/></li> 
  32.         <li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap["dog101"]"/></li> 
  33.         <li>访问Map中所有的key:<s:property value="dogMap.keys"/></li> 
  34.         <li>访问Map中所有的value:<s:property value="dogMap.values"/></li> 
  35.         <li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li> 
  36.         <hr/> 
  37.         <li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li> 
  38.         <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li> 
  39.         <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li> 
  40.         <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li> 
  41.         <hr /> 
  42.         <li>[]:<s:property value="[0].username"/></li> 
  43.     </ol> 
  44.       
  45.     <s:debug></s:debug> 
  46. </body> 
  47. </html> 

再来看看项目结构:

 

 

整个项目执行流程:从index.jsp开始->struts.xml->Action类->struts.xml->ognl.jsp

index.jsp

 
  
  1. <body> 
  2.     访问属性  
  3.     <a href="<%=contextPath %>/ognl.action?username=u&password=p">ognl</a> 
  4. </body> 

struts.xml

 
  
  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd"> 
  5.  
  6. <struts> 
  7.  
  8.     <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
  9.     <constant name="struts.devMode" value="true" /> 
  10.     <!-- 允许访问静态方法 --> 
  11.     <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> 
  12.     <include file="/com/wwj/struts2/ognl/ognl.xml"/> 
  13.       
  14.  
  15.  
  16. </struts> 

包含进来的ognl.xml配置文件

 
  
  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2. <!DOCTYPE struts PUBLIC  
  3.         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.         "http://struts.apache.org/dtds/struts-2.0.dtd"> 
  5. <struts> 
  6.     <package name="ognl" extends="struts-default"> 
  7.         <action name="ognl" class="com.wwj.struts2.ognl.OgnlAction"> 
  8.             <result>/ognl.jsp</result> 
  9.         </action> 
  10.     </package> 
  11. </struts> 

OgnlAction.java

 
  
  1. package com.wwj.struts2.ognl;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.HashSet;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.Set;  
  9.  
  10. import com.opensymphony.xwork2.ActionSupport;  
  11.  
  12. public class OgnlAction extends ActionSupport {  
  13.       
  14.     //1.普通属性  
  15.     private String username;  
  16.     private String password;  
  17.       
  18.       
  19.     //2.对象  
  20.     private User user;  
  21.       
  22.       
  23.       
  24.     //3.对象  
  25.     private Cat cat;  
  26.       
  27.       
  28.     private List<User> users = new ArrayList<User>();  
  29.     private Set<Dog> dogs = new HashSet<Dog>();  
  30.     private Map<String, Dog> dogMap = new HashMap<String, Dog>();  
  31.       
  32.     public OgnlAction() {  
  33.         users.add(new User(1));  
  34.         users.add(new User(2));  
  35.         users.add(new User(3));  
  36.  
  37.         dogs.add(new Dog("dog1"));  
  38.         dogs.add(new Dog("dog2"));  
  39.         dogs.add(new Dog("dog3"));  
  40.           
  41.         dogMap.put("dog100"new Dog("dog100"));  
  42.         dogMap.put("dog101"new Dog("dog101"));  
  43.         dogMap.put("dog102"new Dog("dog102"));  
  44.     }  
  45.  
  46.     public String getUsername() {  
  47.         return username;  
  48.     }  
  49.  
  50.     public void setUsername(String username) {  
  51.         this.username = username;  
  52.     }  
  53.  
  54.     public String getPassword() {  
  55.         return password;  
  56.     }  
  57.  
  58.     public void setPassword(String password) {  
  59.         this.password = password;  
  60.     }  
  61.       
  62.     public User getUser() {  
  63.         return user;  
  64.     }  
  65.  
  66.     public void setUser(User user) {  
  67.         this.user = user;  
  68.     }  
  69.       
  70.       
  71.  
  72.     public Cat getCat() {  
  73.         return cat;  
  74.     }  
  75.  
  76.     public void setCat(Cat cat) {  
  77.         this.cat = cat;  
  78.     }  
  79.       
  80.     //action的普通方法  
  81.     public String m() {  
  82.         return "hello";  
  83.     }  
  84.  
  85.       
  86.     public List<User> getUsers() {  
  87.         return users;  
  88.     }  
  89.  
  90.     public void setUsers(List<User> users) {  
  91.         this.users = users;  
  92.     }  
  93.  
  94.     public Set<Dog> getDogs() {  
  95.         return dogs;  
  96.     }  
  97.  
  98.     public void setDogs(Set<Dog> dogs) {  
  99.         this.dogs = dogs;  
  100.     }  
  101.  
  102.     public Map<String, Dog> getDogMap() {  
  103.         return dogMap;  
  104.     }  
  105.  
  106.     public void setDogMap(Map<String, Dog> dogMap) {  
  107.         this.dogMap = dogMap;  
  108.     }  
  109.  
  110.     public Map<String, Dog> getDogmap() {  
  111.         return dogMap;  
  112.     }  
  113.  
  114.     public void setDogmap(Map<String, Dog> dogmap) {  
  115.         this.dogMap = dogmap;  
  116.     }  
  117.  
  118.     @Override 
  119.     public String execute() throws Exception {  
  120.         // TODO Auto-generated method stub  
  121.         return SUCCESS;  
  122.     }  
  123.       
  124.       
  125. }  

User.java

 
  
  1. package com.wwj.struts2.ognl;  
  2.  
  3. public class User {  
  4.     private int age = 8;  
  5.  
  6.       
  7.     //必须要有这个默认构造方法  
  8.     public User() {  
  9.         super();  
  10.     }  
  11.  
  12.     public User(int age) {  
  13.         super();  
  14.         this.age = age;  
  15.     }  
  16.  
  17.     public int getAge() {  
  18.         return age;  
  19.     }  
  20.  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24.  
  25.     @Override 
  26.     public String toString() {  
  27.         // TODO Auto-generated method stub  
  28.         return "user" + age;  
  29.     }  
  30.       
  31.       
  32.       
  33.       
  34. }  

 

Cat.java

 
  
  1. package com.wwj.struts2.ognl;  
  2.  
  3.  
  4. public class Cat {  
  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.       
  19. }  

Dog.java

 
  
  1. package com.wwj.struts2.ognl;  
  2.  
  3. public class Dog {  
  4.     private String name;  
  5.  
  6.     public Dog() {  
  7.         super();  
  8.     }  
  9.       
  10.     public Dog(String name) {  
  11.         super();  
  12.         this.name = name;  
  13.     }  
  14.  
  15.     public String getName() {  
  16.         return name;  
  17.     }  
  18.  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.  
  23.     @Override 
  24.     public String toString() {  
  25.         return "Dog [name=" + name + "]";  
  26.     }  
  27.       
  28.       
  29. }  

 

S.java

 
  
  1. package com.wwj.struts2.ognl;  
  2.  
  3. public class S {  
  4.     public static String STR = "STATIC STRING";  
  5.       
  6.     public static String s() {  
  7.         return "static method";  
  8.     }  
  9. }  

 

 

整个项目的代码贴放完毕,关于OGNL这一part的学习,就这么多。不多说了。

转载于:https://blog.51cto.com/wwj9520/1135341

最后

以上就是愉快水池为你收集整理的Struts 2 第19part OGNL 表达式的初步使用的全部内容,希望文章能够帮你解决Struts 2 第19part OGNL 表达式的初步使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部