Linux安全网 - Linux操作系统_Linux 命令_Linux教程_Linux黑客

绿色网站无广告
会员投稿 投稿指南 本期推荐:
搜索:
您的位置: Linux安全网 > Linux编程 > » 正文

Struts2学习笔记(8)-----Struts2的OGNL表达式语言用法

来源: youqishini 分享至:


      Struts2的OGNL和JSTL一样,都是一种表达式语言。今天我就系统的将OGNL表达式语言总结一下。


      OGNL全拼指得是“Object-GraphNavigation Language”.OGNL表达式语言看起来很简单,可是用途却很强大。OGNL表达式用来取存贮在值栈(ValueStatck)和ActionContext中的值(注意值栈是Struts2的根对象,并且值栈是隶属于ActionContext的)。取存在值栈中的值时可以直接去取。当去取存贮在ActionContext中的值则需要以“#objectName”的形式取值。而在此本人特别需要说明的是action中的变量是在值栈中的,因此你只需要直接去取值就可以了。


        首先建一个action文件OgnlAction.java,在这个action文件中分别建了String类型的数组,一个List对象,一个Map对象,一个User类实例,一个返回类型为String的方法。通过这些对象,让我们分别用OGNL表达式语言访问他们,代码如下所示:


packagecom.iman.action;
 
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
 
importcom.iman.model.User;
importcom.opensymphony.xwork2.ActionSupport;
 
public classOgnlAction extends ActionSupport {
        
         private String[] accessString;
         private List<String> list;
         private Map<Integer,String> map;
         private User user;
        
         public String accessObject(){
                   user=new User();
                   user.setUsername("Jack");
                   user.setSex("man");
                   return "user";
         }
         public String accessMethod(){
                   return "好好学习,天天进步!";
         }
        
         public String accessString(){
                   accessString=newString[]{"张三","李四","王五"};
                   return "string";
         }
 
         public String accessList(){
                   list=newArrayList<String>();
                   list.add("杨过");
                   list.add("郭靖");
                   list.add("乔峰");
                   return "list";
         }
         public String accessMap(){
                   map=new HashMap<Integer,String>();
                   map.put(new Integer(1),"天龙八部");
                   map.put(new Integer(2),"神雕侠侣");
                   map.put(new Integer(3),"射雕英雄传");
                   return "map";
         }
         @Override
         public String execute() throwsException {
                   // TODO Auto-generated methodstub
                   return SUCCESS;
         }
         public String[] getAccessString() {
                   return accessString;
         }
 
         public void setAccessString(String[]accessString) {
                   this.accessString =accessString;
         }
 
         public List<String> getList() {
                   return list;
         }
 
         public void setList(List<String>list) {
                   this.list = list;
         }
 
         public Map<Integer, String>getMap() {
                   return map;
         }
 
         public void setMap(Map<Integer,String> map) {
                   this.map = map;
         }
 
         public User getUser() {
                   return user;
         }
 
         public void setUser(User user) {
                   this.user = user;
         }
        
}


       首先用OGNL表达式直接访问Action中类的属性,用<s:property/>直接输出,页面如下所示:


<%@ page language="java"contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>取对象</title>
</head>
<body>
    姓名:<s:property value="user.username"/><br>
    性别:<s:property value="user.sex"/>
</body>
</html>


       对于action中类的对象,如果想访问它的属性则只需要用“对象.属性”的形式就可以了。


       打开服务器,在地址栏输入http://localhost:8000/Struts2Tutorial/accessObject,页面如下所示:




      下面来用OGNL表达式语言直接访问action中的方法,jsp页面如下所示:


<%@ page language="java"contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>访问方法</title>
</head>
<body>
    毛主席教育我们:<s:property value="accessMethod()"/>
</body>
</html>


        在地址栏输入http://localhost:8000/Struts2Tutorial/accessMethod,页面如下所示:




       可以看出accessMethod()是accessMethod中的一个方法,可以直接调用。


       下面来看看用OGNL表达式语言访问数组的情况,jsp页面如下所示:


