Struts2中%,#,$的使用

#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分。在这里笔者简单介绍它们的相应用途。

1.#符号的用途一般有三种。

   1)访问非根对象属性,例如示例中的#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext.getContext();#session.msg表达式相当于ActionContext.getContext().getSession().getAttribute(”msg”) 。

    2)用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}。

    3)用来构造Map,例如示例中的#{’foo1′:’bar1′,’foo2′:’bar2′}。

2.%符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:
构造Map
<s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />

<p>The value of key “foo1″ is <s:property value=”#foobar['foo1']”/></p>

<p>不使用%:<s:urlvalue=”#foobar['foo1']” /></p>

<p>使用%:<s:url value=”%{#foobar['foo1']}” /></p>

3.$符号

$符号主要有两个方面的用途。

   在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

    在Struts2框架的配置文件中引用OGNL表达式,例如下面的代码片断所示:

<validators>

    <field name=”intb”>

           <field-validator type=”int”>

           <param name=”min”>10</param>

           <param name=”max”>100</param>

           <message>BAction-test校验:数字必须为${min}为${max}之间!</message>

        </field-validator>

    </field>

</validators>

 

 

Struts2 中#、%和$符号的用途

2010-01-29 16:11

#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分。在这里笔者简单介绍它们的相应用途。

1.#符号的用途一般有三种。
   1)访问非根对象属性,例如示例中的#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute(”msg”) 。

    2)用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}。

    3)用来构造Map,例如示例中的#{’foo1′:’bar1′, ’foo2′:’bar2′}。

2.%符号
%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:
构造Map
<s:set name=”foobar” value=”#{’foo1′:’bar1′, ‘foo2′:’bar2′}” />

<p>The value of key “foo1″ is <s:property value=”#foobar['foo1']” /></p>

<p>不使用%:<s:url value=”#foobar['foo1']” /></p>

<p>使用%:<s:url value=”%{#foobar['foo1']}” /></p>

3.$符号
$符号主要有两个方面的用途。

   在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

    在Struts 2框架的配置文件中引用OGNL表达式,例如下面的代码片断所示:

<validators>

    <field name=”intb”>

            <field-validator type=”int”>

            <param name=”min”>10</param>

            <param name=”max”>100</param>

            <message>BAction-test校验:数字必须为${min}为${max}之间!</message>

        </field-validator>

    </field>

****************************************************************

看了这个之后就试了改为value ="%{#session.username}" 奇怪它就真的成功了~~哈哈~

     访问值栈中Action的普通属性:userName --> <s:property value="userName" /><br />
     访问值栈中Action的对象的普通属性:user.userName | user['userName'] | user[\"userName\"] --> <s:property value="user.userName" /> | <s:property value="user['userName']" /> | <s:property value="user[\"userName\"]" /><br />
     访问值栈中Action的对象的普通属性:user.firend.userName --> <s:property value="user.firend.userName" /><br />
     访问值栈中Action的普通方法:test() --> <s:property value="test()" /><br />
     访问值栈中Action的属性的普通方法:userName.length() --> <s:property value="userName.length()" /><br />
     访问值栈中Action的对象的普通方法:user.hello() --> <s:property value="user.hello()" /><br />

随着注解越来越普遍的使用,struts2也开始支持注解,并宣称支持0配置(XML配置文件),我最近在使用Struts2框架,也顺便了解一了一下Struts2的注解配置.

      1.在Web.xml配置文件中添加

<filter>
<filter-name>struts2</filter-name>
        <filter-class>
                   org.apache.struts2.dispatcher.FilterDispatcher
         </filter-class>
    <init-param>
        <param-name>actionPackages</param-name>
        <param-value>com.learn.action</param-value>
     </init-param>
</filter>
        这样sturts2框架会自动扫描action包中的命名为*Action或者集成ActionSupport的类,例如一个类命名为SearchAction,那么Struts2框架会自动扫描它,认为它为一个Action类,并且将所有search.action的请求都转发给该类进行处理,这时我们又遇到了一个问题,如果这个Action是多Method的Action那么我们又该怎么办呢?因为不能像在XML中那样配置Method属性,这时我们可以在请求是加上!MethodName以请求特定的Method即可,例如想要请求SearchAction的search方法,我们可以直接这样请求:search!search.action.

       以上讲到的是Struts2框架如何找到没有在XML中定义的Action,并且怎么样将请求转发给适当的Action来进行处理.

       我们都知道在XML中可以定义Action处理完以后的跳转,同样利用Annotation也可以做到这一点:

        2.Resules的Annotation定义

        我们只需要在Action Class的类的前面加上@Result即可以定义Action的跳转

        例如:

       

@Results({
   @Result(name="input" value="/input.jsp" type=NullResult.class),
   @Reuslt(name="success" value="/success.jsp" type=NullResult.class),
   @Result(name="error" value="/error.jsp" type=NullResult.class)
})
        上面是一个典型的多Result配置,name属性指定返回的字符串,value指定要跳转的页面,type指定Result的类型,type是一个很重要的属性,他有一下几种情况:

        1)NullResult : 默认的可以省略

        2)ActionChainResult : 用于从一个Action跳转到另外一个Action

        例如:

                   

@Result
(name = "search",value= "search",type=ActionChainResult.class,
params={"method","search"})
        这个配置是如果返回值为"search"就跳转掉SearchAction的search方法,如果不指定params就跳转到SearchAction的execute方法

        3)StreamResult:用于文件下载

        例如:

               

