Struts2内置ognl表达式。引用valueStack概念。将值放入其中,可直接调用。
--要配合Struts2标签
一.取值
1.直接读取valueStack中的值
假设action中有private Cat cat, private Dog dog.
<s:property value="cat.name"/>读取cat name属性的值
<s:property value="dog.name"/>读取dog name属性的值
2.使用#读取
从parameters request session application 范围内读取值()
<s:property value="#request.id"/>相当于 request.getAttribute("id");
<s:property value="#parameters.id"/>相当于request.getParameter("id");
<s:property value="#session.id"/>相当于 session.getAttribute("id")
<s:property value="#application.id"/>相当于 application.getAttribute("id")
<s:property value="#attr.id"/>
依次搜索PageContext,HttpServletRequest ,HttpSession, ServletContext 范围 ,查找属性,找到为止。
二.操作集合
1.创建一个集合,取值
使用: <s:set name="sex" value="#{'1':'男','2':'女'}"/>在jsp中创建一个集合
使用<s:property value="#sex[id]"/> 在ValueStack范围内找到id的值, 并用它作为key去查找对应的value 并显示出来。
2.OGNL元素符?
对于集合,OGNL提供了两个元素符:in和not in,其中in判断某个元素是否在指定集合中.not in则用于判断某个元素是否不在指定集合中。
判断一个对象是否在List内存在:
<s:if test="'foo' in {'foo','bar'}">muhahaha
</s:if>
<s:else>
boo
</s:else>
<s:if test="'foo' not in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
3 过滤与投影集合
假设有一个books的List集合存在于ValueStack中,存放了多个Book类型的对象
我们可以通过这样进行过滤取值
#用法
<s:iterator value="books.{?#this.price>35}">
这样只会取到价格大于35的书籍,很好的起到了过滤的作用,
"?#" 过滤所有符合条件的集合
"^#" 过滤第一个符合条件都元素
"$#" 过滤最后一个符合条件的元素
<s:iterator value="#request.personList.{?#this.age>25}" var="perspon">
<s:property value="name">
<s:property value="age">
</s:iterator>
personList里边放了许多个person,用var关键字 在循环的时候把每一个Person对象放到map栈,this代表每一个person,所以用#this ,而?表示选择
---------------------------------------------
<s:iterator value="#request.personList.{?#this.age>25}.{name}" var="perspon">
<s:property/>
</s:iterator>
"%"符号的用法
在标签的属性值被理解为字符串类型的时候,告诉执行环境
用法1.
<s:textfield name="xxx" id="xxx" value="%{#request.username}"/>
%{}里的是ognl表达式
备注:因给value引号里边的值 含有井号,解析不出来, 所以用%{} 括起来,告诉编译器,{}里边内容的是ognl表达式。
用法2.
“$”符号的用法
在Struts2配置文件中,使用ognl表达式
-------------------------------------------
OgnlAction中,把"msgxxx_request"这个值放到request作用域里边。
ServletActionContext.getRequest().setAttribute("msgxxx","msgxxx_request");
下边是struts_ognl.xml文件
<package name="ognl" namespace="/ognl" extends="struts-default">
<action name="ognlAction_*" class="cn.itcast.j_ognl.OgnlAction"
method="{1}">
<result name="success">/ognl/ognl.jsp?msg=${#request.msgxxx}</result>
</action>
</package>
-----------------------------------
当跳转到ognl.jsp的时候,要想要获取 "msgxxx_request"这个值,可以通过request得到,
对应的键是"msgxxx"。<s:property value=”#request.msgxxx”>
------------------------------------
我也可以通过msg得到这个值
<result name="success">/ognl/ognl.jsp?msg=${#request.msgxxx}</result>
在配置文件中,先从request作用域中得到这个值,然后在使用msg作为参数名,使用参数传递这个值。可以看出 参数和参数值是放到parameters里边了
就可以这样得到值 <s:property value=”#parameters.msg”>
这个用法,可以解决重定向的问题,这个重定向到一个Action中,request作用域失效,可以在struts.xml文件中再传递一次request.
--要配合Struts2标签
无原理介绍。
一.取值
1.直接读取valueStack中的值
假设action中有private Cat cat, private Dog dog.
<s:property value="cat.name"/>读取cat name属性的值
<s:property value="dog.name"/>读取dog name属性的值
2.使用#读取
从parameters request session application 范围内读取值()
<s:property value="#request.id"/>相当于 request.getAttribute("id");
<s:property value="#parameters.id"/>相当于request.getParameter("id");
<s:property value="#session.id"/>相当于 session.getAttribute("id")
<s:property value="#application.id"/>相当于 application.getAttribute("id")
<s:property value="#attr.id"/>
依次搜索PageContext,HttpServletRequest ,HttpSession, ServletContext 范围 ,查找属性,找到为止。
二.操作集合
1.创建一个集合,取值
使用: <s:set name="sex" value="#{'1':'男','2':'女'}"/>在jsp中创建一个集合
使用<s:property value="#sex[id]"/> 在ValueStack范围内找到id的值, 并用它作为key去查找对应的value 并显示出来。
2.OGNL元素符?
对于集合,OGNL提供了两个元素符:in和not in,其中in判断某个元素是否在指定集合中.not in则用于判断某个元素是否不在指定集合中。
判断一个对象是否在List内存在:
<s:if test="'foo' in {'foo','bar'}">muhahaha
</s:if>
<s:else>
boo
</s:else>
<s:if test="'foo' not in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
3 过滤与投影集合
假设有一个books的List集合存在于ValueStack中,存放了多个Book类型的对象
我们可以通过这样进行过滤取值
#用法
<s:iterator value="books.{?#this.price>35}">
这样只会取到价格大于35的书籍,很好的起到了过滤的作用,
"?#" 过滤所有符合条件的集合
"^#" 过滤第一个符合条件都元素
"$#" 过滤最后一个符合条件的元素
<s:iterator value="#request.personList.{?#this.age>25}" var="perspon">
<s:property value="name">
<s:property value="age">
</s:iterator>
personList里边放了许多个person,用var关键字 在循环的时候把每一个Person对象放到map栈,this代表每一个person,所以用#this ,而?表示选择
---------------------------------------------
<s:iterator value="#request.personList.{?#this.age>25}.{name}" var="perspon">
<s:property/>
</s:iterator>
"%"符号的用法
在标签的属性值被理解为字符串类型的时候,告诉执行环境
用法1.
<s:textfield name="xxx" id="xxx" value="%{#request.username}"/>
%{}里的是ognl表达式
备注:因给value引号里边的值 含有井号,解析不出来, 所以用%{} 括起来,告诉编译器,{}里边内容的是ognl表达式。
用法2.
将{}中的内容 加上'',解析成一个字符串
<s:textfield name="xxx" id="xxx" value="%{'#request.username'}"/>
----------------------------------------------
“$”符号的用法
在Struts2配置文件中,使用ognl表达式
-------------------------------------------
OgnlAction中,把"msgxxx_request"这个值放到request作用域里边。
ServletActionContext.getRequest().setAttribute("msgxxx","msgxxx_request");
下边是struts_ognl.xml文件
<package name="ognl" namespace="/ognl" extends="struts-default">
<action name="ognlAction_*" class="cn.itcast.j_ognl.OgnlAction"
method="{1}">
<result name="success">/ognl/ognl.jsp?msg=${#request.msgxxx}</result>
</action>
</package>
-----------------------------------
当跳转到ognl.jsp的时候,要想要获取 "msgxxx_request"这个值,可以通过request得到,
对应的键是"msgxxx"。<s:property value=”#request.msgxxx”>
------------------------------------
我也可以通过msg得到这个值
<result name="success">/ognl/ognl.jsp?msg=${#request.msgxxx}</result>
在配置文件中,先从request作用域中得到这个值,然后在使用msg作为参数名,使用参数传递这个值。可以看出 参数和参数值是放到parameters里边了
就可以这样得到值 <s:property value=”#parameters.msg”>
这个用法,可以解决重定向的问题,这个重定向到一个Action中,request作用域失效,可以在struts.xml文件中再传递一次request.