<%@ page language="java"contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>数组</title>
</head>
<body>
    姓名:<s:property value="accessString"/><br>
    人数:<s:property value="accessString.length"/><br>
    取第一个人姓名:<s:property value="accessString[0]"/><br>
    值栈第一个数组:<s:property value="[0].accessString"/><br>
    使用top关键字:<s:property value="top.accessString"/>
</body>
</html>


         我们说过了Action上下文中的对象位于值栈中,所以可以直接访问。而“accessString[0]”则迭代输出数组的第一个元素。“[0].accessString”则表示输出栈顶的第一个元素。因为我们的这个元素位于栈顶,所以可以以“[0]”的方式访问,如果处于第二位的时候则是用“[1]”的方式取值,依次类推。我们也可以用“top”的关键字直接访问栈顶的元素。


         打开服务器并部署项目,在地址栏输入:http://localhost:8000/Struts2Tutorial/accessString,页面如下所示:




       下面用OGNL表达式访问List集合,jsp页面如下所示:

<%@ page language="java"contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>     
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title> list集合</title>
</head>
<body>
    姓名:<s:property value="list"/><br>
    人数:<s:property value="list.size"/><br>
    取第一个人姓名:<s:property value="list[0]"/><br>
    值栈第一个集合:<s:property value="[0].list"/><br>
    使用top关键字:<s:property value="top.list"/>
</body>
</html>


    在地址栏输入:http://localhost:8000/Struts2Tutorial/accessList,页面如下所示:




     可以看出集合与数组没有什么区别。


     下面来看看用OGNL表达式语言访问Map对象的情况,jsp页面如下所示:


<%@ page language="java"contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags" %>   
<!DOCTYPE html PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>取Map对象</title>
</head>
<body>
    小说列表:<s:property value="map"/><br>
    小说数量:<s:property value="map.size"/><br>
    取第一本小说:<s:property value="map[1]"/><br>
    值栈第一个数组:<s:property value="[0].accessString"/><br>
    使用top关键字:<s:property value="top.accessString"/>
</body>
</html>


      在地址栏输入:http://localhost:8000/Struts2Tutorial/accessMap ,页面如下所示:




        由于Map是以“key-value”的形式存在的,所以输出也是以“key-value”的形式输出的。

当想输出某一个值时则是以“对象[key]”的形式输出的。当我试图以能像数组、list那样用[0],top从值栈取值时,发现并不能这样取值。


        好了,就研究这么多了,估计也差不多了,其实更多的我想是分清是从值栈取值还是从ActionContext中取值,这个分清了也就没什么问题了。


        最后附上struts.xml配置文件中的内容:


        <action name="accessString" class="com.iman.action.OgnlAction" method="accessString">
            <result name="string">/ognl/accessString.jsp</result>
        </action>
        <action name="accessList" class="com.iman.action.OgnlAction" method="accessList">
            <result name="list">/ognl/accessList.jsp</result>
        </action>
        <action name="accessMethod" class="com.iman.action.OgnlAction">
            <result name="success">/ognl/accessMethod.jsp</result>
        </action>
        <action name="accessObject" class="com.iman.action.OgnlAction" method="accessObject">
            <result name="user">/ognl/accessObject.jsp</result>
        </action>
        <action name="accessMap" class="com.iman.action.OgnlAction"method="accessMap">
            <result name="map">/ognl/accessMap.jsp</result>
        </action>


          这是本人学习的结果,欢迎转载,欢迎交流,但转载务必给出本文章的链接地址:http://blog.csdn.net/youqishini/article/details/7075582,谢谢~ 







Tags:
分享至:
最新图文资讯
1 2 3 4 5 6
验证码:点击我更换图片 理智评论文明上网,拒绝恶意谩骂 用户名:
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 发展历史