问题一:#,%{},$符号 java
在Struts2标签属性中常常会出现"#"或者"%{}"的符号出现,经过上面OGNL表达式基础的介绍,知道了OGNL上下文中有且仅有一个根对象。Struts2为咱们定义了许多明明对象,他们分别是"ValueStack","Parameters","Session","Request", "Appliction","Attr",其中"ValueStack"被设置为上下文的根对象。访问非根对象必须加上"#"号,这就是出现"#"的缘由。Struts2中的标的处理类,并非全部都将标签的属性做为OGNL表达式来看待,有时候咱们须要设置动态地值,则必须告诉标签的处理类该字符串按照OGNL表达式来处理,%{}符号的做用就是告诉标签的处理类将它包含的字符串按照OGNL表达式处理。 "$"符号用于XML文件中用于获取动态值,与%{}做用相似。 express
问题二:%{}符号的影响 lua
Struts2的标签有不少,要记住哪个标签的处理类将标签的属性做为OGNL表达式是一件很困难的事情,在不清楚处理类的处理方式时怎么办,%{}对于标签处理类来讲,若处理类将属性值做为普通字符串则%{}符号包含的字符串当作OGNL表达式,若处理类将属性值做为OGNL表达式来处理,则直接忽略%{}符号。换句话说,不清楚处理方式的话,能够都使用%{}符号。 spa
问题三:标签是如何得到数据 code
下面是ValueStack的官方描述: 对象
ValueStack allows multiple beans to be pushed in and dynamic EL expressions to be evaluated against it. When evaluating an expression, the stack will be searched down the stack, from the latest objects pushed in to the earliest, looking for a bean with a getter or setter for the given property or a method of the given name (depending on the expression being evaluated). ip
大体意思:ValueStack容许保存多个bean(也就是Action),而且可使用表达式语言得到他们。当评估一个表达式,ValueStack将会从栈顶到栈底的方向被搜索一遍,对于给定的属性名称寻找bean的getter或setter方法或寻找给定的方法。 字符串
每当一个请求到达Action时,Struts2会将Action对象推入ValueStack中。 get
<body> username:<s:property value="username"/><br/> username:<%=((HelloWorldAction)ActionContext.getContext().getValueStack().peek()).getUsername() %><br/> </body>
页面显示结果: it
username:zhangsan username:zhangsan
能够看到标签取值与用Java代码取值的结果相同,明显标签的取值方式更简练简洁。OGNL表达式"username"表示了从根对象ValueStack中取出属性username的值。它会从栈顶到栈底遍历ValueStack,直到找某一个Action中的"username"属性。