@Result
(name="success",value="inputStream",type=StreamResult.class,
params={"bufferSize",FileConstant.DOWNLOAD_BUFFER_SIZE})
        作为Struts2的Annotation配置中最重要的Result配置大致有这几种情况,关于Struts2 Annotation的其他配置我也不是十分了解,就以后在介绍吧!!!

 

struts中#、%和$这三个符号的使用方法【摘自maxstruts2教程】

2009年09月18日 星期五 10:57

一、"#"的用法
   1、 访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:

        parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id")

       request 包含当前HttpServletRequest的属性(attribute)的Map #request.userName相当于request.getAttribute("userName")

       session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute("userName")

       application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute("userName")

       attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止

     2、用于过滤和投影(projecting)集合,如books.{?#this.price<100};

     3、构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。

二、"%"的用法

    “%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码:

    <h3>%的用途</h3>
    <p><s:url value="#foobar['foo1']" /></p>
    <p><s:url value="%{#foobar['foo1']}" /></p>

三、"$"的用法

    1、用于在国际化资源文件中,引用OGNL表达式

    2、在Struts 2配置文件中,引用OGNL表达式

     例如:
         <action name="AddPhoto" class="addPhoto">
            <interceptor-ref name="fileUploadStack" />           
            <result type="redirect">ListPhotos.action?       albumId=${albumId}</result>
        </action>

 

Session中的值

<c:outvalue="${sessionScope.user.userId}"></c:out><br>  

<c:outvalue="${user.userLoginName}"></c:out><br>    

<s:propertyvalue="#session.user.userId"/><br>  

${session.user.userId}<br>  

${sessionScope.user.userId}<br>    

基本语法

一、EL简介
1.
语法结构
    ${expression_r}
2.[]
.运算符
    EL
提供.[]两种运算符来存取数据。
   
当要存取的属性名称中包含一些特殊字符,如.?等并非字母或数字的符号,就一定要使用 []。例如:
        ${user.My-Name}
应当改为${user["My-Name"] }
   
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
        ${sessionScope.user[data]}
data 是一个变量
3.
变量
    EL
存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
   
因为我们并没有指定哪一个范围的username,所以它会依序从PageRequestSessionApplication范围查找。
   
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null
   
属性范围在EL中的名称
       Page         PageScope
       Request         RequestScope
       Session         SessionScope
        Application    ApplicationScope
       
二、EL隐含对象
1.
与范围有关的隐含对象
与范围有关的EL 隐含对象包含以下四个:pageScoperequestScopesessionScope applicationScope
它们基本上就和JSPpageContextrequestsessionapplication一样;
EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(Stringname),却不能取得其他相关信息。

例如:我们要取得session中储存一个属性username的值,可以利用下列方法:
    session.getAttribute("username")
取得username的值,
EL中则使用下列方法
    ${sessionScope.username}

2.与输入有关的隐含对象
与输入有关的隐含对象有两个:paramparamValues,它们是EL中比较特别的隐含对象。

例如我们要取得用户的请求参数时,可以利用下列方法:
    request.getParameter(String name)
    request.getParameterValues(String name)
EL中则可以使用paramparamValues两者来取得数据。
    ${param.name}
    ${paramValues.name}

3.其他隐含对象

cookie
JSTL
并没有提供设定cookie的动作,
例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。

headerheaderValues
header
储存用户浏览器和服务端用来沟通的数据
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}
另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。

initParam
initParam
取得设定web站点的环境参数(Context)
例:一般的方法String userid =(String)application.getInitParameter("userid");
   
可以使用${initParam.userid}来取得名称为userid

pageContext
pageContext
取得其他有关用户要求或页面的详细信息。
   ${pageContext.request.queryString}        
取得请求的参数字符串
   ${pageContext.request.requestURL}        
取得请求的URL,但不包括请求之参数字符串
   ${pageContext.request.contextPath}        
服务的web application 的名称
   ${pageContext.request.method}          
取得HTTP 的方法(GETPOST)
   ${pageContext.request.protocol}        
取得使用的协议(HTTP/1.1HTTP/1.0)
   ${pageContext.request.remoteUser}        
取得用户名称
    ${pageContext.request.remoteAddr}        
