struts2_13_OGNL表达式
来源:互联网 发布:贝克汉姆球衣淘宝 编辑:程序博客网 时间:2024/04/28 00:28
全称:Object Graphic Navigation Language(对象图导航语言)是一个开源项目,是Struts2框架的默认表达式语言。
相对于EL表达式,它提供了平时我们需要的一些功能,如:
·支持对象方法调用,如method.sayHello();
·支持类静态方法调用和值访问,表达式的格式为@[类全名(包括路径)]@[方法名|值名],例如:@java.lang.String@format(‘foo %s’,’bar’)或
@cn.itcast.Constant@APP_NAME;
·操作集合对象
Ognl有一个上下文(Context)概念,用来实现java.utils.Map接口,在Struts2中上下文(Context)的实现为ActionContext。
下面为ActionContext包含的对象:
·ValueStack(值栈,它是跟对象)
·parameters
·request
·session
·application
·attr
当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action然后把action存放入ValueStack中,所以action的实例变量可以被OGNL访问。
访问上下文(Context)中的对象需要使用#符号标注命名空间,如:#application、#session,另外OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈),如果要访问根对象的属性,则可以省略#命名空间,直接访问该对象的属性。
在Struts2中,根对象ValueStack的实现类为OgnlValueStack,该对象存放一组对象,在OgnlValueStack类里面有一个List类型的root变量,就是使用它存放一组对象。
在root变量中处于第一位的对象叫做栈顶对象,通常我们在OGNL表达式里直接写上属性的名称即可访问root变量对象的属性,搜索顺序是从栈顶对象开始寻找,如果栈顶对象不存在该属性,就会从第二个对象寻找,如果没有就继续依次往下访问,直至找到为止。
注意:Struts2中,OGNL表达式需要配合Struts标签才能使用,如:<s:property value=”name”/>
由于ValueStack是struts2中OGNL的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack中的属性:
${propertise }//获得值栈中某个对象的properties属性
如果访问其它Context中的对象,由于不是根对象,所以在访问时需要添加#前缀:
·application对象:用于访问ServletContext方法:#application.userName或#application[‘userName’]
相当于调用ServletContext的 getAttribute(“userName”)。
·session对象:用于访问HttpSession方法:#session.userName或#session[‘userName’]
相当于调用session.getAttribute(“userName”)。
·request对象:用于访问HttpServletrequest属性的Map方法:#request.userName或#request[‘userName’]
相当于调用request.getAttribute(“userName”)。
·parameters对象:用于访问Http的请求参数方法:#parameters.userName或#parameters[‘userName’]
相当于调用request.getparameter(“userName”)。
·attr对象:用于按page->request->session->application顺序访问起属性。
property标签:
property标签用于输出指定值:
<s:set name=”name” value=”kk”/><s:property value=”#naem”/>
default:可选属性,如果需要输出属性的值为null,则显示该属性的值
escape:可选属性,指定是否格式化HTML代码
value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值
id:可选属性,指定该元素的标识
iterate标签:
iterate标签用于对集合进行迭代,这里的集合包含List、Set和数组。
<span style="font-size:12px;"><s:set name=”list” value=”{‘zhao’,’qian’,’sun’}”/><s:iterator value=”#list” status=”st”><font color=<s:if test=”#st.odd”>red</s:if><s:else>blue</s:else>><s:property/></font><br></s:iterator></span>
value:可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值
status:可选属性,该属性指定迭代时的iterateStatus实例,
该方法有如下几个方法:
int getCount(),返回当前迭代了几个元素
int getIndex(),返回当前迭代元素的索引
boolean isEven(),返回当前被迭代的元素的索引是否是偶数
boolean isOdd(),返回当前被迭代的元素的索引是否是奇数
boolean isFirst(),返回当前被迭代的元素是否为第一个元素
boolean isLast(),返回当前被迭代的元素是否为最后一个
if/elseif/else标签:
<s:set name=”age” value=”33”/><s:if test=”#age==33”>33</s:if><s:elseif test=”#age==22”>22</s:elseif><s:else>都不等</s:else>
url标签:
<span style="font-size:12px;"><s:set name="age" value="33" scope="request" /><s:url action="hello" namespace="/test"><s:param name="personId" value="#request.age"></s:param></s:url></span>
输出为:/Ognl/test/hello.action?personId=33
当标签的属性值为字符串类型处理时,”%”符号的用途是计算OGNL表达式的值。
<s:set name="myurl" value="'http://www.hao123.com'" /><s:url value="%{#myurl}" /><!-- 使用%{}强制输出url的value值-->
输出为:http://www.hao123.com
表单标签checkBoxList复选框:
如果集合为list:
<struts><!--默认的视图主题--> <constant name="struts.ui.theme" value="simple"/></struts><s:radio name="list" list="{'Java','.Net','Php','Ror'}" value="{'.Net'}" /><s:checkboxlist name="list" list="{'Java','.Net','Php','Ror'}" value="{'Java','.Net'}" />
防止表单的重复提交:
1)登录界面index.jsp中的代码:
<s:form action="hello" namespace="/test" method="post"> 姓名:<s:textfield name="name" /><s:token /><input type="submit" value="发送" /></s:form>
2)struts.xml文件中的代码:
<package name="base" namespace="/test" extends="struts-default"><action name="hello" class="struts2.personAction"><!-- 加入拦截器,当再一次访问已经访问到的页面时,会跳转到登陆页面 --><interceptor-ref name="defaultStack" /><interceptor-ref name="token" /><result name="invalid.token">/index.jsp</result><result name="success">/show.jsp</result></action></package></struts>
3)personAction中的代码:
public class personAction {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public String execute(){return "success";}}
4)显示层show.jsp中的代码:
<body><s:property value="name" /><br /><%=new Date()%><br></body>
注意:以上配置了“token”拦截器和“invalid.token”结果,因为“token”拦截器在会话的token与请求的token不一致时,将会直接返回“invalid.token”结果。
- struts2_13_OGNL表达式
- 表达式
- 表达式
- 表达式
- 表达式
- 表达式
- 表达式
- 表达式
- 表达式
- 表达式
- <% %>表达式
- 表达式
- 表达式
- 表达式
- 表达式
- 表达式
- 表达式
- 表达式
- GetTextExtentPoint32() 判断一个字串的大小(范围)
- matlab 频率及滤波效果图
- adb: error while loading shared libraries: libstdc++.so.6: cannot open shared object file:
- 八种主流NoSQL数据库对比
- Ubuntu下的C51单片机开发工具
- struts2_13_OGNL表达式
- Linux lvm 扩展操作
- 6种不良坐姿最伤脊椎
- 世界上十个著名悖论详解
- 突破5分钟限制 TeamViewer 限制
- 使用C++结合文件操作和链表实现学生成绩管理系统
- 万达三巨头联盟或“合而不作”
- hdu 4081Qin Shi Huang's National Road System(最小生成树变形)
- ajax跨域jsonp处理