zoukankan      html  css  js  c++  java
  • struts2_13_OGNL表达式

    全称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接受一个请求时。会迅速创建ActionContextValueStackaction然后把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/>

     

    因为ValueStackstruts2OGNL的根对象,假设用户须要訪问值栈中的对象,在JSP页面能够直接通过以下的EL表达式訪问ValueStack中的属性:

    ${propertise }//获得值栈中某个对象的properties属性

     

    假设訪问其他Context中的对象。因为不是根对象,所以在訪问时须要加入#前缀:

    ·application对象:用于訪问ServletContext方法:#application.userName#application[userName]

      相当于调用ServletContext的   getAttributeuserName)。


    ·session对象:用于訪问HttpSession方法:#session.userName#session[userName]

      相当于调用session.getAttributeuserName)。

     

    ·request对象:用于訪问HttpServletrequest属性的Map方法:#request.userName#request[userName]

      相当于调用request.getAttributeuserName)

     

    ·parameters对象:用于訪问Http的请求參数方法:#parameters.userName#parameters[userName]

      相当于调用request.getparameteruserName)

     

    ·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标签用于对集合进行迭代,这里的集合包括ListSet和数组。

    <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”结果。













  • 相关阅读:
    头脑王者 艺术,电影,体育,时尚,动漫
    头脑王者 音乐
    头脑王者 地理
    头脑王者 历史,军事
    头脑王者 文学
    Jenkins project
    sql server drop login failed
    devenv.exe 编译Solution
    Jenkins
    头脑王者
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6873040.html
Copyright © 2011-2022 走看看