取得用户的IP 地址
   ${pageContext.session.new}            
判断session 是否为新的
   ${pageContext.session.id}              
取得session ID
    ${pageContext.servletContext.serverInfo}  
取得主机端的服务信息

三、EL运算符
1.
算术运算符有五个:+-*$/div%mod
2.
关系运算符有六个:==eq!=ne<lt>gt<=le>=ge
3.
逻辑运算符有三个:&&and||or!not
4.
其它运算符有三个:Empty运算符、条件运算符、()运算符
   
例:${empty param.name}${A?B:C}${A*(B+C)}

四、EL函数(functions)
语法:ns:function( arg1, arg2, arg3 …. argN)
其中ns为前置名称(prefix),它必须和taglib 指令的前置名称一置

---------------------------------------------

补充:

<%@ taglibprefix="c" uri="http://java.sun.com/jstl/core_rt"%>

FOREACH:

<c:forEachitems="${messages}"
var="item"
begin="0"
end="9"
step="1"
varStatus="var">
……
</c:forEach>

 


OUT:

<c:outvalue="${logininfo.username}"/>
c:out>
value 中的内容输出到当前位置,这里也就是把logininfo 对象的
username
属性值输出到页面当前位置。
${……}
JSP2.0 中的Expression LanguageEL)的语法。它定义了一个表达式,
其中的表达式可以是一个常量(如上),也可以是一个具体的表达语句(如forEach循环体中
的情况)。典型案例如下:
? ${logininfo.username}
这表明引用logininfo 对象的username 属性。我们可以通过“.”操作符引
用对象的属性,也可以用“[]”引用对象属性,如${logininfo[username]}
${logininfo.username}达到了同样的效果。
“[]”
引用方式的意义在于,如果属性名中出现了特殊字符,如“.”或者“-”
此时就必须使用“[]”获取属性值以避免语法上的冲突(系统开发时应尽量避免
这一现象的出现)。
与之等同的JSP Script大致如下:
LoginInfo logininfo =
(LoginInfo)session.getAttribute(“logininfo”);
String username = logininfo.getUsername();
可以看到,EL大大节省了编码量。
这里引出的另外一个问题就是,EL 将从哪里找到logininfo 对象,对于
${logininfo.username}
这样的表达式而言,首先会从当前页面中寻找之前是
否定义了变量logininfo,如果没有找到则依次到RequestSession
Application
范围内寻找,直到找到为止。如果直到最后依然没有找到匹配的
变量,则返回null.
如果我们需要指定变量的寻找范围,可以在EL表达式中指定搜寻范围:
${pageScope.logininfo.username}
${requestScope.logininfo.username}
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
Spring 中,所有逻辑处理单元返回的结果数据,都将作为Attribute 被放
置到HttpServletRequest 对象中返回(具体实现可参见Spring 源码中
org.springframework.web.servlet.view.InternalResourceView.
exposeModelAsRequestAttributes
方法的实现代码),也就是说Spring
MVC
中,结果数据对象默认都是requestScope。因此,在Spring MVC 中,
以下寻址方法应慎用:
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
? ${1
2}
结果为表达式计算结果,即整数值3
? ${i>1}
如果变量值i>1的话,将返回bool类型true。与上例比较,可以发现EL会自
动根据表达式计算结果返回不同的数据类型。
表达式的写法与java代码中的表达式编写方式大致相同。

 

IF / CHOOSE:

<c:iftest="${var.index % 2 == 0}">
*
</c:if>
判定条件一般为一个EL表达式。
<c:if>
并没有提供else子句,使用的时候可能有些不便,此时我们可以通过<c:choose>
tag
来达到类似的目的:
<c:choose>
<c:when test="${var.index % 2 == 0}">
*
</c:when>
<c:otherwise>
!
</c:otherwise>
</c:choose>
类似Java 中的switch 语句,<c:choose>提供了复杂判定条件下的简化处理手法。其
<c:when>子句类似case子句,可以出现多次。上面的代码,在奇数行时输出“*”号,
而偶数行时输出“!”
---------------------------------------------

再补充:

1   EL表达式用${}表示,可用在所有的HTMLJSP标签中作用是代替JSP页面中复杂的JAVA代码.

       2   EL表达式可操作常量变量和隐式对象. 最常用的隐式对象有${param}${paramValues}.${param}表示返回请求参数中单个字符串的值. ${paramValues}表示返回请求参数的一组值.pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话范围内的变量.applicationScope表示应用范围的变量.

       3   <%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言.

       4   EL语言可显示逻辑表达式如${true and false}结果是false    关系表达式如${5>6} 结果是false     算术表达式如 ${5+5} 结果是10

       5   EL中的变量搜索范围是:page requestsession application   点运算符(.)"[ ]"都是表示获取变量的值.区别是[ ]可以显示非词类的变量

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值